diff --git a/backend/src/api/docs.ts b/backend/src/api/docs.ts index 8bc1b049..8ab31abf 100644 --- a/backend/src/api/docs.ts +++ b/backend/src/api/docs.ts @@ -1,9 +1,9 @@ import express from "express"; import z from "zod"; -import { guildPlugins } from "../plugins/availablePlugins.js"; -import { guildPluginInfo } from "../plugins/pluginInfo.js"; import { indentLines } from "../utils.js"; import { notFound } from "./responses.js"; +import { availableGuildPlugins } from "../plugins/availablePlugins.js"; +import { ZeppelinGuildPluginInfo } from "../types.js"; function isZodObject(schema: z.ZodTypeAny): schema is z.ZodObject { return schema._def.typeName === "ZodObject"; @@ -97,34 +97,34 @@ function formatZodConfigSchema(schema: z.ZodTypeAny) { return "unknown"; } +const availableGuildPluginsByName = availableGuildPlugins.reduce>((map, obj) => { + map[obj.plugin.name] = obj; + return map; +}, {}); + export function initDocs(router: express.Router) { - const docsPluginNames = Object.keys(guildPluginInfo).filter((k) => guildPluginInfo[k].type === "stable" || guildPluginInfo[k].type === "legacy"); + const docsPlugins = availableGuildPlugins.filter(obj => obj.docs.type !== "internal"); router.get("/docs/plugins", (req: express.Request, res: express.Response) => { - res.json( - docsPluginNames.map((pluginName) => { - const info = guildPluginInfo[pluginName]!; - const thinInfo = { prettyName: info.prettyName, type: info.type }; - return { - name: pluginName, - info: thinInfo, - }; - }), - ); + res.json(docsPlugins.map(obj => ({ + name: obj.plugin.name, + info: { + prettyName: obj.docs.prettyName, + type: obj.docs.type, + }, + }))); }); router.get("/docs/plugins/:pluginName", (req: express.Request, res: express.Response) => { - const name = req.params.pluginName; - const baseInfo = guildPluginInfo[name]; - if (!baseInfo) { + const pluginInfo = availableGuildPluginsByName[req.params.pluginName]; + if (!pluginInfo) { return notFound(res); } - const plugin = guildPlugins.find((p) => p.name === name)!; - const { configSchema, ...info } = baseInfo; + const { configSchema, ...info } = pluginInfo.docs; const formattedConfigSchema = formatZodConfigSchema(configSchema); - const messageCommands = (plugin.messageCommands || []).map((cmd) => ({ + const messageCommands = (pluginInfo.plugin.messageCommands || []).map((cmd) => ({ trigger: cmd.trigger, permission: cmd.permission, signature: cmd.signature, @@ -133,10 +133,10 @@ export function initDocs(router: express.Router) { config: cmd.config, })); - const defaultOptions = plugin.defaultOptions || {}; + const defaultOptions = pluginInfo.plugin.defaultOptions || {}; res.json({ - name, + name: pluginInfo.plugin.name, info, configSchema: formattedConfigSchema, defaultOptions, diff --git a/backend/src/exportSchemas.ts b/backend/src/exportSchemas.ts index 7298ff13..6608d5cd 100644 --- a/backend/src/exportSchemas.ts +++ b/backend/src/exportSchemas.ts @@ -1,12 +1,10 @@ import { z } from "zod"; import { zodToJsonSchema } from "zod-to-json-schema"; -import { guildPluginInfo } from "./plugins/pluginInfo.js"; import { zZeppelinGuildConfig } from "./types.js"; +import { availableGuildPlugins } from "./plugins/availablePlugins.js"; -const pluginSchemaMap = Object.entries(guildPluginInfo).reduce((map, [pluginName, pluginInfo]) => { - if (pluginInfo.configSchema) { - map[pluginName] = pluginInfo.configSchema; - } +const pluginSchemaMap = availableGuildPlugins.reduce((map, pluginInfo) => { + map[pluginInfo.plugin.name] = pluginInfo.docs.configSchema; return map; }, {}); diff --git a/backend/src/index.ts b/backend/src/index.ts index 10c19612..06fc7cf6 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -40,7 +40,7 @@ import { runUpcomingScheduledPostsLoop } from "./data/loops/upcomingScheduledPos import { consumeQueryStats } from "./data/queryLogger.js"; import { env } from "./env.js"; import { logger } from "./logger.js"; -import { baseGuildPlugins, globalPlugins, guildPlugins } from "./plugins/availablePlugins.js"; +import { availableGuildPlugins, availableGlobalPlugins } from "./plugins/availablePlugins.js"; import { setProfiler } from "./profiler.js"; import { logRateLimit } from "./rateLimitStats.js"; import { startUptimeCounter } from "./uptime.js"; @@ -245,6 +245,7 @@ connect().then(async () => { ], }); // FIXME: TS doesn't see Client as a child of EventEmitter for some reason + // If you're here because of an error from TS 5.5.2, see https://github.com/discordjs/discord.js/issues/10358 (client as unknown as EventEmitter).setMaxListeners(200); const safe429DecayInterval = 5 * SECONDS; @@ -274,8 +275,8 @@ connect().then(async () => { const guildConfigs = new Configs(); const bot = new Knub(client, { - guildPlugins, - globalPlugins, + guildPlugins: availableGuildPlugins.map(obj => obj.plugin), + globalPlugins: availableGlobalPlugins.map(obj => obj.plugin), options: { canLoadGuild(guildId): Promise { @@ -284,7 +285,7 @@ connect().then(async () => { /** * Plugins are enabled if they... - * - are base plugins, i.e. always enabled, or + * - are marked to be autoloaded, or * - are explicitly enabled in the guild config * Dependencies are also automatically loaded by Knub. */ @@ -294,10 +295,10 @@ connect().then(async () => { } const configuredPlugins = ctx.config.plugins; - const basePluginNames = baseGuildPlugins.map((p) => p.name); + const autoloadPluginNames = availableGuildPlugins.filter(obj => obj.autoload).map(obj => obj.plugin.name); return Array.from(plugins.keys()).filter((pluginName) => { - if (basePluginNames.includes(pluginName)) return true; + if (autoloadPluginNames.includes(pluginName)) return true; return configuredPlugins[pluginName] && (configuredPlugins[pluginName] as any).enabled !== false; }); }, diff --git a/backend/src/plugins/AutoDelete/info.ts b/backend/src/plugins/AutoDelete/docs.ts similarity index 72% rename from backend/src/plugins/AutoDelete/info.ts rename to backend/src/plugins/AutoDelete/docs.ts index 36c95fd5..fb661019 100644 --- a/backend/src/plugins/AutoDelete/info.ts +++ b/backend/src/plugins/AutoDelete/docs.ts @@ -1,10 +1,11 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { zAutoDeleteConfig } from "./types.js"; -export const autoDeletePluginInfo: ZeppelinPluginInfo = { +export const autoDeletePluginDocs: ZeppelinPluginDocs = { type: "stable", + configSchema: zAutoDeleteConfig, + prettyName: "Auto-delete", description: "Allows Zeppelin to auto-delete messages from a channel after a delay", configurationGuide: "Maximum deletion delay is currently 5 minutes", - configSchema: zAutoDeleteConfig, }; diff --git a/backend/src/plugins/AutoReactions/AutoReactionsPlugin.ts b/backend/src/plugins/AutoReactions/AutoReactionsPlugin.ts index 6c03d640..36e1c0c4 100644 --- a/backend/src/plugins/AutoReactions/AutoReactionsPlugin.ts +++ b/backend/src/plugins/AutoReactions/AutoReactionsPlugin.ts @@ -6,6 +6,7 @@ import { DisableAutoReactionsCmd } from "./commands/DisableAutoReactionsCmd.js"; import { NewAutoReactionsCmd } from "./commands/NewAutoReactionsCmd.js"; import { AddReactionsEvt } from "./events/AddReactionsEvt.js"; import { AutoReactionsPluginType, zAutoReactionsConfig } from "./types.js"; +import { autoReactionsPluginDocs } from "./docs.js"; const defaultOptions: PluginOptions = { config: { diff --git a/backend/src/plugins/AutoReactions/info.ts b/backend/src/plugins/AutoReactions/docs.ts similarity index 73% rename from backend/src/plugins/AutoReactions/info.ts rename to backend/src/plugins/AutoReactions/docs.ts index 60ff9504..8d81e060 100644 --- a/backend/src/plugins/AutoReactions/info.ts +++ b/backend/src/plugins/AutoReactions/docs.ts @@ -1,12 +1,13 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { trimPluginDescription } from "../../utils.js"; import { zAutoReactionsConfig } from "./types.js"; -export const autoReactionsInfo: ZeppelinPluginInfo = { +export const autoReactionsPluginDocs: ZeppelinPluginDocs = { type: "stable", + configSchema: zAutoReactionsConfig, + prettyName: "Auto-reactions", description: trimPluginDescription(` Allows setting up automatic reactions to all new messages on a channel `), - configSchema: zAutoReactionsConfig, }; diff --git a/backend/src/plugins/Automod/AutomodPlugin.ts b/backend/src/plugins/Automod/AutomodPlugin.ts index 873f10fe..43961c67 100644 --- a/backend/src/plugins/Automod/AutomodPlugin.ts +++ b/backend/src/plugins/Automod/AutomodPlugin.ts @@ -32,6 +32,7 @@ import { clearOldRecentNicknameChanges } from "./functions/clearOldNicknameChang import { clearOldRecentActions } from "./functions/clearOldRecentActions.js"; import { clearOldRecentSpam } from "./functions/clearOldRecentSpam.js"; import { AutomodPluginType, zAutomodConfig } from "./types.js"; +import { automodPluginDocs } from "./docs.js"; const defaultOptions = { config: { diff --git a/backend/src/plugins/Automod/info.ts b/backend/src/plugins/Automod/docs.ts similarity index 96% rename from backend/src/plugins/Automod/info.ts rename to backend/src/plugins/Automod/docs.ts index 8d83e23b..0ba0ab38 100644 --- a/backend/src/plugins/Automod/info.ts +++ b/backend/src/plugins/Automod/docs.ts @@ -1,11 +1,12 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { trimPluginDescription } from "../../utils.js"; import { zAutomodConfig } from "./types.js"; -export const automodPluginInfo: ZeppelinPluginInfo = { +export const automodPluginDocs: ZeppelinPluginDocs = { type: "stable", - prettyName: "Automod", configSchema: zAutomodConfig, + + prettyName: "Automod", description: trimPluginDescription(` Allows specifying automated actions in response to triggers. Example use cases include word filtering and spam prevention. `), diff --git a/backend/src/plugins/BotControl/docs.ts b/backend/src/plugins/BotControl/docs.ts new file mode 100644 index 00000000..d36ad42e --- /dev/null +++ b/backend/src/plugins/BotControl/docs.ts @@ -0,0 +1,13 @@ +import { ZeppelinPluginDocs } from "../../types.js"; +import { trimPluginDescription } from "../../utils.js"; +import { zBotControlConfig } from "./types.js"; + +export const botControlPluginDocs: ZeppelinPluginDocs = { + type: "stable", + configSchema: zBotControlConfig, + + prettyName: "Bot control", + description: trimPluginDescription(` + Contains commands to manage allowed servers + `), +}; diff --git a/backend/src/plugins/Cases/CasesPlugin.ts b/backend/src/plugins/Cases/CasesPlugin.ts index 8e5e66f3..d1a04a8c 100644 --- a/backend/src/plugins/Cases/CasesPlugin.ts +++ b/backend/src/plugins/Cases/CasesPlugin.ts @@ -14,6 +14,7 @@ import { getRecentCasesByMod } from "./functions/getRecentCasesByMod.js"; import { getTotalCasesByMod } from "./functions/getTotalCasesByMod.js"; import { postCaseToCaseLogChannel } from "./functions/postToCaseLogChannel.js"; import { CasesPluginType, zCasesConfig } from "./types.js"; +import { casesPluginDocs } from "./docs.js"; // The `any` cast here is to prevent TypeScript from locking up from the circular dependency function getLogsPlugin(): Promise { diff --git a/backend/src/plugins/Cases/info.ts b/backend/src/plugins/Cases/docs.ts similarity index 73% rename from backend/src/plugins/Cases/info.ts rename to backend/src/plugins/Cases/docs.ts index c30abb29..a247177f 100644 --- a/backend/src/plugins/Cases/info.ts +++ b/backend/src/plugins/Cases/docs.ts @@ -1,11 +1,12 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { trimPluginDescription } from "../../utils.js"; import { zCasesConfig } from "./types.js"; -export const casesPluginInfo: ZeppelinPluginInfo = { +export const casesPluginDocs: ZeppelinPluginDocs = { type: "stable", - prettyName: "Cases", configSchema: zCasesConfig, + + prettyName: "Cases", description: trimPluginDescription(` This plugin contains basic configuration for cases created by other plugins `), diff --git a/backend/src/plugins/Censor/CensorPlugin.ts b/backend/src/plugins/Censor/CensorPlugin.ts index c9503690..50086e6d 100644 --- a/backend/src/plugins/Censor/CensorPlugin.ts +++ b/backend/src/plugins/Censor/CensorPlugin.ts @@ -6,6 +6,7 @@ import { LogsPlugin } from "../Logs/LogsPlugin.js"; import { CensorPluginType, zCensorConfig } from "./types.js"; import { onMessageCreate } from "./util/onMessageCreate.js"; import { onMessageUpdate } from "./util/onMessageUpdate.js"; +import { censorPluginDocs } from "./docs.js"; const defaultOptions: PluginOptions = { config: { diff --git a/backend/src/plugins/Censor/info.ts b/backend/src/plugins/Censor/docs.ts similarity index 75% rename from backend/src/plugins/Censor/info.ts rename to backend/src/plugins/Censor/docs.ts index abe70c10..bba98f41 100644 --- a/backend/src/plugins/Censor/info.ts +++ b/backend/src/plugins/Censor/docs.ts @@ -1,11 +1,12 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { trimPluginDescription } from "../../utils.js"; import { zCensorConfig } from "./types.js"; -export const censorPluginInfo: ZeppelinPluginInfo = { +export const censorPluginDocs: ZeppelinPluginDocs = { type: "legacy", - prettyName: "Censor", configSchema: zCensorConfig, + + prettyName: "Censor", description: trimPluginDescription(` Censor words, tokens, links, regex, etc. For more advanced filtering, check out the Automod plugin! diff --git a/backend/src/plugins/CompanionChannels/CompanionChannelsPlugin.ts b/backend/src/plugins/CompanionChannels/CompanionChannelsPlugin.ts index fd6fe3f7..7935a1d8 100644 --- a/backend/src/plugins/CompanionChannels/CompanionChannelsPlugin.ts +++ b/backend/src/plugins/CompanionChannels/CompanionChannelsPlugin.ts @@ -3,6 +3,7 @@ import { GuildLogs } from "../../data/GuildLogs.js"; import { LogsPlugin } from "../Logs/LogsPlugin.js"; import { VoiceStateUpdateEvt } from "./events/VoiceStateUpdateEvt.js"; import { CompanionChannelsPluginType, zCompanionChannelsConfig } from "./types.js"; +import { companionChannelsPluginDocs } from "./docs.js"; const defaultOptions = { config: { diff --git a/backend/src/plugins/CompanionChannels/info.ts b/backend/src/plugins/CompanionChannels/docs.ts similarity index 80% rename from backend/src/plugins/CompanionChannels/info.ts rename to backend/src/plugins/CompanionChannels/docs.ts index 59b5c487..caf9ea39 100644 --- a/backend/src/plugins/CompanionChannels/info.ts +++ b/backend/src/plugins/CompanionChannels/docs.ts @@ -1,11 +1,12 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { trimPluginDescription } from "../../utils.js"; import { zCompanionChannelsConfig } from "./types.js"; -export const companionChannelsPluginInfo: ZeppelinPluginInfo = { +export const companionChannelsPluginDocs: ZeppelinPluginDocs = { type: "stable", - prettyName: "Companion channels", configSchema: zCompanionChannelsConfig, + + prettyName: "Companion channels", description: trimPluginDescription(` Set up 'companion channels' between text and voice channels. Once set up, any time a user joins one of the specified voice channels, diff --git a/backend/src/plugins/ContextMenus/ContextMenuPlugin.ts b/backend/src/plugins/ContextMenus/ContextMenuPlugin.ts index 330b409a..2460a7d9 100644 --- a/backend/src/plugins/ContextMenus/ContextMenuPlugin.ts +++ b/backend/src/plugins/ContextMenus/ContextMenuPlugin.ts @@ -6,6 +6,7 @@ import { UtilityPlugin } from "../Utility/UtilityPlugin.js"; import { ContextClickedEvt } from "./events/ContextClickedEvt.js"; import { ContextMenuPluginType, zContextMenusConfig } from "./types.js"; import { loadAllCommands } from "./utils/loadAllCommands.js"; +import { contextMenuPluginDocs } from "./docs.js"; const defaultOptions: PluginOptions = { config: { diff --git a/backend/src/plugins/ContextMenus/info.ts b/backend/src/plugins/ContextMenus/docs.ts similarity index 55% rename from backend/src/plugins/ContextMenus/info.ts rename to backend/src/plugins/ContextMenus/docs.ts index 8922d705..7d64055a 100644 --- a/backend/src/plugins/ContextMenus/info.ts +++ b/backend/src/plugins/ContextMenus/docs.ts @@ -1,8 +1,9 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { zContextMenusConfig } from "./types.js"; -export const contextMenuPluginInfo: ZeppelinPluginInfo = { +export const contextMenuPluginDocs: ZeppelinPluginDocs = { type: "stable", - prettyName: "Context menu", configSchema: zContextMenusConfig, + + prettyName: "Context menu", }; diff --git a/backend/src/plugins/Counters/info.ts b/backend/src/plugins/Counters/docs.ts similarity index 75% rename from backend/src/plugins/Counters/info.ts rename to backend/src/plugins/Counters/docs.ts index a0aa90af..7c8e3ec4 100644 --- a/backend/src/plugins/Counters/info.ts +++ b/backend/src/plugins/Counters/docs.ts @@ -1,11 +1,12 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { zCountersConfig } from "./types.js"; -export const countersPluginInfo: ZeppelinPluginInfo = { - prettyName: "Counters", +export const countersPluginDocs: ZeppelinPluginDocs = { type: "stable", + configSchema: zCountersConfig, + + prettyName: "Counters", description: "Keep track of per-user, per-channel, or global numbers and trigger specific actions based on this number", configurationGuide: "See Counters setup guide", - configSchema: zCountersConfig, }; diff --git a/backend/src/plugins/CustomEvents/info.ts b/backend/src/plugins/CustomEvents/docs.ts similarity index 55% rename from backend/src/plugins/CustomEvents/info.ts rename to backend/src/plugins/CustomEvents/docs.ts index 82aae5a7..d879909f 100644 --- a/backend/src/plugins/CustomEvents/info.ts +++ b/backend/src/plugins/CustomEvents/docs.ts @@ -1,7 +1,7 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { zCustomEventsConfig } from "./types.js"; -export const customEventsPluginInfo: ZeppelinPluginInfo = { +export const customEventsPluginDocs: ZeppelinPluginDocs = { prettyName: "Custom events", type: "internal", configSchema: zCustomEventsConfig, diff --git a/backend/src/plugins/GuildAccessMonitor/GuildAccessMonitorPlugin.ts b/backend/src/plugins/GuildAccessMonitor/GuildAccessMonitorPlugin.ts index 7be3ca96..f1dbbe0b 100644 --- a/backend/src/plugins/GuildAccessMonitor/GuildAccessMonitorPlugin.ts +++ b/backend/src/plugins/GuildAccessMonitor/GuildAccessMonitorPlugin.ts @@ -4,6 +4,7 @@ import z from "zod"; import { AllowedGuilds } from "../../data/AllowedGuilds.js"; import { Configs } from "../../data/Configs.js"; import { env } from "../../env.js"; +import { zGuildAccessMonitorConfig } from "./types.js"; interface GuildAccessMonitorPluginType extends BasePluginType { state: { @@ -24,7 +25,7 @@ async function checkGuild(pluginData: GlobalPluginData()({ name: "guild_access_monitor", - configParser: (input) => z.strictObject({}).parse(input), + configParser: (input) => zGuildAccessMonitorConfig.parse(input), events: [ globalPluginEventListener()({ diff --git a/backend/src/plugins/GuildAccessMonitor/docs.ts b/backend/src/plugins/GuildAccessMonitor/docs.ts new file mode 100644 index 00000000..74420526 --- /dev/null +++ b/backend/src/plugins/GuildAccessMonitor/docs.ts @@ -0,0 +1,14 @@ +import { z } from "zod"; +import { ZeppelinPluginDocs } from "../../types.js"; +import { trimPluginDescription } from "../../utils.js"; +import { zGuildAccessMonitorConfig } from "./types.js"; + +export const guildAccessMonitorPluginDocs: ZeppelinPluginDocs = { + type: "stable", + configSchema: zGuildAccessMonitorConfig, + + prettyName: "Bot control", + description: trimPluginDescription(` + Automatically leaves servers that are not on the list of allowed servers + `), +}; diff --git a/backend/src/plugins/GuildAccessMonitor/types.ts b/backend/src/plugins/GuildAccessMonitor/types.ts new file mode 100644 index 00000000..5e027b15 --- /dev/null +++ b/backend/src/plugins/GuildAccessMonitor/types.ts @@ -0,0 +1,3 @@ +import { z } from "zod"; + +export const zGuildAccessMonitorConfig = z.strictObject({}); diff --git a/backend/src/plugins/GuildConfigReloader/info.ts b/backend/src/plugins/GuildConfigReloader/docs.ts similarity index 58% rename from backend/src/plugins/GuildConfigReloader/info.ts rename to backend/src/plugins/GuildConfigReloader/docs.ts index 36d4309c..a3fb923e 100644 --- a/backend/src/plugins/GuildConfigReloader/info.ts +++ b/backend/src/plugins/GuildConfigReloader/docs.ts @@ -1,7 +1,7 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { zGuildConfigReloaderPlugin } from "./types.js"; -export const guildConfigReloaderPluginInfo: ZeppelinPluginInfo = { +export const guildConfigReloaderPluginDocs: ZeppelinPluginDocs = { prettyName: "Guild config reloader", type: "internal", configSchema: zGuildConfigReloaderPlugin, diff --git a/backend/src/plugins/GuildInfoSaver/info.ts b/backend/src/plugins/GuildInfoSaver/docs.ts similarity index 56% rename from backend/src/plugins/GuildInfoSaver/info.ts rename to backend/src/plugins/GuildInfoSaver/docs.ts index 1ea148d5..9ad10337 100644 --- a/backend/src/plugins/GuildInfoSaver/info.ts +++ b/backend/src/plugins/GuildInfoSaver/docs.ts @@ -1,7 +1,7 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { zGuildInfoSaverConfig } from "./types.js"; -export const guildInfoSaverPluginInfo: ZeppelinPluginInfo = { +export const guildInfoSaverPluginDocs: ZeppelinPluginDocs = { prettyName: "Guild info saver", type: "internal", configSchema: zGuildInfoSaverConfig, diff --git a/backend/src/plugins/GuildMemberCache/info.ts b/backend/src/plugins/GuildMemberCache/docs.ts similarity index 56% rename from backend/src/plugins/GuildMemberCache/info.ts rename to backend/src/plugins/GuildMemberCache/docs.ts index dc8857c0..c0a47527 100644 --- a/backend/src/plugins/GuildMemberCache/info.ts +++ b/backend/src/plugins/GuildMemberCache/docs.ts @@ -1,7 +1,7 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { zGuildMemberCacheConfig } from "./types.js"; -export const guildMemberCachePluginInfo: ZeppelinPluginInfo = { +export const guildMemberCachePluginDocs: ZeppelinPluginDocs = { prettyName: "Guild member cache", type: "internal", configSchema: zGuildMemberCacheConfig, diff --git a/backend/src/plugins/InternalPoster/info.ts b/backend/src/plugins/InternalPoster/docs.ts similarity index 56% rename from backend/src/plugins/InternalPoster/info.ts rename to backend/src/plugins/InternalPoster/docs.ts index 33d33168..f1183943 100644 --- a/backend/src/plugins/InternalPoster/info.ts +++ b/backend/src/plugins/InternalPoster/docs.ts @@ -1,7 +1,7 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { zInternalPosterConfig } from "./types.js"; -export const internalPosterPluginInfo: ZeppelinPluginInfo = { +export const internalPosterPluginDocs: ZeppelinPluginDocs = { prettyName: "Internal poster", type: "internal", configSchema: zInternalPosterConfig, diff --git a/backend/src/plugins/LocateUser/info.ts b/backend/src/plugins/LocateUser/docs.ts similarity index 79% rename from backend/src/plugins/LocateUser/info.ts rename to backend/src/plugins/LocateUser/docs.ts index e7b06582..2704d6f3 100644 --- a/backend/src/plugins/LocateUser/info.ts +++ b/backend/src/plugins/LocateUser/docs.ts @@ -1,8 +1,8 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { trimPluginDescription } from "../../utils.js"; import { zLocateUserConfig } from "./types.js"; -export const locateUserPluginInfo: ZeppelinPluginInfo = { +export const locateUserPluginDocs: ZeppelinPluginDocs = { prettyName: "Locate user", type: "stable", description: trimPluginDescription(` diff --git a/backend/src/plugins/Logs/info.ts b/backend/src/plugins/Logs/docs.ts similarity index 52% rename from backend/src/plugins/Logs/info.ts rename to backend/src/plugins/Logs/docs.ts index f16862ba..abe2f66e 100644 --- a/backend/src/plugins/Logs/info.ts +++ b/backend/src/plugins/Logs/docs.ts @@ -1,7 +1,7 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { zLogsConfig } from "./types.js"; -export const logsPluginInfo: ZeppelinPluginInfo = { +export const logsPluginDocs: ZeppelinPluginDocs = { prettyName: "Logs", configSchema: zLogsConfig, type: "stable", diff --git a/backend/src/plugins/MessageSaver/info.ts b/backend/src/plugins/MessageSaver/docs.ts similarity index 55% rename from backend/src/plugins/MessageSaver/info.ts rename to backend/src/plugins/MessageSaver/docs.ts index 3402a22c..3ee79b96 100644 --- a/backend/src/plugins/MessageSaver/info.ts +++ b/backend/src/plugins/MessageSaver/docs.ts @@ -1,7 +1,7 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { zMessageSaverConfig } from "./types.js"; -export const messageSaverPluginInfo: ZeppelinPluginInfo = { +export const messageSaverPluginDocs: ZeppelinPluginDocs = { prettyName: "Message saver", type: "internal", configSchema: zMessageSaverConfig, diff --git a/backend/src/plugins/ModActions/info.ts b/backend/src/plugins/ModActions/docs.ts similarity index 75% rename from backend/src/plugins/ModActions/info.ts rename to backend/src/plugins/ModActions/docs.ts index c293ce07..d4f5d32d 100644 --- a/backend/src/plugins/ModActions/info.ts +++ b/backend/src/plugins/ModActions/docs.ts @@ -1,8 +1,8 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { trimPluginDescription } from "../../utils.js"; import { zModActionsConfig } from "./types.js"; -export const modActionsPluginInfo: ZeppelinPluginInfo = { +export const modActionsPluginDocs: ZeppelinPluginDocs = { prettyName: "Mod actions", type: "stable", description: trimPluginDescription(` diff --git a/backend/src/plugins/Mutes/info.ts b/backend/src/plugins/Mutes/docs.ts similarity index 52% rename from backend/src/plugins/Mutes/info.ts rename to backend/src/plugins/Mutes/docs.ts index 7bfda480..071c2d4c 100644 --- a/backend/src/plugins/Mutes/info.ts +++ b/backend/src/plugins/Mutes/docs.ts @@ -1,7 +1,7 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { zMutesConfig } from "./types.js"; -export const mutesPluginInfo: ZeppelinPluginInfo = { +export const mutesPluginDocs: ZeppelinPluginDocs = { prettyName: "Mutes", type: "stable", configSchema: zMutesConfig, diff --git a/backend/src/plugins/NameHistory/info.ts b/backend/src/plugins/NameHistory/docs.ts similarity index 55% rename from backend/src/plugins/NameHistory/info.ts rename to backend/src/plugins/NameHistory/docs.ts index aafae4be..e1b110dc 100644 --- a/backend/src/plugins/NameHistory/info.ts +++ b/backend/src/plugins/NameHistory/docs.ts @@ -1,7 +1,7 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { zNameHistoryConfig } from "./types.js"; -export const nameHistoryPluginInfo: ZeppelinPluginInfo = { +export const nameHistoryPluginDocs: ZeppelinPluginDocs = { prettyName: "Name history", type: "internal", configSchema: zNameHistoryConfig, diff --git a/backend/src/plugins/Persist/info.ts b/backend/src/plugins/Persist/docs.ts similarity index 77% rename from backend/src/plugins/Persist/info.ts rename to backend/src/plugins/Persist/docs.ts index da406eff..d90a0b66 100644 --- a/backend/src/plugins/Persist/info.ts +++ b/backend/src/plugins/Persist/docs.ts @@ -1,8 +1,8 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { trimPluginDescription } from "../../utils.js"; import { zPersistConfig } from "./types.js"; -export const persistPluginInfo: ZeppelinPluginInfo = { +export const persistPluginDocs: ZeppelinPluginDocs = { prettyName: "Persist", description: trimPluginDescription(` Re-apply roles or nicknames for users when they rejoin the server. diff --git a/backend/src/plugins/Phisherman/info.ts b/backend/src/plugins/Phisherman/docs.ts similarity index 93% rename from backend/src/plugins/Phisherman/info.ts rename to backend/src/plugins/Phisherman/docs.ts index a1231959..3193c880 100644 --- a/backend/src/plugins/Phisherman/info.ts +++ b/backend/src/plugins/Phisherman/docs.ts @@ -1,8 +1,8 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { trimPluginDescription } from "../../utils.js"; import { zPhishermanConfig } from "./types.js"; -export const phishermanPluginInfo: ZeppelinPluginInfo = { +export const phishermanPluginDocs: ZeppelinPluginDocs = { prettyName: "Phisherman", type: "stable", description: trimPluginDescription(` diff --git a/backend/src/plugins/PingableRoles/info.ts b/backend/src/plugins/PingableRoles/docs.ts similarity index 55% rename from backend/src/plugins/PingableRoles/info.ts rename to backend/src/plugins/PingableRoles/docs.ts index bd7f4237..12d60af9 100644 --- a/backend/src/plugins/PingableRoles/info.ts +++ b/backend/src/plugins/PingableRoles/docs.ts @@ -1,7 +1,7 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { zPingableRolesConfig } from "./types.js"; -export const pingableRolesPluginInfo: ZeppelinPluginInfo = { +export const pingableRolesPluginDocs: ZeppelinPluginDocs = { prettyName: "Pingable roles", configSchema: zPingableRolesConfig, type: "stable", diff --git a/backend/src/plugins/Post/info.ts b/backend/src/plugins/Post/docs.ts similarity index 52% rename from backend/src/plugins/Post/info.ts rename to backend/src/plugins/Post/docs.ts index 9a9dc9a9..65e41b9d 100644 --- a/backend/src/plugins/Post/info.ts +++ b/backend/src/plugins/Post/docs.ts @@ -1,7 +1,7 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { zPostConfig } from "./types.js"; -export const postPluginInfo: ZeppelinPluginInfo = { +export const postPluginDocs: ZeppelinPluginDocs = { prettyName: "Post", configSchema: zPostConfig, type: "stable", diff --git a/backend/src/plugins/ReactionRoles/info.ts b/backend/src/plugins/ReactionRoles/docs.ts similarity index 69% rename from backend/src/plugins/ReactionRoles/info.ts rename to backend/src/plugins/ReactionRoles/docs.ts index a89bbcd3..964d8ca9 100644 --- a/backend/src/plugins/ReactionRoles/info.ts +++ b/backend/src/plugins/ReactionRoles/docs.ts @@ -1,7 +1,7 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { zReactionRolesConfig } from "./types.js"; -export const reactionRolesPluginInfo: ZeppelinPluginInfo = { +export const reactionRolesPluginDocs: ZeppelinPluginDocs = { prettyName: "Reaction roles", description: "Consider using the [Role buttons](https://zeppelin.gg/docs/plugins/role_buttons) plugin instead.", type: "legacy", diff --git a/backend/src/plugins/Reminders/info.ts b/backend/src/plugins/Reminders/docs.ts similarity index 54% rename from backend/src/plugins/Reminders/info.ts rename to backend/src/plugins/Reminders/docs.ts index c010791c..93268534 100644 --- a/backend/src/plugins/Reminders/info.ts +++ b/backend/src/plugins/Reminders/docs.ts @@ -1,7 +1,7 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { zRemindersConfig } from "./types.js"; -export const remindersPluginInfo: ZeppelinPluginInfo = { +export const remindersPluginDocs: ZeppelinPluginDocs = { prettyName: "Reminders", configSchema: zRemindersConfig, type: "stable", diff --git a/backend/src/plugins/RoleButtons/info.ts b/backend/src/plugins/RoleButtons/docs.ts similarity index 96% rename from backend/src/plugins/RoleButtons/info.ts rename to backend/src/plugins/RoleButtons/docs.ts index 14a13931..f874f90a 100644 --- a/backend/src/plugins/RoleButtons/info.ts +++ b/backend/src/plugins/RoleButtons/docs.ts @@ -1,8 +1,8 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { trimPluginDescription } from "../../utils.js"; import { zRoleButtonsConfig } from "./types.js"; -export const roleButtonsPluginInfo: ZeppelinPluginInfo = { +export const roleButtonsPluginDocs: ZeppelinPluginDocs = { type: "stable", prettyName: "Role buttons", description: trimPluginDescription(` diff --git a/backend/src/plugins/RoleManager/info.ts b/backend/src/plugins/RoleManager/docs.ts similarity index 55% rename from backend/src/plugins/RoleManager/info.ts rename to backend/src/plugins/RoleManager/docs.ts index b1da2150..e142fb7f 100644 --- a/backend/src/plugins/RoleManager/info.ts +++ b/backend/src/plugins/RoleManager/docs.ts @@ -1,7 +1,7 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { zRoleManagerConfig } from "./types.js"; -export const roleManagerPluginInfo: ZeppelinPluginInfo = { +export const roleManagerPluginDocs: ZeppelinPluginDocs = { prettyName: "Role manager", type: "internal", configSchema: zRoleManagerConfig, diff --git a/backend/src/plugins/Roles/info.ts b/backend/src/plugins/Roles/docs.ts similarity index 73% rename from backend/src/plugins/Roles/info.ts rename to backend/src/plugins/Roles/docs.ts index 808c843a..a317db9f 100644 --- a/backend/src/plugins/Roles/info.ts +++ b/backend/src/plugins/Roles/docs.ts @@ -1,8 +1,8 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { trimPluginDescription } from "../../utils.js"; import { zRolesConfig } from "./types.js"; -export const rolesPluginInfo: ZeppelinPluginInfo = { +export const rolesPluginDocs: ZeppelinPluginDocs = { type: "stable", prettyName: "Roles", description: trimPluginDescription(` diff --git a/backend/src/plugins/SelfGrantableRoles/info.ts b/backend/src/plugins/SelfGrantableRoles/docs.ts similarity index 93% rename from backend/src/plugins/SelfGrantableRoles/info.ts rename to backend/src/plugins/SelfGrantableRoles/docs.ts index c9c8b6f0..cc5bb355 100644 --- a/backend/src/plugins/SelfGrantableRoles/info.ts +++ b/backend/src/plugins/SelfGrantableRoles/docs.ts @@ -1,8 +1,8 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { trimPluginDescription } from "../../utils.js"; import { zSelfGrantableRolesConfig } from "./types.js"; -export const selfGrantableRolesPluginInfo: ZeppelinPluginInfo = { +export const selfGrantableRolesPluginDocs: ZeppelinPluginDocs = { type: "stable", prettyName: "Self-grantable roles", description: trimPluginDescription(` diff --git a/backend/src/plugins/Slowmode/info.ts b/backend/src/plugins/Slowmode/docs.ts similarity index 53% rename from backend/src/plugins/Slowmode/info.ts rename to backend/src/plugins/Slowmode/docs.ts index 3e303b56..7ff3d509 100644 --- a/backend/src/plugins/Slowmode/info.ts +++ b/backend/src/plugins/Slowmode/docs.ts @@ -1,7 +1,7 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { zSlowmodeConfig } from "./types.js"; -export const slowmodePluginInfo: ZeppelinPluginInfo = { +export const slowmodePluginDocs: ZeppelinPluginDocs = { type: "stable", prettyName: "Slowmode", configSchema: zSlowmodeConfig, diff --git a/backend/src/plugins/Spam/info.ts b/backend/src/plugins/Spam/docs.ts similarity index 76% rename from backend/src/plugins/Spam/info.ts rename to backend/src/plugins/Spam/docs.ts index f5b02651..5aa19b8a 100644 --- a/backend/src/plugins/Spam/info.ts +++ b/backend/src/plugins/Spam/docs.ts @@ -1,8 +1,8 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { trimPluginDescription } from "../../utils.js"; import { zSpamConfig } from "./types.js"; -export const spamPluginInfo: ZeppelinPluginInfo = { +export const spamPluginDocs: ZeppelinPluginDocs = { type: "legacy", prettyName: "Spam protection", description: trimPluginDescription(` diff --git a/backend/src/plugins/Starboard/info.ts b/backend/src/plugins/Starboard/docs.ts similarity index 96% rename from backend/src/plugins/Starboard/info.ts rename to backend/src/plugins/Starboard/docs.ts index aea2929c..d8fc50dc 100644 --- a/backend/src/plugins/Starboard/info.ts +++ b/backend/src/plugins/Starboard/docs.ts @@ -1,8 +1,8 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { trimPluginDescription } from "../../utils.js"; import { zStarboardConfig } from "./types.js"; -export const starboardPluginInfo: ZeppelinPluginInfo = { +export const starboardPluginDocs: ZeppelinPluginDocs = { type: "stable", prettyName: "Starboard", description: trimPluginDescription(` diff --git a/backend/src/plugins/Tags/info.ts b/backend/src/plugins/Tags/docs.ts similarity index 92% rename from backend/src/plugins/Tags/info.ts rename to backend/src/plugins/Tags/docs.ts index 6ee8f4c3..39f9c77a 100644 --- a/backend/src/plugins/Tags/info.ts +++ b/backend/src/plugins/Tags/docs.ts @@ -1,9 +1,9 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { trimPluginDescription } from "../../utils.js"; import { TemplateFunctions } from "./templateFunctions.js"; import { TemplateFunction, zTagsConfig } from "./types.js"; -export const tagsPluginInfo: ZeppelinPluginInfo = { +export const tagsPluginDocs: ZeppelinPluginDocs = { type: "stable", prettyName: "Tags", description: "Tags are a way to store and reuse information.", diff --git a/backend/src/plugins/TimeAndDate/info.ts b/backend/src/plugins/TimeAndDate/docs.ts similarity index 73% rename from backend/src/plugins/TimeAndDate/info.ts rename to backend/src/plugins/TimeAndDate/docs.ts index a7388fee..7a79f335 100644 --- a/backend/src/plugins/TimeAndDate/info.ts +++ b/backend/src/plugins/TimeAndDate/docs.ts @@ -1,8 +1,8 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { trimPluginDescription } from "../../utils.js"; import { zTimeAndDateConfig } from "./types.js"; -export const timeAndDatePluginInfo: ZeppelinPluginInfo = { +export const timeAndDatePluginDocs: ZeppelinPluginDocs = { type: "stable", prettyName: "Time and date", description: trimPluginDescription(` diff --git a/backend/src/plugins/UsernameSaver/info.ts b/backend/src/plugins/UsernameSaver/docs.ts similarity index 55% rename from backend/src/plugins/UsernameSaver/info.ts rename to backend/src/plugins/UsernameSaver/docs.ts index 898909da..a28dc46e 100644 --- a/backend/src/plugins/UsernameSaver/info.ts +++ b/backend/src/plugins/UsernameSaver/docs.ts @@ -1,7 +1,7 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { zUsernameSaverConfig } from "./types.js"; -export const usernameSaverPluginInfo: ZeppelinPluginInfo = { +export const usernameSaverPluginDocs: ZeppelinPluginDocs = { type: "internal", prettyName: "Username saver", configSchema: zUsernameSaverConfig, diff --git a/backend/src/plugins/Utility/info.ts b/backend/src/plugins/Utility/docs.ts similarity index 53% rename from backend/src/plugins/Utility/info.ts rename to backend/src/plugins/Utility/docs.ts index f7a562c1..8e16116c 100644 --- a/backend/src/plugins/Utility/info.ts +++ b/backend/src/plugins/Utility/docs.ts @@ -1,7 +1,7 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { zUtilityConfig } from "./types.js"; -export const utilityPluginInfo: ZeppelinPluginInfo = { +export const utilityPluginDocs: ZeppelinPluginDocs = { type: "stable", prettyName: "Utility", configSchema: zUtilityConfig, diff --git a/backend/src/plugins/WelcomeMessage/info.ts b/backend/src/plugins/WelcomeMessage/docs.ts similarity index 55% rename from backend/src/plugins/WelcomeMessage/info.ts rename to backend/src/plugins/WelcomeMessage/docs.ts index f3e529b2..680a2a47 100644 --- a/backend/src/plugins/WelcomeMessage/info.ts +++ b/backend/src/plugins/WelcomeMessage/docs.ts @@ -1,7 +1,7 @@ -import { ZeppelinPluginInfo } from "../../types.js"; +import { ZeppelinPluginDocs } from "../../types.js"; import { zWelcomeMessageConfig } from "./types.js"; -export const welcomeMessagePluginInfo: ZeppelinPluginInfo = { +export const welcomeMessagePluginDocs: ZeppelinPluginDocs = { type: "stable", prettyName: "Welcome message", configSchema: zWelcomeMessageConfig, diff --git a/backend/src/plugins/availablePlugins.ts b/backend/src/plugins/availablePlugins.ts index 3a7fd60b..ddb82e21 100644 --- a/backend/src/plugins/availablePlugins.ts +++ b/backend/src/plugins/availablePlugins.ts @@ -1,100 +1,247 @@ -import { GlobalPluginBlueprint, GuildPluginBlueprint } from "knub"; +import { ZeppelinGlobalPluginInfo, ZeppelinGuildPluginInfo } from "../types.js"; import { AutoDeletePlugin } from "./AutoDelete/AutoDeletePlugin.js"; +import { autoDeletePluginDocs } from "./AutoDelete/docs.js"; import { AutoReactionsPlugin } from "./AutoReactions/AutoReactionsPlugin.js"; +import { autoReactionsPluginDocs } from "./AutoReactions/docs.js"; import { AutomodPlugin } from "./Automod/AutomodPlugin.js"; +import { automodPluginDocs } from "./Automod/docs.js"; import { BotControlPlugin } from "./BotControl/BotControlPlugin.js"; +import { botControlPluginDocs } from "./BotControl/docs.js"; import { CasesPlugin } from "./Cases/CasesPlugin.js"; +import { casesPluginDocs } from "./Cases/docs.js"; import { CensorPlugin } from "./Censor/CensorPlugin.js"; -import { ChannelArchiverPlugin } from "./ChannelArchiver/ChannelArchiverPlugin.js"; +import { censorPluginDocs } from "./Censor/docs.js"; import { CompanionChannelsPlugin } from "./CompanionChannels/CompanionChannelsPlugin.js"; +import { companionChannelsPluginDocs } from "./CompanionChannels/docs.js"; import { ContextMenuPlugin } from "./ContextMenus/ContextMenuPlugin.js"; +import { contextMenuPluginDocs } from "./ContextMenus/docs.js"; import { CountersPlugin } from "./Counters/CountersPlugin.js"; +import { countersPluginDocs } from "./Counters/docs.js"; import { CustomEventsPlugin } from "./CustomEvents/CustomEventsPlugin.js"; +import { customEventsPluginDocs } from "./CustomEvents/docs.js"; import { GuildAccessMonitorPlugin } from "./GuildAccessMonitor/GuildAccessMonitorPlugin.js"; +import { guildAccessMonitorPluginDocs } from "./GuildAccessMonitor/docs.js"; import { GuildConfigReloaderPlugin } from "./GuildConfigReloader/GuildConfigReloaderPlugin.js"; +import { guildConfigReloaderPluginDocs } from "./GuildConfigReloader/docs.js"; import { GuildInfoSaverPlugin } from "./GuildInfoSaver/GuildInfoSaverPlugin.js"; +import { guildInfoSaverPluginDocs } from "./GuildInfoSaver/docs.js"; import { InternalPosterPlugin } from "./InternalPoster/InternalPosterPlugin.js"; +import { internalPosterPluginDocs } from "./InternalPoster/docs.js"; import { LocateUserPlugin } from "./LocateUser/LocateUserPlugin.js"; +import { locateUserPluginDocs } from "./LocateUser/docs.js"; import { LogsPlugin } from "./Logs/LogsPlugin.js"; +import { logsPluginDocs } from "./Logs/docs.js"; import { MessageSaverPlugin } from "./MessageSaver/MessageSaverPlugin.js"; +import { messageSaverPluginDocs } from "./MessageSaver/docs.js"; import { ModActionsPlugin } from "./ModActions/ModActionsPlugin.js"; +import { modActionsPluginDocs } from "./ModActions/docs.js"; import { MutesPlugin } from "./Mutes/MutesPlugin.js"; +import { mutesPluginDocs } from "./Mutes/docs.js"; import { NameHistoryPlugin } from "./NameHistory/NameHistoryPlugin.js"; +import { nameHistoryPluginDocs } from "./NameHistory/docs.js"; import { PersistPlugin } from "./Persist/PersistPlugin.js"; +import { persistPluginDocs } from "./Persist/docs.js"; import { PhishermanPlugin } from "./Phisherman/PhishermanPlugin.js"; +import { phishermanPluginDocs } from "./Phisherman/docs.js"; import { PingableRolesPlugin } from "./PingableRoles/PingableRolesPlugin.js"; +import { pingableRolesPluginDocs } from "./PingableRoles/docs.js"; import { PostPlugin } from "./Post/PostPlugin.js"; +import { postPluginDocs } from "./Post/docs.js"; import { ReactionRolesPlugin } from "./ReactionRoles/ReactionRolesPlugin.js"; +import { reactionRolesPluginDocs } from "./ReactionRoles/docs.js"; import { RemindersPlugin } from "./Reminders/RemindersPlugin.js"; +import { remindersPluginDocs } from "./Reminders/docs.js"; import { RoleButtonsPlugin } from "./RoleButtons/RoleButtonsPlugin.js"; +import { roleButtonsPluginDocs } from "./RoleButtons/docs.js"; import { RoleManagerPlugin } from "./RoleManager/RoleManagerPlugin.js"; +import { roleManagerPluginDocs } from "./RoleManager/docs.js"; import { RolesPlugin } from "./Roles/RolesPlugin.js"; +import { rolesPluginDocs } from "./Roles/docs.js"; import { SelfGrantableRolesPlugin } from "./SelfGrantableRoles/SelfGrantableRolesPlugin.js"; +import { selfGrantableRolesPluginDocs } from "./SelfGrantableRoles/docs.js"; import { SlowmodePlugin } from "./Slowmode/SlowmodePlugin.js"; +import { slowmodePluginDocs } from "./Slowmode/docs.js"; import { SpamPlugin } from "./Spam/SpamPlugin.js"; +import { spamPluginDocs } from "./Spam/docs.js"; import { StarboardPlugin } from "./Starboard/StarboardPlugin.js"; +import { starboardPluginDocs } from "./Starboard/docs.js"; import { TagsPlugin } from "./Tags/TagsPlugin.js"; +import { tagsPluginDocs } from "./Tags/docs.js"; import { TimeAndDatePlugin } from "./TimeAndDate/TimeAndDatePlugin.js"; +import { timeAndDatePluginDocs } from "./TimeAndDate/docs.js"; import { UsernameSaverPlugin } from "./UsernameSaver/UsernameSaverPlugin.js"; +import { usernameSaverPluginDocs } from "./UsernameSaver/docs.js"; import { UtilityPlugin } from "./Utility/UtilityPlugin.js"; +import { utilityPluginDocs } from "./Utility/docs.js"; import { WelcomeMessagePlugin } from "./WelcomeMessage/WelcomeMessagePlugin.js"; +import { welcomeMessagePluginDocs } from "./WelcomeMessage/docs.js"; -// prettier-ignore -export const guildPlugins: Array> = [ - AutoDeletePlugin, - AutoReactionsPlugin, - GuildInfoSaverPlugin, - CensorPlugin, - ChannelArchiverPlugin, - LocateUserPlugin, - LogsPlugin, - PersistPlugin, - PingableRolesPlugin, - PostPlugin, - ReactionRolesPlugin, - MessageSaverPlugin, - // GuildMemberCachePlugin, // FIXME: New caching thing, or fix deadlocks with this plugin - ModActionsPlugin, - NameHistoryPlugin, - RemindersPlugin, - RolesPlugin, - SelfGrantableRolesPlugin, - SlowmodePlugin, - SpamPlugin, - StarboardPlugin, - TagsPlugin, - UsernameSaverPlugin, - UtilityPlugin, - WelcomeMessagePlugin, - CasesPlugin, - MutesPlugin, - AutomodPlugin, - CompanionChannelsPlugin, - CustomEventsPlugin, - TimeAndDatePlugin, - CountersPlugin, - ContextMenuPlugin, - PhishermanPlugin, - InternalPosterPlugin, - RoleManagerPlugin, - RoleButtonsPlugin, +export const availableGuildPlugins: ZeppelinGuildPluginInfo[] = [ + { + plugin: AutoDeletePlugin, + docs: autoDeletePluginDocs, + }, + { + plugin: AutomodPlugin, + docs: automodPluginDocs, + }, + { + plugin: AutoReactionsPlugin, + docs: autoReactionsPluginDocs, + }, + { + plugin: CasesPlugin, + docs: casesPluginDocs, + autoload: true, + }, + { + plugin: CensorPlugin, + docs: censorPluginDocs, + }, + { + plugin: CompanionChannelsPlugin, + docs: companionChannelsPluginDocs, + }, + { + plugin: ContextMenuPlugin, + docs: contextMenuPluginDocs, + }, + { + plugin: CountersPlugin, + docs: countersPluginDocs, + }, + { + plugin: CustomEventsPlugin, + docs: customEventsPluginDocs, + }, + { + plugin: GuildInfoSaverPlugin, + docs: guildInfoSaverPluginDocs, + autoload: true, + }, + // FIXME: New caching thing, or fix deadlocks with this plugin + // { + // plugin: GuildMemberCachePlugin, + // docs: guildMemberCachePluginDocs, + // autoload: true, + // }, + { + plugin: InternalPosterPlugin, + docs: internalPosterPluginDocs, + }, + { + plugin: LocateUserPlugin, + docs: locateUserPluginDocs, + }, + { + plugin: LogsPlugin, + docs: logsPluginDocs, + }, + { + plugin: MessageSaverPlugin, + docs: messageSaverPluginDocs, + autoload: true, + }, + { + plugin: ModActionsPlugin, + docs: modActionsPluginDocs, + }, + { + plugin: MutesPlugin, + docs: mutesPluginDocs, + autoload: true, + }, + { + plugin: NameHistoryPlugin, + docs: nameHistoryPluginDocs, + autoload: true, + }, + { + plugin: PersistPlugin, + docs: persistPluginDocs, + }, + { + plugin: PhishermanPlugin, + docs: phishermanPluginDocs, + }, + { + plugin: PingableRolesPlugin, + docs: pingableRolesPluginDocs, + }, + { + plugin: PostPlugin, + docs: postPluginDocs, + }, + { + plugin: ReactionRolesPlugin, + docs: reactionRolesPluginDocs, + }, + { + plugin: RemindersPlugin, + docs: remindersPluginDocs, + }, + { + plugin: RoleButtonsPlugin, + docs: roleButtonsPluginDocs, + }, + { + plugin: RoleManagerPlugin, + docs: roleManagerPluginDocs, + }, + { + plugin: RolesPlugin, + docs: rolesPluginDocs, + }, + { + plugin: SelfGrantableRolesPlugin, + docs: selfGrantableRolesPluginDocs, + }, + { + plugin: SlowmodePlugin, + docs: slowmodePluginDocs, + }, + { + plugin: SpamPlugin, + docs: spamPluginDocs, + }, + { + plugin: StarboardPlugin, + docs: starboardPluginDocs, + }, + { + plugin: TagsPlugin, + docs: tagsPluginDocs, + }, + { + plugin: TimeAndDatePlugin, + docs: timeAndDatePluginDocs, + autoload: true, + }, + { + plugin: UsernameSaverPlugin, + docs: usernameSaverPluginDocs, + }, + { + plugin: UtilityPlugin, + docs: utilityPluginDocs, + }, + { + plugin: WelcomeMessagePlugin, + docs: welcomeMessagePluginDocs, + }, ]; -// prettier-ignore -export const globalPlugins: Array> = [ - GuildConfigReloaderPlugin, - BotControlPlugin, - GuildAccessMonitorPlugin, -]; - -// prettier-ignore -export const baseGuildPlugins: Array> = [ - GuildInfoSaverPlugin, - MessageSaverPlugin, - NameHistoryPlugin, - // GuildMemberCachePlugin, // FIXME: New caching thing, or fix deadlocks with this plugin - CasesPlugin, - MutesPlugin, - TimeAndDatePlugin, - // TODO: Replace these with proper dependencies +export const availableGlobalPlugins: ZeppelinGlobalPluginInfo[] = [ + { + plugin: GuildConfigReloaderPlugin, + docs: guildConfigReloaderPluginDocs, + }, + { + plugin: BotControlPlugin, + docs: botControlPluginDocs, + }, + { + plugin: GuildAccessMonitorPlugin, + docs: guildAccessMonitorPluginDocs, + }, ]; diff --git a/backend/src/plugins/pluginInfo.ts b/backend/src/plugins/pluginInfo.ts deleted file mode 100644 index 58dbc34f..00000000 --- a/backend/src/plugins/pluginInfo.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { ZeppelinPluginInfo } from "../types.js"; -import { AutoDeletePlugin } from "./AutoDelete/AutoDeletePlugin.js"; -import { autoDeletePluginInfo } from "./AutoDelete/info.js"; -import { AutoReactionsPlugin } from "./AutoReactions/AutoReactionsPlugin.js"; -import { autoReactionsInfo } from "./AutoReactions/info.js"; -import { AutomodPlugin } from "./Automod/AutomodPlugin.js"; -import { automodPluginInfo } from "./Automod/info.js"; -import { CasesPlugin } from "./Cases/CasesPlugin.js"; -import { casesPluginInfo } from "./Cases/info.js"; -import { CensorPlugin } from "./Censor/CensorPlugin.js"; -import { censorPluginInfo } from "./Censor/info.js"; -import { CompanionChannelsPlugin } from "./CompanionChannels/CompanionChannelsPlugin.js"; -import { companionChannelsPluginInfo } from "./CompanionChannels/info.js"; -import { ContextMenuPlugin } from "./ContextMenus/ContextMenuPlugin.js"; -import { contextMenuPluginInfo } from "./ContextMenus/info.js"; -import { CountersPlugin } from "./Counters/CountersPlugin.js"; -import { countersPluginInfo } from "./Counters/info.js"; -import { CustomEventsPlugin } from "./CustomEvents/CustomEventsPlugin.js"; -import { customEventsPluginInfo } from "./CustomEvents/info.js"; -import { GuildInfoSaverPlugin } from "./GuildInfoSaver/GuildInfoSaverPlugin.js"; -import { guildInfoSaverPluginInfo } from "./GuildInfoSaver/info.js"; -import { InternalPosterPlugin } from "./InternalPoster/InternalPosterPlugin.js"; -import { internalPosterPluginInfo } from "./InternalPoster/info.js"; -import { LocateUserPlugin } from "./LocateUser/LocateUserPlugin.js"; -import { locateUserPluginInfo } from "./LocateUser/info.js"; -import { LogsPlugin } from "./Logs/LogsPlugin.js"; -import { logsPluginInfo } from "./Logs/info.js"; -import { MessageSaverPlugin } from "./MessageSaver/MessageSaverPlugin.js"; -import { messageSaverPluginInfo } from "./MessageSaver/info.js"; -import { ModActionsPlugin } from "./ModActions/ModActionsPlugin.js"; -import { modActionsPluginInfo } from "./ModActions/info.js"; -import { MutesPlugin } from "./Mutes/MutesPlugin.js"; -import { mutesPluginInfo } from "./Mutes/info.js"; -import { NameHistoryPlugin } from "./NameHistory/NameHistoryPlugin.js"; -import { nameHistoryPluginInfo } from "./NameHistory/info.js"; -import { PersistPlugin } from "./Persist/PersistPlugin.js"; -import { persistPluginInfo } from "./Persist/info.js"; -import { PhishermanPlugin } from "./Phisherman/PhishermanPlugin.js"; -import { phishermanPluginInfo } from "./Phisherman/info.js"; -import { PingableRolesPlugin } from "./PingableRoles/PingableRolesPlugin.js"; -import { pingableRolesPluginInfo } from "./PingableRoles/info.js"; -import { PostPlugin } from "./Post/PostPlugin.js"; -import { postPluginInfo } from "./Post/info.js"; -import { ReactionRolesPlugin } from "./ReactionRoles/ReactionRolesPlugin.js"; -import { reactionRolesPluginInfo } from "./ReactionRoles/info.js"; -import { RemindersPlugin } from "./Reminders/RemindersPlugin.js"; -import { remindersPluginInfo } from "./Reminders/info.js"; -import { RoleButtonsPlugin } from "./RoleButtons/RoleButtonsPlugin.js"; -import { roleButtonsPluginInfo } from "./RoleButtons/info.js"; -import { RoleManagerPlugin } from "./RoleManager/RoleManagerPlugin.js"; -import { roleManagerPluginInfo } from "./RoleManager/info.js"; -import { RolesPlugin } from "./Roles/RolesPlugin.js"; -import { rolesPluginInfo } from "./Roles/info.js"; -import { SelfGrantableRolesPlugin } from "./SelfGrantableRoles/SelfGrantableRolesPlugin.js"; -import { selfGrantableRolesPluginInfo } from "./SelfGrantableRoles/info.js"; -import { SlowmodePlugin } from "./Slowmode/SlowmodePlugin.js"; -import { slowmodePluginInfo } from "./Slowmode/info.js"; -import { SpamPlugin } from "./Spam/SpamPlugin.js"; -import { spamPluginInfo } from "./Spam/info.js"; -import { StarboardPlugin } from "./Starboard/StarboardPlugin.js"; -import { starboardPluginInfo } from "./Starboard/info.js"; -import { TagsPlugin } from "./Tags/TagsPlugin.js"; -import { tagsPluginInfo } from "./Tags/info.js"; -import { TimeAndDatePlugin } from "./TimeAndDate/TimeAndDatePlugin.js"; -import { timeAndDatePluginInfo } from "./TimeAndDate/info.js"; -import { UsernameSaverPlugin } from "./UsernameSaver/UsernameSaverPlugin.js"; -import { usernameSaverPluginInfo } from "./UsernameSaver/info.js"; -import { UtilityPlugin } from "./Utility/UtilityPlugin.js"; -import { utilityPluginInfo } from "./Utility/info.js"; -import { WelcomeMessagePlugin } from "./WelcomeMessage/WelcomeMessagePlugin.js"; -import { welcomeMessagePluginInfo } from "./WelcomeMessage/info.js"; - -export const guildPluginInfo: Record = { - [AutoDeletePlugin.name]: autoDeletePluginInfo, - [AutoReactionsPlugin.name]: autoReactionsInfo, - [GuildInfoSaverPlugin.name]: guildInfoSaverPluginInfo, - [CensorPlugin.name]: censorPluginInfo, - [LocateUserPlugin.name]: locateUserPluginInfo, - [LogsPlugin.name]: logsPluginInfo, - [PersistPlugin.name]: persistPluginInfo, - [PingableRolesPlugin.name]: pingableRolesPluginInfo, - [PostPlugin.name]: postPluginInfo, - [ReactionRolesPlugin.name]: reactionRolesPluginInfo, - [MessageSaverPlugin.name]: messageSaverPluginInfo, - [ModActionsPlugin.name]: modActionsPluginInfo, - [NameHistoryPlugin.name]: nameHistoryPluginInfo, - [RemindersPlugin.name]: remindersPluginInfo, - [RolesPlugin.name]: rolesPluginInfo, - [SelfGrantableRolesPlugin.name]: selfGrantableRolesPluginInfo, - [SlowmodePlugin.name]: slowmodePluginInfo, - [SpamPlugin.name]: spamPluginInfo, - [StarboardPlugin.name]: starboardPluginInfo, - [TagsPlugin.name]: tagsPluginInfo, - [UsernameSaverPlugin.name]: usernameSaverPluginInfo, - [UtilityPlugin.name]: utilityPluginInfo, - [WelcomeMessagePlugin.name]: welcomeMessagePluginInfo, - [CasesPlugin.name]: casesPluginInfo, - [MutesPlugin.name]: mutesPluginInfo, - [AutomodPlugin.name]: automodPluginInfo, - [CompanionChannelsPlugin.name]: companionChannelsPluginInfo, - [CustomEventsPlugin.name]: customEventsPluginInfo, - [TimeAndDatePlugin.name]: timeAndDatePluginInfo, - [CountersPlugin.name]: countersPluginInfo, - [ContextMenuPlugin.name]: contextMenuPluginInfo, - [PhishermanPlugin.name]: phishermanPluginInfo, - [InternalPosterPlugin.name]: internalPosterPluginInfo, - [RoleManagerPlugin.name]: roleManagerPluginInfo, - [RoleButtonsPlugin.name]: roleButtonsPluginInfo, -}; diff --git a/backend/src/types.ts b/backend/src/types.ts index 522ec812..8b195f66 100644 --- a/backend/src/types.ts +++ b/backend/src/types.ts @@ -1,4 +1,4 @@ -import { BaseConfig, Knub } from "knub"; +import { BaseConfig, GlobalPluginBlueprint, GuildPluginBlueprint, Knub } from "knub"; import z, { ZodTypeAny } from "zod"; import { zSnowflake } from "./utils.js"; @@ -33,12 +33,24 @@ export type TZeppelinKnub = Knub; */ export type TMarkdown = string; -export type ZeppelinPluginType = "stable" | "legacy" | "internal"; +export interface ZeppelinGuildPluginInfo { + plugin: GuildPluginBlueprint; + docs: ZeppelinPluginDocs; + autoload?: boolean; +} -export interface ZeppelinPluginInfo { - type: ZeppelinPluginType; - prettyName: string; +export interface ZeppelinGlobalPluginInfo { + plugin: GlobalPluginBlueprint; + docs: ZeppelinPluginDocs; +} + +export type DocsPluginType = "stable" | "legacy" | "internal"; + +export interface ZeppelinPluginDocs { + type: DocsPluginType; configSchema: ZodTypeAny; + + prettyName?: string; description?: TMarkdown; usageGuide?: TMarkdown; configurationGuide?: TMarkdown;