3
0
Fork 0
mirror of https://github.com/ZeppelinBot/Zeppelin.git synced 2025-05-10 12:25:02 +00:00
zeppelin/backend/src/plugins/ContextMenus/ContextMenuPlugin.ts

61 lines
2 KiB
TypeScript

import { PluginOptions } from "knub";
import { StrictValidationError } from "src/validatorUtils";
import { ConfigPreprocessorFn } from "../../../../../Knub/dist/config/configTypes";
import { GuildContextMenuLinks } from "../../data/GuildContextMenuLinks";
import { LogsPlugin } from "../Logs/LogsPlugin";
import { MutesPlugin } from "../Mutes/MutesPlugin";
import { zeppelinGuildPlugin } from "../ZeppelinPluginBlueprint";
import { availableTypes } from "./actions/availableActions";
import { ContextClickedEvt } from "./events/ContextClickedEvt";
import { ConfigSchema, ContextMenuPluginType } from "./types";
import { loadAllCommands } from "./utils/loadAllCommands";
const defaultOptions: PluginOptions<ContextMenuPluginType> = {
config: {
context_actions: {},
},
};
const configPreprocessor: ConfigPreprocessorFn<ContextMenuPluginType> = options => {
if (options.config.context_actions) {
for (const [name, contextMenu] of Object.entries(options.config.context_actions)) {
if (Object.entries(contextMenu.action).length !== 1) {
throw new StrictValidationError([`Invalid value for context_actions/${name}: Must have exactly one action.`]);
}
const actionName = Object.entries(contextMenu.action)[0][0];
if (!availableTypes[actionName].includes(contextMenu.type)) {
throw new StrictValidationError([
`Invalid value for context_actions/${name}/${actionName}: ${actionName} is not allowed on type ${contextMenu.type}.`,
]);
}
}
}
return options;
};
export const ContextMenuPlugin = zeppelinGuildPlugin<ContextMenuPluginType>()({
name: "context_menu",
configSchema: ConfigSchema,
defaultOptions,
configPreprocessor,
// prettier-ignore
events: [
ContextClickedEvt,
],
beforeLoad(pluginData) {
const { state, guild } = pluginData;
state.contextMenuLinks = new GuildContextMenuLinks(guild.id);
},
afterLoad(pluginData) {
loadAllCommands(pluginData);
},
dependencies: [MutesPlugin, LogsPlugin],
});