Add discord slash commands

This commit is contained in:
Hri7566 2024-03-20 23:03:26 -04:00
parent eccc10eb48
commit 2b1ce42638
3 changed files with 106 additions and 1 deletions

View File

@ -1,2 +1,4 @@
# serverID: "1218101891838251060"
# defaultChannelID: "1218101892660330578"
serverID: "841331769051578413"
defaultChannelID: "841331769658703954"

View File

@ -1,4 +1,5 @@
import { getBacks, flushBacks } from "@server/backs";
import { commandGroups } from "@server/commands/groups";
import { handleCommand } from "@server/commands/handler";
import { prefixes } from "@server/commands/prefixes";
import { checkToken, tokenToID } from "@server/data/token";
@ -52,6 +53,22 @@ export const appRouter = router({
return prefixes;
}),
commandList: publicProcedure.query(async opts => {
let groups = [];
for (const group of commandGroups) {
let commands = group.commands.filter(cmd => cmd.visible);
groups.push({
id: group.id,
displayName: group.displayName,
commands
});
}
return groups;
}),
command: privateProcedure
.input(
z.object({

View File

@ -1,5 +1,5 @@
import { EventEmitter } from "events";
import Discord from "discord.js";
import Discord, { SlashCommandBuilder } from "discord.js";
import { Logger } from "@util/Logger";
import { CosmicColor } from "@util/CosmicColor";
import gettRPC from "@util/api/trpc";
@ -53,6 +53,37 @@ export class DiscordBot extends EventEmitter {
if (!channel) throw "Unable to find default Discord channel.";
this.defaultChannel = channel as Discord.TextChannel;
const groups = await this.trpc.commandList.query();
if (!groups) throw "Unable to get command list.";
const builders = [];
for (const group of groups) {
for (const command of group.commands) {
const builder = new SlashCommandBuilder();
builder.setName(command.aliases[0]);
builder.setDescription(command.description);
builder.addStringOption(option =>
option
.setName("args")
.setDescription("Command arguments")
);
builders.push(builder);
}
}
const rest = new Discord.REST().setToken(this.token || "");
rest.put(
Discord.Routes.applicationGuildCommands(
this.client.user?.id || "",
this.conf.serverID
),
{
body: builders
}
);
});
this.client.on("guildMemberAdd", async member => {
@ -193,5 +224,60 @@ export class DiscordBot extends EventEmitter {
msg.message.split(`@${msg.id}`).join(`<@${msg.id}>`)
);
});
this.client.on("interactionCreate", async msg => {
if (!this.server) return;
if (msg.guildId !== this.server.id) return;
if (!msg.isCommand()) return;
const existingRole = this.server.roles.cache.find(
role => role.name === msg.user.id
);
if (!existingRole) return;
let prefixes: string[];
try {
prefixes = await this.trpc.prefixes.query();
} catch (err) {
this.logger.error(err);
this.logger.warn("Unable to contact server");
return;
}
let usedPrefix = prefixes[0];
if (!usedPrefix) return;
this.logger.debug("Args:", msg.options.data);
const argsOption = msg.options.get("args");
const args = argsOption
? argsOption.value
? argsOption.value.toString().split(" ")
: []
: [];
const command = await this.trpc.command.query({
channel: msg.channelId || this.conf.defaultChannelID,
args: args,
command: msg.commandName,
prefix: usedPrefix,
user: {
id: msg.user.id,
name: msg.user.displayName,
color: existingRole.hexColor
}
});
if (!command) return;
if (command.response)
msg.reply(
command.response
.split(`@${msg.user.id}`)
.join(`<@${msg.user.id}>`)
);
});
}
}