From 23cf68ac38e3b2ea9b780fc6603a9987da10b2f5 Mon Sep 17 00:00:00 2001 From: cirroskais Date: Tue, 5 Mar 2024 01:11:57 -0500 Subject: [PATCH] CommandHandler --- .prettierrc | 5 ++- .vscode/settings.json | 1 + bun.lockb | Bin 6438 -> 6406 bytes package.json | 5 +-- src/index.ts | 41 ++++++++++++++++++- src/interactions/ping.ts | 33 ++++++++++++++++ src/lib/classes/ApplicationCommand.ts | 5 +++ src/lib/classes/MessageCommand.ts | 6 +++ src/lib/classes/Modal.ts | 22 +++++++++++ src/lib/classes/SlashCommand.ts | 6 +++ src/lib/classes/UserCommand.ts | 6 +++ src/lib/handlers/AutocompleteHandler.ts | 0 src/lib/handlers/CommandHandler.ts | 27 +++++++++++++ src/lib/handlers/ComponentHandler.ts | 0 src/lib/handlers/InteractionHandler.ts | 50 ++++++++++++++++++++++++ src/lib/handlers/ModalHandler.ts | 0 src/lib/handlers/RESTHandler.ts | 7 ++++ src/lib/types/command.d.ts | 6 +++ src/lib/types/environment.d.ts | 5 +++ 19 files changed, 219 insertions(+), 6 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 src/interactions/ping.ts create mode 100644 src/lib/classes/ApplicationCommand.ts create mode 100644 src/lib/classes/MessageCommand.ts create mode 100644 src/lib/classes/Modal.ts create mode 100644 src/lib/classes/SlashCommand.ts create mode 100644 src/lib/classes/UserCommand.ts create mode 100644 src/lib/handlers/AutocompleteHandler.ts create mode 100644 src/lib/handlers/CommandHandler.ts create mode 100644 src/lib/handlers/ComponentHandler.ts create mode 100644 src/lib/handlers/InteractionHandler.ts create mode 100644 src/lib/handlers/ModalHandler.ts create mode 100644 src/lib/handlers/RESTHandler.ts create mode 100644 src/lib/types/command.d.ts create mode 100644 src/lib/types/environment.d.ts diff --git a/.prettierrc b/.prettierrc index 222861c..47b748f 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,4 +1,5 @@ { - "tabWidth": 2, - "useTabs": false + "tabWidth": 4, + "useTabs": false, + "printWidth": 120 } diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1 @@ +{} diff --git a/bun.lockb b/bun.lockb index 7655fa052286accc9f080304b57b09591a16062a..e628973eb63ba41d7d47a896e33d9a2f4be9ffb3 100755 GIT binary patch delta 914 zcmcgqJuE{}6u$RW-&0Xuy;u6eA|ixzK>RKK5{ou|l8QwlkrIC?iR#j!7(`;Jo*0Ay zgN>jV3^s{HFo;?#BBn|t229Rr?u!m;bdoRUo_oG~{_feWU8;?C^U!KfbES_lrZP6~ zpAL=$LX2IZ?Ld2oGiF0wCG6FMUUmI~y=+`dt>MGLSR{P+8sjdgH@JLk_~4;(>&0hos`+7Fdu6U|F%l zv+Utks8I&uP1(nan|h&s?Fa=yJvkBh!StDodTJvBWeW_ox|up5kBp!xnA4;Q(wQbk zkg#v6Gc_$lvvkyNZ&D}Nk^2d`o=r3i60yDh9efYKZm4bU)lm?D+ z1Cv@O>}wsi)X4EB0H4|ltm$=d>MVn#u0fZcYn=;@PtC%%UJUQfcDU5bW6slfec_w* E4Sc?r*Z=?k delta 917 zcmZoOT4prCk8#>We@l%N1_lN}28MbuDrj1wdqfr@>AiiLqRGANyVkx`xLCBx(@COb)GMm&ln z^MSHnIE~oJIQbW&-Q*uk5{#vj1)1#`OE(8HKW40F1KI|{OhC*5wHcXa28wY*#X&R+ z5c2~uNL&brLHb017-%_zD3mV_$+M7lniziF6l}xr}_nv%%jd$`? zc5g=J$q(7XCwH*(PVQy%W@MdwlP!F+1;-Y4T~?smK>h*wl?#a3ff(d3F(3xUG6Tp@ z4!~#yfhChA1+;BJApwkcu#Z5Y0}2U{7${^wG>8u}6=V`f9wr8+C)WxnbKZcOmo#~$ zfI3Kc@_B(~Gg!KMK8HW##@0|XCXj((083#<8I!Vn_Ps4&Vmu2J2PPe08l1dGP(l~C z0t`bL&rYrvRMa&C8V)jG_9mZf^N`}32qR(17?x~-GLspFB&A_iVl$DDe5TNK&JEC{ z{$aAGu) { + this.data = Object.assign(this.data, { components }); + return this; + } +} diff --git a/src/lib/classes/SlashCommand.ts b/src/lib/classes/SlashCommand.ts new file mode 100644 index 0000000..856ced1 --- /dev/null +++ b/src/lib/classes/SlashCommand.ts @@ -0,0 +1,6 @@ +import { ApplicationCommandTypes } from "@discordeno/types"; +import ApplicationCommand from "./ApplicationCommand"; + +export default class SlashCommand extends ApplicationCommand { + static commandType = ApplicationCommandTypes.ChatInput; +} diff --git a/src/lib/classes/UserCommand.ts b/src/lib/classes/UserCommand.ts new file mode 100644 index 0000000..edb3bbe --- /dev/null +++ b/src/lib/classes/UserCommand.ts @@ -0,0 +1,6 @@ +import { ApplicationCommandTypes } from "@discordeno/types"; +import ApplicationCommand from "./ApplicationCommand"; + +export default class SlashCommand extends ApplicationCommand { + static commandType = ApplicationCommandTypes.User; +} diff --git a/src/lib/handlers/AutocompleteHandler.ts b/src/lib/handlers/AutocompleteHandler.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/lib/handlers/CommandHandler.ts b/src/lib/handlers/CommandHandler.ts new file mode 100644 index 0000000..70f438d --- /dev/null +++ b/src/lib/handlers/CommandHandler.ts @@ -0,0 +1,27 @@ +import type { Bot, Interaction, InteractionResponse } from "@discordeno/bot"; +import type { Command } from "../types/command"; +import REST from "./RESTHandler"; + +export const commands = new Map(); + +export function load(client: Bot, interactions: Map) { + for (let [key, value] of interactions) { + commands.set(key, new value()); + } +} + +export function handle(interaction: Interaction) { + if (!interaction.data) return; + + const resolved = commands.get(interaction.data.name); + if (!resolved) return interaction.respond("What the fuck did you do"); + resolved + .run() + .then((response: InteractionResponse) => + REST.sendInteractionResponse(interaction.id, interaction.token, response) + ) + .catch((e: Error) => { + console.log("CommandHandler.ts -> Exception"); + console.log(e); + }); +} diff --git a/src/lib/handlers/ComponentHandler.ts b/src/lib/handlers/ComponentHandler.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/lib/handlers/InteractionHandler.ts b/src/lib/handlers/InteractionHandler.ts new file mode 100644 index 0000000..def67af --- /dev/null +++ b/src/lib/handlers/InteractionHandler.ts @@ -0,0 +1,50 @@ +import { InteractionTypes, type Bot, type Interaction, InteractionResponseTypes } from "@discordeno/bot"; +import { readdir } from "node:fs/promises"; +import REST from "./RESTHandler"; + +import * as CommandHandler from "./CommandHandler"; + +export const interactions = new Map(); + +export async function load(client: Bot) { + const files = await readdir("src/interactions"); + + for (let i = 0; i < files.length; i++) { + let value = files[i]; + const interaction = await import(import.meta.dirname + "/../../interactions/" + value); + interactions.set(interaction.default.name, interaction.default); + } + + CommandHandler.load(client, interactions); +} + +export function handle(interaction: Interaction) { + const { type } = interaction; + + if (type == InteractionTypes.ApplicationCommand) { + CommandHandler.handle(interaction); + } else if (type == InteractionTypes.MessageComponent) { + REST.sendInteractionResponse(interaction.id, interaction.token, { + type: InteractionResponseTypes.ChannelMessageWithSource, + data: { + content: "Not Implemented", + flags: 64, + }, + }); + } else if (type == InteractionTypes.ApplicationCommandAutocomplete) { + REST.sendInteractionResponse(interaction.id, interaction.token, { + type: InteractionResponseTypes.ApplicationCommandAutocompleteResult, + data: { + choices: [{ name: "not_implemented", value: "Not Implemented" }], + }, + }); + } else if (type == InteractionTypes.ModalSubmit) { + REST.sendInteractionResponse(interaction.id, interaction.token, { + type: InteractionResponseTypes.ChannelMessageWithSource, + data: { + content: "Not Implemented", + flags: 64, + }, + }); + } +} diff --git a/src/lib/handlers/ModalHandler.ts b/src/lib/handlers/ModalHandler.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/lib/handlers/RESTHandler.ts b/src/lib/handlers/RESTHandler.ts new file mode 100644 index 0000000..cdde6f3 --- /dev/null +++ b/src/lib/handlers/RESTHandler.ts @@ -0,0 +1,7 @@ +import { createRestManager } from "@discordeno/rest"; + +const REST = createRestManager({ + token: process.env.DISCORD_TOKEN, +}); + +export default REST; diff --git a/src/lib/types/command.d.ts b/src/lib/types/command.d.ts new file mode 100644 index 0000000..3112e00 --- /dev/null +++ b/src/lib/types/command.d.ts @@ -0,0 +1,6 @@ +import { type Interaction, type InteractionCallbackData, type InteractionResponse } from "@discordeno/bot"; + +interface Command { + run(interaction: Interaction): Promise; + autocomplete?(interaction: Interaction): Promise; +} diff --git a/src/lib/types/environment.d.ts b/src/lib/types/environment.d.ts new file mode 100644 index 0000000..79d535b --- /dev/null +++ b/src/lib/types/environment.d.ts @@ -0,0 +1,5 @@ +declare module "bun" { + interface Env { + DISCORD_TOKEN: string; + } +}