Restructure bot
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
import { EmbedBuilder, type Message } from "discord.js";
|
||||
import type { Command } from "../service";
|
||||
import { api } from "../../../util";
|
||||
import type { Command } from "../../models";
|
||||
import { api } from "../../util";
|
||||
|
||||
const ATTRIBUTE_EMOJI: Record<string, string> = {
|
||||
Strength: "💪",
|
||||
@@ -12,8 +12,11 @@ const ATTRIBUTE_EMOJI: Record<string, string> = {
|
||||
export default {
|
||||
name: "stats",
|
||||
description: "View your fitness statistics!",
|
||||
usage: ".stats",
|
||||
execute: async (message: Message) => {
|
||||
const res = await api.accounts({ id: `@${message.author.id}` }).stats.get();
|
||||
if (res.error) return;
|
||||
|
||||
if (!res.data) {
|
||||
await message.reply("No stats found yet — submit an assessment first!");
|
||||
return;
|
||||
@@ -38,4 +41,4 @@ export default {
|
||||
|
||||
await message.reply({ embeds: [embed] });
|
||||
}
|
||||
} as Command;
|
||||
} satisfies Command;
|
||||
+10
-12
@@ -1,20 +1,13 @@
|
||||
import { Client, Events, GatewayIntentBits } from 'discord.js';
|
||||
import { CommandService } from './services/cmd/service';
|
||||
import CommandService from './services/command';
|
||||
|
||||
const client = new Client({
|
||||
intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent]
|
||||
});
|
||||
|
||||
// SERVICES
|
||||
// -----------------------
|
||||
const s = (() => {
|
||||
const Commands = new CommandService(client);
|
||||
return { Commands };
|
||||
})();
|
||||
|
||||
client.once(Events.ClientReady, async (readyClient) => {
|
||||
// Initialize
|
||||
await s.Commands.init();
|
||||
// Initialize services
|
||||
await CommandService.init();
|
||||
|
||||
console.log(`Ready! Logged in as ${readyClient.user.tag}`);
|
||||
});
|
||||
@@ -25,8 +18,13 @@ client.on("guildMemberAdd", async (guildMember) => {
|
||||
client.on("messageCreate", async (message) => {
|
||||
if (message.author.bot) return;
|
||||
|
||||
const command = s.Commands.parse(message);
|
||||
if (command) command.execute(message);
|
||||
try {
|
||||
const command = CommandService.parse(message);
|
||||
if (command) await command.execute(message);
|
||||
}
|
||||
catch (err) {
|
||||
console.error(err);
|
||||
}
|
||||
});
|
||||
|
||||
client.login(Bun.env.BOT_TOKEN);
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
import type { Message } from "discord.js";
|
||||
|
||||
// COMMANDS
|
||||
|
||||
export interface Command {
|
||||
name: string,
|
||||
description: string,
|
||||
usage: string,
|
||||
execute: (message: Message) => void | Promise<void>
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
import type { Client, Message } from "discord.js";
|
||||
import { readdir } from "fs/promises";
|
||||
|
||||
const CMD_PREFIX = ".";
|
||||
|
||||
export interface Command {
|
||||
name: string,
|
||||
description: string,
|
||||
execute: (message: Message) => void | Promise<void>
|
||||
}
|
||||
|
||||
export class CommandService {
|
||||
private client: Client
|
||||
private registry: Record<string, Command> = {}
|
||||
|
||||
constructor(client: Client) {
|
||||
this.client = client;
|
||||
}
|
||||
|
||||
async init() {
|
||||
const commands = await Promise.all(
|
||||
(await readdir(`${import.meta.dir}/registry`)).map(async file => (await import(`./registry/${file}`)).default as Command)
|
||||
);
|
||||
for (const command of commands)
|
||||
this.registry[command.name] = command;
|
||||
};
|
||||
|
||||
parse(message: Message): Command | undefined {
|
||||
if (!message.content.startsWith(CMD_PREFIX)) return;
|
||||
const name = message.content.slice(CMD_PREFIX.length).split(/\s+/)[0];
|
||||
return this.registry[name ?? ""];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
import type { Message } from "discord.js";
|
||||
import { readdir } from "fs/promises";
|
||||
import { dirname } from "path";
|
||||
import type { Command } from "../models";
|
||||
|
||||
const CMD_PREFIX = ".";
|
||||
const CMD_REGISTRY_DIR = `${dirname(Bun.main)}/cmd/registry`;
|
||||
|
||||
export default abstract class CommandService {
|
||||
private static registry: Record<string, Command> = {}
|
||||
|
||||
static async init() {
|
||||
const commands = await Promise.all(
|
||||
(await readdir(CMD_REGISTRY_DIR)).map(async file => (await import(`${CMD_REGISTRY_DIR}/${file}`)).default satisfies Command)
|
||||
);
|
||||
for (const command of commands)
|
||||
CommandService.registry[command.name] = command;
|
||||
};
|
||||
|
||||
static parse(message: Message): Command | undefined {
|
||||
if (!message.content.startsWith(CMD_PREFIX)) return;
|
||||
const name = message.content.slice(CMD_PREFIX.length).split(/\s+/)[0];
|
||||
return this.registry[name ?? ""];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user