diff --git a/backend/src/plugins/RoleButtons/RoleButtonsPlugin.ts b/backend/src/plugins/RoleButtons/RoleButtonsPlugin.ts index aa76140a..f7fc72ea 100644 --- a/backend/src/plugins/RoleButtons/RoleButtonsPlugin.ts +++ b/backend/src/plugins/RoleButtons/RoleButtonsPlugin.ts @@ -10,6 +10,7 @@ import { onButtonInteraction } from "./events/buttonInteraction"; import { pluginInfo } from "./info"; import { createButtonComponents } from "./functions/createButtonComponents"; import { TooManyComponentsError } from "./functions/TooManyComponentsError"; +import { resetButtonsCmd } from "./commands/resetButtons"; export const RoleButtonsPlugin = zeppelinGuildPlugin()({ name: "role_buttons", @@ -17,6 +18,21 @@ export const RoleButtonsPlugin = zeppelinGuildPlugin()({ info: pluginInfo, showInDocs: true, + defaultOptions: { + config: { + buttons: {}, + can_reset: false, + }, + overrides: [ + { + level: ">=100", + config: { + can_reset: true, + }, + }, + ], + }, + configPreprocessor(options) { // Auto-fill "name" property for buttons based on the object key const buttonsArray = Array.isArray(options.config?.buttons) ? options.config.buttons : []; @@ -58,6 +74,8 @@ export const RoleButtonsPlugin = zeppelinGuildPlugin()({ events: [onButtonInteraction], + commands: [resetButtonsCmd], + beforeLoad(pluginData) { pluginData.state.roleButtons = GuildRoleButtons.getGuildInstance(pluginData.guild.id); }, diff --git a/backend/src/plugins/RoleButtons/commands/resetButtons.ts b/backend/src/plugins/RoleButtons/commands/resetButtons.ts new file mode 100644 index 00000000..0445e5b3 --- /dev/null +++ b/backend/src/plugins/RoleButtons/commands/resetButtons.ts @@ -0,0 +1,27 @@ +import { typedGuildCommand } from "knub"; +import { RoleButtonsPluginType } from "../types"; +import { commandTypeHelpers as ct } from "../../../commandTypes"; +import { sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils"; +import { applyAllRoleButtons } from "../functions/applyAllRoleButtons"; + +export const resetButtonsCmd = typedGuildCommand()({ + trigger: "role_buttons reset", + description: + "In case of issues, you can run this command to have Zeppelin 'forget' about specific role buttons and re-apply them. This will also repost the message, if not targeting an existing message.", + usage: "!role_buttons reset my_roles", + permission: "can_reset", + signature: { + name: ct.string(), + }, + async run({ pluginData, args, message }) { + const config = pluginData.config.get(); + if (!config.buttons[args.name]) { + sendErrorMessage(pluginData, message.channel, `Can't find role buttons with the name "${args.name}"`); + return; + } + + await pluginData.state.roleButtons.deleteRoleButtonItem(args.name); + await applyAllRoleButtons(pluginData); + sendSuccessMessage(pluginData, message.channel, "Done!"); + }, +}); diff --git a/backend/src/plugins/RoleButtons/types.ts b/backend/src/plugins/RoleButtons/types.ts index 2b23b692..2e5b5828 100644 --- a/backend/src/plugins/RoleButtons/types.ts +++ b/backend/src/plugins/RoleButtons/types.ts @@ -39,6 +39,7 @@ export type TRoleButtonsConfigItem = t.TypeOf; export const ConfigSchema = t.type({ buttons: t.record(t.string, RoleButtonsConfigItem), + can_reset: t.boolean, }); export type TConfigSchema = t.TypeOf;