pixelverse-helper/src/start-bot.ts
2023-08-28 20:17:50 -04:00

143 lines
4.2 KiB
TypeScript

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<void> {
// 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);
});