From c467a740db824528e1fe97db8b68c7c40d5449cd Mon Sep 17 00:00:00 2001 From: Dragory <2606411+Dragory@users.noreply.github.com> Date: Wed, 22 Jul 2020 22:25:50 +0300 Subject: [PATCH] Port GuildConfigReloader plugin --- .../GuildConfigReloaderPlugin.ts | 18 ++++++++++++++ .../functions/reloadChangedGuilds.ts | 24 +++++++++++++++++++ .../src/plugins/GuildConfigReloader/types.ts | 18 ++++++++++++++ backend/src/plugins/availablePlugins.ts | 6 ++++- 4 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 backend/src/plugins/GuildConfigReloader/GuildConfigReloaderPlugin.ts create mode 100644 backend/src/plugins/GuildConfigReloader/functions/reloadChangedGuilds.ts create mode 100644 backend/src/plugins/GuildConfigReloader/types.ts diff --git a/backend/src/plugins/GuildConfigReloader/GuildConfigReloaderPlugin.ts b/backend/src/plugins/GuildConfigReloader/GuildConfigReloaderPlugin.ts new file mode 100644 index 00000000..3265090b --- /dev/null +++ b/backend/src/plugins/GuildConfigReloader/GuildConfigReloaderPlugin.ts @@ -0,0 +1,18 @@ +import { zeppelinPlugin } from "../ZeppelinPluginBlueprint"; +import { GuildConfigReloaderPluginType } from "./types"; +import { Configs } from "../../data/Configs"; +import { reloadChangedGuilds } from "./functions/reloadChangedGuilds"; + +export const GuildConfigReloaderPlugin = zeppelinPlugin()("guild_config_reloader", { + async onLoad(pluginData) { + pluginData.state.guildConfigs = new Configs(); + pluginData.state.highestConfigId = await pluginData.state.guildConfigs.getHighestId(); + + reloadChangedGuilds(pluginData); + }, + + onUnload(pluginData) { + clearTimeout(pluginData.state.nextCheckTimeout); + pluginData.state.unloaded = true; + }, +}); diff --git a/backend/src/plugins/GuildConfigReloader/functions/reloadChangedGuilds.ts b/backend/src/plugins/GuildConfigReloader/functions/reloadChangedGuilds.ts new file mode 100644 index 00000000..d858ef72 --- /dev/null +++ b/backend/src/plugins/GuildConfigReloader/functions/reloadChangedGuilds.ts @@ -0,0 +1,24 @@ +import { PluginData } from "knub"; +import { GuildConfigReloaderPluginType } from "../types"; +import { SECONDS } from "../../../utils"; + +const CHECK_INTERVAL = 1 * SECONDS; + +export async function reloadChangedGuilds(pluginData: PluginData) { + if (pluginData.state.unloaded) return; + + const changedConfigs = await pluginData.state.guildConfigs.getActiveLargerThanId(pluginData.state.highestConfigId); + for (const item of changedConfigs) { + if (!item.key.startsWith("guild-")) continue; + + const guildId = item.key.slice("guild-".length); + console.log(`Config changed, reloading guild ${guildId}`); + await pluginData.getKnubInstance().reloadGuild(guildId); + + if (item.id > pluginData.state.highestConfigId) { + pluginData.state.highestConfigId = item.id; + } + } + + pluginData.state.nextCheckTimeout = setTimeout(() => reloadChangedGuilds(pluginData), CHECK_INTERVAL); +} diff --git a/backend/src/plugins/GuildConfigReloader/types.ts b/backend/src/plugins/GuildConfigReloader/types.ts new file mode 100644 index 00000000..fd6ce95a --- /dev/null +++ b/backend/src/plugins/GuildConfigReloader/types.ts @@ -0,0 +1,18 @@ +import { BasePluginType } from "knub"; +import { GuildMutes } from "../../data/GuildMutes"; +import { GuildCases } from "../../data/GuildCases"; +import { GuildLogs } from "../../data/GuildLogs"; +import { GuildArchives } from "../../data/GuildArchives"; +import { TConfigSchema } from "../Mutes/types"; +import { Configs } from "../../data/Configs"; +import Timeout = NodeJS.Timeout; + +export interface GuildConfigReloaderPluginType extends BasePluginType { + config: TConfigSchema; + state: { + guildConfigs: Configs; + unloaded: boolean; + highestConfigId: number; + nextCheckTimeout: Timeout; + }; +} diff --git a/backend/src/plugins/availablePlugins.ts b/backend/src/plugins/availablePlugins.ts index b8e1b819..adaf28f4 100644 --- a/backend/src/plugins/availablePlugins.ts +++ b/backend/src/plugins/availablePlugins.ts @@ -9,6 +9,7 @@ import { RemindersPlugin } from "./Reminders/RemindersPlugin"; import { UsernameSaverPlugin } from "./UsernameSaver/UsernameSaverPlugin"; import { WelcomeMessagePlugin } from "./WelcomeMessage/WelcomeMessagePlugin"; import { PingableRolesPlugin } from "./PingableRoles/PingableRolesPlugin"; +import { GuildConfigReloaderPlugin } from "./GuildConfigReloader/GuildConfigReloaderPlugin"; // prettier-ignore export const guildPlugins: Array> = [ @@ -24,4 +25,7 @@ export const guildPlugins: Array> = [ WelcomeMessagePlugin, ]; -export const globalPlugins = []; +// prettier-ignore +export const globalPlugins = [ + GuildConfigReloaderPlugin, +];