[Global] Basic commands api implementation (#9)
* [Global] Basic commands api implementation * [Commands] Return unregister method when registering command * [Commands] Code cleanup pass Co-authored-by: Beef <beefers@riseup.net>
This commit is contained in:
parent
bff883ec30
commit
7282d45d39
3 changed files with 96 additions and 3 deletions
65
src/def.d.ts
vendored
65
src/def.d.ts
vendored
|
@ -63,6 +63,66 @@ interface Settings {
|
||||||
developerSettings: boolean;
|
developerSettings: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface ApplicationCommand {
|
||||||
|
description: string;
|
||||||
|
name: string;
|
||||||
|
options: ApplicationCommandOption[];
|
||||||
|
execute: (args: any[], ctx: CommandContext) => CommandResult | void | Promise<CommandResult> | Promise<void>;
|
||||||
|
id?: string;
|
||||||
|
applicationId: string;
|
||||||
|
displayName: string;
|
||||||
|
displayDescription: string;
|
||||||
|
inputType: ApplicationCommandInputType;
|
||||||
|
type: ApplicationCommandType;
|
||||||
|
}
|
||||||
|
|
||||||
|
export enum ApplicationCommandInputType {
|
||||||
|
BUILT_IN,
|
||||||
|
BUILT_IN_TEXT,
|
||||||
|
BUILT_IN_INTEGRATION,
|
||||||
|
BOT,
|
||||||
|
PLACEHOLDER,
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ApplicationCommandOption {
|
||||||
|
name: string;
|
||||||
|
description: string;
|
||||||
|
required?: boolean;
|
||||||
|
type: ApplicationCommandOptionType;
|
||||||
|
displayName: string;
|
||||||
|
displayDescription: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export enum ApplicationCommandOptionType {
|
||||||
|
SUB_COMMAND = 1,
|
||||||
|
SUB_COMMAND_GROUP,
|
||||||
|
STRING,
|
||||||
|
INTEGER,
|
||||||
|
BOOLEAN,
|
||||||
|
USER,
|
||||||
|
CHANNEL,
|
||||||
|
ROLE,
|
||||||
|
MENTIONABLE,
|
||||||
|
NUMBER,
|
||||||
|
ATTACHMENT,
|
||||||
|
}
|
||||||
|
|
||||||
|
export enum ApplicationCommandType {
|
||||||
|
CHAT = 1,
|
||||||
|
USER,
|
||||||
|
MESSAGE,
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CommandContext {
|
||||||
|
channel: any;
|
||||||
|
guild: any;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CommandResult {
|
||||||
|
content: string;
|
||||||
|
tts?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
interface RNConstants extends _RN.PlatformConstants {
|
interface RNConstants extends _RN.PlatformConstants {
|
||||||
// Android
|
// Android
|
||||||
Version: number;
|
Version: number;
|
||||||
|
@ -174,7 +234,10 @@ interface VendettaObject {
|
||||||
stopPlugin: (id: string) => void;
|
stopPlugin: (id: string) => void;
|
||||||
removePlugin: (id: string) => void;
|
removePlugin: (id: string) => void;
|
||||||
getSettings: (id: string) => JSX.Element;
|
getSettings: (id: string) => JSX.Element;
|
||||||
}
|
};
|
||||||
|
commands: {
|
||||||
|
registerCommand: (command: ApplicationCommand) => () => void;
|
||||||
|
};
|
||||||
settings: Settings;
|
settings: Settings;
|
||||||
logger: Logger;
|
logger: Logger;
|
||||||
version: string;
|
version: string;
|
||||||
|
|
|
@ -14,6 +14,7 @@ import { fixTheme } from "@ui/fixTheme";
|
||||||
import { connectToDebugger, patchLogHook, versionHash } from "@lib/debug";
|
import { connectToDebugger, patchLogHook, versionHash } from "@lib/debug";
|
||||||
import { plugins, fetchPlugin, evalPlugin, stopPlugin, removePlugin, getSettings } from "@lib/plugins";
|
import { plugins, fetchPlugin, evalPlugin, stopPlugin, removePlugin, getSettings } from "@lib/plugins";
|
||||||
import settings from "@lib/settings";
|
import settings from "@lib/settings";
|
||||||
|
import { registerCommand } from "./lib/commands";
|
||||||
|
|
||||||
console.log("Hello from Vendetta!");
|
console.log("Hello from Vendetta!");
|
||||||
|
|
||||||
|
@ -50,7 +51,10 @@ async function init() {
|
||||||
evalPlugin: evalPlugin,
|
evalPlugin: evalPlugin,
|
||||||
stopPlugin: stopPlugin,
|
stopPlugin: stopPlugin,
|
||||||
removePlugin: removePlugin,
|
removePlugin: removePlugin,
|
||||||
getSettings: getSettings
|
getSettings: getSettings,
|
||||||
|
},
|
||||||
|
commands: {
|
||||||
|
registerCommand: registerCommand,
|
||||||
},
|
},
|
||||||
settings: settings,
|
settings: settings,
|
||||||
logger: logger,
|
logger: logger,
|
||||||
|
@ -65,7 +69,7 @@ async function init() {
|
||||||
erroredOnLoad = true;
|
erroredOnLoad = true;
|
||||||
alert(`Vendetta failed to initialize... ${e.stack || e.toString()}`);
|
alert(`Vendetta failed to initialize... ${e.stack || e.toString()}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!erroredOnLoad) logger.log("Vendetta is ready!");
|
if (!erroredOnLoad) logger.log("Vendetta is ready!");
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
26
src/lib/commands.ts
Normal file
26
src/lib/commands.ts
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
import { ApplicationCommand } from "@types";
|
||||||
|
import { findByProps } from "@metro/filters";
|
||||||
|
import { after } from "@lib/patcher";
|
||||||
|
|
||||||
|
const commandsModule = findByProps("getBuiltInCommands")
|
||||||
|
|
||||||
|
let commands: ApplicationCommand[] = [];
|
||||||
|
|
||||||
|
after("getBuiltInCommands", commandsModule, (args, res) => res.concat(commands));
|
||||||
|
|
||||||
|
export function registerCommand(command: ApplicationCommand): () => void {
|
||||||
|
// Get built in commands
|
||||||
|
const builtInCommands = commandsModule.getBuiltInCommands(1, true, false);
|
||||||
|
builtInCommands.sort(function (a: ApplicationCommand, b: ApplicationCommand) { return parseInt(b.id!) - parseInt(a.id!) });
|
||||||
|
|
||||||
|
const lastCommand = builtInCommands[builtInCommands.length - 1];
|
||||||
|
|
||||||
|
// Override the new command's id to the last command id - 1
|
||||||
|
command.id = (parseInt(lastCommand.id, 10) - 1).toString();
|
||||||
|
|
||||||
|
// Add it to the commands array
|
||||||
|
commands.push(command);
|
||||||
|
|
||||||
|
// Return command id so it can be unregistered
|
||||||
|
return () => commands = commands.filter(({ id }) => id !== command.id);
|
||||||
|
}
|
Loading…
Reference in a new issue