Files
zulip/static/js/bot_data.js
Steve Howell 5c16bb9c99 bot settings: Load bots independently.
We no longer use `/json/users` in the codepath
for bot settings (admin side).

We also specifically don't load human users when
we load bots, so you no longer have to pay for
the server round trip as a side effect of loading
bots.  Instead, there is a dedicated `set_up_bots`
entry point.

We also get the bot ids directly from `bot_data` now.

This commit, to some degree, builds on the prior commit
that had us hydrate data from `people.js` instead
of the payload from `/json/users`.
2020-05-11 16:16:58 -07:00

103 lines
2.4 KiB
JavaScript

const bots = new Map();
const bot_fields = [
'api_key',
'avatar_url',
'bot_type',
'default_all_public_streams',
'default_events_register_stream',
'default_sending_stream',
'email',
'full_name',
'is_active',
'owner', // TODO: eliminate
'owner_id',
'user_id',
];
const services = new Map();
const services_fields = ['base_url', 'interface',
'config_data', 'service_name', 'token'];
const send_change_event = _.debounce(function () {
settings_bots.render_bots();
}, 50);
exports.all_user_ids = function () {
return Array.from(bots.keys());
};
exports.add = function (bot) {
const clean_bot = _.pick(bot, bot_fields);
bots.set(bot.user_id, clean_bot);
const clean_services = bot.services.map(service => _.pick(service, services_fields));
services.set(bot.user_id, clean_services);
send_change_event();
};
exports.deactivate = function (bot_id) {
bots.get(bot_id).is_active = false;
send_change_event();
};
exports.del = function (bot_id) {
bots.delete(bot_id);
services.delete(bot_id);
send_change_event();
};
exports.update = function (bot_id, bot_update) {
const bot = bots.get(bot_id);
Object.assign(bot, _.pick(bot_update, bot_fields));
// We currently only support one service per bot.
const service = services.get(bot_id)[0];
if (typeof bot_update.services !== 'undefined' && bot_update.services.length > 0) {
Object.assign(service, _.pick(bot_update.services[0], services_fields));
}
// TODO: eliminate `owner` (which is an email)
if (bot.owner_id) {
const bot_owner = people.get_by_user_id(bot.owner_id);
bot.owner = bot_owner.email;
}
send_change_event();
};
exports.get_all_bots_for_current_user = function () {
const ret = [];
for (const bot of bots.values()) {
if (people.is_current_user(bot.owner)) {
ret.push(bot);
}
}
return ret;
};
exports.get_editable = function () {
const ret = [];
for (const bot of bots.values()) {
if (bot.is_active && people.is_current_user(bot.owner)) {
ret.push(bot);
}
}
return ret;
};
exports.get = function (bot_id) {
return bots.get(bot_id);
};
exports.get_services = function (bot_id) {
return services.get(bot_id);
};
exports.initialize = function (params) {
for (const bot of params.realm_bots) {
exports.add(bot);
}
};
window.bot_data = exports;