mirror of
https://github.com/zulip/zulip.git
synced 2025-11-04 14:03:30 +00:00
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.
90 lines
2.1 KiB
JavaScript
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);
|
|
}
|
|
}
|