//@ts-nocheck /** * @plugin * This plugin checks the fields of a ModalSubmitInteraction * with regex or a custom callback * * @author @jacoobes [<@182326315813306368>] * @version 1.0.0 * @example * ```ts * export default commandModule({ * type: CommandType.Modal, * plugins: [ * assertFields({ * fields: { * // check the modal field "mcUsernameInput" with the regex /a+b+c/ * mcUsernameInput: /a+b+c+/ * }, * failure: (errors, interaction) => { * interaction.reply(errors.join("\n")) * } * }), * ], * execute: ctx => { * ctx.reply("nice!") * } * }) * ``` * @plugin */ import { CommandControlPlugin, CommandType, controller } from "@sern/handler"; import type { ModalSubmitInteraction } from "discord.js"; type Assertion = RegExp | ((value: string) => boolean); export function assertFields(config: { fields: Record; failure: (errors: string[], interaction: ModalSubmitInteraction) => any; }) { return CommandControlPlugin((modal) => { const pairs = Object.entries(config.fields); const errors = []; for (const [field, assertion] of pairs) { // Keep in mind this doesn't check for typos! // feel free to add more checks. const input = modal.fields.getTextInputValue(field); const resolvedAssertion = assertion instanceof RegExp ? (value: string) => assertion.test(value) : assertion; if (!resolvedAssertion(input)) { errors.push( input + " failed to pass assertion " + resolvedAssertion.toString() ); } } if (errors.length > 0) { config.failure(errors, modal); return controller.stop(); } return controller.next(); }); }