aboutsummaryrefslogtreecommitdiff
path: root/src/api/Commands.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/api/Commands.ts')
-rw-r--r--src/api/Commands.ts180
1 files changed, 0 insertions, 180 deletions
diff --git a/src/api/Commands.ts b/src/api/Commands.ts
deleted file mode 100644
index ba6c7fa..0000000
--- a/src/api/Commands.ts
+++ /dev/null
@@ -1,180 +0,0 @@
-import { Channel, Guild, Embed, Message } from "discord-types/general";
-import { lazyWebpack, mergeDefaults } from "../utils/misc";
-import { waitFor, findByProps, find, filters } from "../webpack";
-import type { PartialDeep } from "type-fest";
-
-const createBotMessage = lazyWebpack(filters.byCode('username:"Clyde"'));
-const MessageSender = lazyWebpack(filters.byProps([ "receiveMessage" ]));
-
-export function _init(cmds: Command[]) {
- try {
- BUILT_IN = cmds;
- OptionalMessageOption = cmds.find(c => c.name === "shrug")!.options![0];
- RequiredMessageOption = cmds.find(c => c.name === "me")!.options![0];
- } catch (e) {
- console.error("Failed to load CommandsApi");
- }
- return cmds;
-}
-
-export let BUILT_IN: Command[];
-export const commands = {} as Record<string, Command>;
-
-// hack for plugins being evaluated before we can grab these from webpack
-const OptPlaceholder = Symbol("OptionalMessageOption") as any as Option;
-const ReqPlaceholder = Symbol("RequiredMessageOption") as any as Option;
-/**
- * Optional message option named "message" you can use in commands.
- * Used in "tableflip" or "shrug"
- * @see {@link RequiredMessageOption}
- */
-export let OptionalMessageOption: Option = OptPlaceholder;
-/**
- * Required message option named "message" you can use in commands.
- * Used in "me"
- * @see {@link OptionalMessageOption}
- */
-export let RequiredMessageOption: Option = ReqPlaceholder;
-
-let SnowflakeUtils: any;
-waitFor("fromTimestamp", m => SnowflakeUtils = m);
-
-export function generateId() {
- return `-${SnowflakeUtils.fromTimestamp(Date.now())}`;
-}
-
-/**
- * Get the value of an option by name
- * @param args Arguments array (first argument passed to execute)
- * @param name Name of the argument
- * @param fallbackValue Fallback value in case this option wasn't passed
- * @returns Value
- */
-export function findOption<T>(args: Argument[], name: string): T & {} | undefined;
-export function findOption<T>(args: Argument[], name: string, fallbackValue: T): T & {};
-export function findOption(args: Argument[], name: string, fallbackValue?: any) {
- return (args.find(a => a.name === name)?.value || fallbackValue) as any;
-}
-
-function modifyOpt(opt: Option | Command) {
- opt.displayName ||= opt.name;
- opt.displayDescription ||= opt.description;
- opt.options?.forEach((opt, i, opts) => {
- // See comment above Placeholders
- if (opt === OptPlaceholder) opts[i] = OptionalMessageOption;
- else if (opt === ReqPlaceholder) opts[i] = RequiredMessageOption;
- modifyOpt(opts[i]);
- });
-}
-
-export function registerCommand(command: Command, plugin: string) {
- if (BUILT_IN.some(c => c.name === command.name))
- throw new Error(`Command '${command.name}' already exists.`);
-
- command.id ??= generateId();
- command.applicationId ??= "-1"; // BUILT_IN;
- command.type ??= ApplicationCommandType.CHAT_INPUT;
- command.inputType ??= ApplicationCommandInputType.BUILT_IN_TEXT;
- command.plugin ||= plugin;
-
- modifyOpt(command);
- commands[command.name] = command;
- BUILT_IN.push(command);
-}
-
-/**
- * Send a message as Clyde
- * @param {string} channelId ID of channel to send message to
- * @param {Message} message Message to send
- * @returns {Message}
- */
-export function sendBotMessage(channelId: string, message: PartialDeep<Message>) {
- const botMessage = createBotMessage({ channelId, content: "", embeds: [] });
-
- MessageSender.receiveMessage(channelId, mergeDefaults(message, botMessage));
-
- return message;
-}
-
-export function unregisterCommand(name: string) { 1;
- const idx = BUILT_IN.findIndex(c => c.name === name);
- if (idx === -1)
- return false;
-
- BUILT_IN.splice(idx, 1);
- delete commands[name];
-
- return true;
-}
-
-export interface CommandContext {
- channel: Channel;
- guild?: Guild;
-}
-
-export enum ApplicationCommandOptionType {
- SUB_COMMAND = 1,
- SUB_COMMAND_GROUP = 2,
- STRING = 3,
- INTEGER = 4,
- BOOLEAN = 5,
- USER = 6,
- CHANNEL = 7,
- ROLE = 8,
- MENTIONABLE = 9,
- NUMBER = 10,
- ATTACHMENT = 11,
-}
-
-export enum ApplicationCommandInputType {
- BUILT_IN = 0,
- BUILT_IN_TEXT = 1,
- BUILT_IN_INTEGRATION = 2,
- BOT = 3,
- PLACEHOLDER = 4,
-}
-
-export interface Option {
- name: string;
- displayName?: string;
- type: ApplicationCommandOptionType;
- description: string;
- displayDescription?: string;
- required?: boolean;
- options?: Option[];
-}
-
-export enum ApplicationCommandType {
- CHAT_INPUT = 1,
- USER = 2,
- MESSAGE = 3,
-}
-
-export interface CommandReturnValue {
- content: string;
-}
-
-export interface Argument {
- type: ApplicationCommandOptionType;
- name: string;
- value: string;
- focused: undefined;
-}
-
-export interface Command {
- id?: string;
- applicationId?: string;
- type?: ApplicationCommandType;
- inputType?: ApplicationCommandInputType;
- plugin?: string;
-
- name: string;
- displayName?: string;
- description: string;
- displayDescription?: string;
-
- options?: Option[];
- predicate?(ctx: CommandContext): boolean;
-
- execute(args: Argument[], ctx: CommandContext): CommandReturnValue | void | Promise<CommandReturnValue | void>;
-}