Files
zulip/static/js/bot_data.js
Steve Howell 72e0f2e901 bots: Lift render_bots calls to dispatcher code.
This is mostly a refactoring to break the unnecessary
dependency of bot_data on settings_bots.

This is a bit more than a refactoring, as I remove all
the debounced calls to render bots during the
initialization of bot_data. (The debouncing probably
meant we only rendered once, but it was still needless
work.)

We don't need to explicitly render bots during
bot_data.initialize(), which you can verify by loading
"#settings/your-bots" as the home page. It was just an
artifact of how add() was implemented.

Note that for the **admin** screen, we did not and
still do not do live updates for add/remove; we only do
it for updates. Fixing that is out of the scope of this
change. The code that was moved here affects
**personal** bot settings.

Note that the debounce code is quite fragile. See my
code comment that explains it. I don't have time to go
down the rabbit hole of a deep fix here. The puppeteer
tests would fail without the debounce, even though I
was able to eliminate the debounce in an earlier
version of this fix and see good results during manual
testing. (My testing may have just been on the "lucky"
side of the race.) I created #17743 to address this
problem.
2021-03-22 19:40:06 -07:00

90 lines
2.1 KiB
JavaScript

import _ from "lodash";
import * as people from "./people";
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"];
export function all_user_ids() {
return Array.from(bots.keys());
}
export function add(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);
}
export function deactivate(bot_id) {
bots.get(bot_id).is_active = false;
}
export function del(bot_id) {
bots.delete(bot_id);
services.delete(bot_id);
}
export function update(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));
}
}
export function get_all_bots_for_current_user() {
const ret = [];
for (const bot of bots.values()) {
if (people.is_my_user_id(bot.owner_id)) {
ret.push(bot);
}
}
return ret;
}
export function get_editable() {
const ret = [];
for (const bot of bots.values()) {
if (bot.is_active && people.is_my_user_id(bot.owner_id)) {
ret.push(bot);
}
}
return ret;
}
export function get(bot_id) {
return bots.get(bot_id);
}
export function get_services(bot_id) {
return services.get(bot_id);
}
export function initialize(params) {
bots.clear();
for (const bot of params.realm_bots) {
add(bot);
}
}