mirror of
https://github.com/zulip/zulip.git
synced 2025-11-06 15:03:34 +00:00
Warn inside these functions when you get data on streams that you are not subscribed to: add_subscriber remove_subscriber user_is_subscribed The back end should be smart enough not to spam us with subscriber info that we don't care about. (imported from commit b27644be2abc37c11ddff884ef392ea208bd1bd3)
152 lines
4.6 KiB
JavaScript
152 lines
4.6 KiB
JavaScript
var stream_data = (function () {
|
|
|
|
var exports = {};
|
|
|
|
|
|
// The stream_info variable maps stream names to stream properties objects
|
|
// Call clear_subscriptions() to initialize it.
|
|
var stream_info;
|
|
|
|
exports.clear_subscriptions = function () {
|
|
stream_info = new Dict({fold_case: true});
|
|
};
|
|
exports.clear_subscriptions();
|
|
|
|
|
|
exports.add_sub = function (stream_name, sub) {
|
|
stream_info.set(stream_name, sub);
|
|
};
|
|
|
|
exports.get_sub = function (stream_name) {
|
|
return stream_info.get(stream_name);
|
|
};
|
|
|
|
exports.delete_sub = function (stream_name) {
|
|
stream_info.del(stream_name);
|
|
};
|
|
|
|
exports.set_stream_info = function (new_stream_info) {
|
|
stream_info = new_stream_info;
|
|
};
|
|
|
|
exports.get_stream_info = function () {
|
|
return stream_info;
|
|
};
|
|
|
|
// List subscribed streams.
|
|
// Internal version returns the full stream info object for each stream.
|
|
function subscribed_streams() {
|
|
return _.where(stream_info.values(), {subscribed: true});
|
|
}
|
|
|
|
exports.subscribed_streams = function () {
|
|
return _.pluck(subscribed_streams(), 'name');
|
|
};
|
|
|
|
exports.get_colors = function () {
|
|
return _.pluck(subscribed_streams(), 'color');
|
|
};
|
|
|
|
exports.all_subscribed_streams_are_in_home_view = function () {
|
|
return _.every(subscribed_streams(), function (sub) {
|
|
return sub.in_home_view; }
|
|
);
|
|
};
|
|
|
|
exports.canonicalized_name = function (stream_name) {
|
|
return stream_name.toString().toLowerCase();
|
|
};
|
|
|
|
exports.get_color = function (stream_name) {
|
|
var sub = exports.get_sub(stream_name);
|
|
if (sub === undefined) {
|
|
return stream_color.default_color;
|
|
}
|
|
return sub.color;
|
|
};
|
|
|
|
exports.in_home_view = function (stream_name) {
|
|
var sub = exports.get_sub(stream_name);
|
|
return sub !== undefined && sub.in_home_view;
|
|
};
|
|
|
|
exports.is_subscribed = function (stream_name) {
|
|
var sub = exports.get_sub(stream_name);
|
|
return sub !== undefined && sub.subscribed;
|
|
};
|
|
|
|
exports.get_invite_only = function (stream_name) {
|
|
var sub = exports.get_sub(stream_name);
|
|
if (sub === undefined) {
|
|
return false;
|
|
}
|
|
return sub.invite_only;
|
|
};
|
|
|
|
exports.get_name = function (stream_name) {
|
|
// This returns the actual name of a stream if we are subscribed to
|
|
// it (i.e "Denmark" vs. "denmark"), while falling thru to
|
|
// stream_name if we don't have a subscription. (Stream names
|
|
// are case-insensitive, but we try to display the actual name
|
|
// when we know it.)
|
|
var sub = exports.get_sub(stream_name);
|
|
if (sub === undefined) {
|
|
return stream_name;
|
|
}
|
|
return sub.name;
|
|
};
|
|
|
|
exports.set_subscribers = function (sub, emails) {
|
|
sub.subscribers = Dict.from_array(emails || [], {fold_case: true});
|
|
};
|
|
|
|
// NOTE: If you do anything with the `subscribers` attribute on the stream
|
|
// properties object, first make sure `is_subscribed` is true (i.e., the local
|
|
// user is subscribed). Otherwise we don't and can't update the subscribers
|
|
// list.
|
|
//
|
|
// The accessor functions below know to check for that case.
|
|
|
|
exports.add_subscriber = function (stream_name, user_email) {
|
|
var sub = exports.get_sub(stream_name);
|
|
if (typeof sub === 'undefined' || !sub.subscribed) {
|
|
// If we're not subscribed, we don't track this, and shouldn't
|
|
// get these events. Likewise, if we don't know about the stream,
|
|
// we don't want to track this.
|
|
blueslip.warning("We got an add_subscriber call for a non-existent or unsubscribed stream.");
|
|
return;
|
|
}
|
|
sub.subscribers.set(user_email, true);
|
|
};
|
|
|
|
exports.remove_subscriber = function (stream_name, user_email) {
|
|
var sub = exports.get_sub(stream_name);
|
|
if (typeof sub === 'undefined' || !sub.subscribed) {
|
|
// If we're not subscribed, we don't track this, and shouldn't
|
|
// get these events. Likewise, if we don't know about the stream,
|
|
// we don't want to track this.
|
|
blueslip.warning("We got a remove_subscriber call for a non-existent or unsubscribed stream.");
|
|
return;
|
|
}
|
|
sub.subscribers.del(user_email);
|
|
};
|
|
|
|
exports.user_is_subscribed = function (stream_name, user_email) {
|
|
var sub = exports.get_sub(stream_name);
|
|
if (typeof sub === 'undefined' || !sub.subscribed) {
|
|
// If we don't know about the stream, or we ourselves are not
|
|
// subscribed, we can't keep track of the subscriber list in general,
|
|
// so we return undefined (treated as falsy if not explicitly handled).
|
|
blueslip.warning("We got a user_is_subscribed call for a non-existent or unsubscribed stream.");
|
|
return undefined;
|
|
}
|
|
return sub.subscribers.has(user_email);
|
|
};
|
|
|
|
return exports;
|
|
|
|
}());
|
|
if (typeof module !== 'undefined') {
|
|
module.exports = stream_data;
|
|
}
|