import { REST } from '@discordjs/rest'; import { Options, Partials } from 'discord.js'; import { createRequire } from 'node:module'; import { Button } from './buttons/index.js'; import { DevCommand, HelpCommand, InfoCommand, TestCommand } from './commands/chat/index.js'; import { ChatCommandMetadata, Command, MessageCommandMetadata, UserCommandMetadata, } from './commands/index.js'; import { ViewDateSent } from './commands/message/index.js'; import { ViewDateJoined } from './commands/user/index.js'; import { ButtonHandler, CommandHandler, GuildJoinHandler, GuildLeaveHandler, MessageHandler, ReactionHandler, TriggerHandler, } from './events/index.js'; import { CustomClient } from './extensions/index.js'; import { Job } from './jobs/index.js'; import { Bot } from './models/bot.js'; import { Reaction } from './reactions/index.js'; import { CommandRegistrationService, EventDataService, JobService, Logger, } from './services/index.js'; import { Trigger } from './triggers/index.js'; const require = createRequire(import.meta.url); let Config = require('../config/config.json'); let Logs = require('../lang/logs.json'); async function start(): Promise { // Services let eventDataService = new EventDataService(); // Client let client = new CustomClient({ intents: Config.client.intents, partials: (Config.client.partials as string[]).map(partial => Partials[partial]), makeCache: Options.cacheWithLimits({ // Keep default caching behavior ...Options.DefaultMakeCacheSettings, // Override specific options from config ...Config.client.caches, }), }); // Commands let commands: Command[] = [ // Chat Commands new DevCommand(), new HelpCommand(), new InfoCommand(), new TestCommand(), // Message Context Commands new ViewDateSent(), // User Context Commands new ViewDateJoined(), // TODO: Add new commands here ]; // Buttons let buttons: Button[] = [ // TODO: Add new buttons here ]; // Reactions let reactions: Reaction[] = [ // TODO: Add new reactions here ]; // Triggers let triggers: Trigger[] = [ // TODO: Add new triggers here ]; // Event handlers let guildJoinHandler = new GuildJoinHandler(eventDataService); let guildLeaveHandler = new GuildLeaveHandler(); let commandHandler = new CommandHandler(commands, eventDataService); let buttonHandler = new ButtonHandler(buttons, eventDataService); let triggerHandler = new TriggerHandler(triggers, eventDataService); let messageHandler = new MessageHandler(triggerHandler); let reactionHandler = new ReactionHandler(reactions, eventDataService); // Jobs let jobs: Job[] = [ // TODO: Add new jobs here ]; // Bot let bot = new Bot( Config.client.token, client, guildJoinHandler, guildLeaveHandler, messageHandler, commandHandler, buttonHandler, reactionHandler, new JobService(jobs) ); // Register if (process.argv[2] == 'commands') { try { let rest = new REST({ version: '10' }).setToken(Config.client.token); let commandRegistrationService = new CommandRegistrationService(rest); let localCmds = [ ...Object.values(ChatCommandMetadata).sort((a, b) => (a.name > b.name ? 1 : -1)), ...Object.values(MessageCommandMetadata).sort((a, b) => (a.name > b.name ? 1 : -1)), ...Object.values(UserCommandMetadata).sort((a, b) => (a.name > b.name ? 1 : -1)), ]; await commandRegistrationService.process(localCmds, process.argv); } catch (error) { Logger.error(Logs.error.commandAction, error); } // Wait for any final logs to be written. await new Promise(resolve => setTimeout(resolve, 1000)); process.exit(); } await bot.start(); } process.on('unhandledRejection', (reason, _promise) => { Logger.error(Logs.error.unhandledRejection, reason); }); start().catch(error => { Logger.error(Logs.error.unspecified, error); });