90 lines
3 KiB
TypeScript
90 lines
3 KiB
TypeScript
import { ShardingManager } from 'discord.js';
|
|
import { createRequire } from 'node:module';
|
|
import 'reflect-metadata';
|
|
|
|
import { GuildsController, RootController, ShardsController } from './controllers/index.js';
|
|
import { Job, UpdateServerCountJob } from './jobs/index.js';
|
|
import { Api } from './models/api.js';
|
|
import { Manager } from './models/manager.js';
|
|
import { HttpService, JobService, Logger, MasterApiService } from './services/index.js';
|
|
import { MathUtils, ShardUtils } from './utils/index.js';
|
|
|
|
const require = createRequire(import.meta.url);
|
|
let Config = require('../config/config.json');
|
|
let Debug = require('../config/debug.json');
|
|
let Logs = require('../lang/logs.json');
|
|
|
|
async function start(): Promise<void> {
|
|
Logger.info(Logs.info.appStarted);
|
|
|
|
// Dependencies
|
|
let httpService = new HttpService();
|
|
let masterApiService = new MasterApiService(httpService);
|
|
if (Config.clustering.enabled) {
|
|
await masterApiService.register();
|
|
}
|
|
|
|
// Sharding
|
|
let shardList: number[];
|
|
let totalShards: number;
|
|
try {
|
|
if (Config.clustering.enabled) {
|
|
let resBody = await masterApiService.login();
|
|
shardList = resBody.shardList;
|
|
let requiredShards = await ShardUtils.requiredShardCount(Config.client.token);
|
|
totalShards = Math.max(requiredShards, resBody.totalShards);
|
|
} else {
|
|
let recommendedShards = await ShardUtils.recommendedShardCount(
|
|
Config.client.token,
|
|
Config.sharding.serversPerShard
|
|
);
|
|
shardList = MathUtils.range(0, recommendedShards);
|
|
totalShards = recommendedShards;
|
|
}
|
|
} catch (error) {
|
|
Logger.error(Logs.error.retrieveShards, error);
|
|
return;
|
|
}
|
|
|
|
if (shardList.length === 0) {
|
|
Logger.warn(Logs.warn.managerNoShards);
|
|
return;
|
|
}
|
|
|
|
let shardManager = new ShardingManager('dist/start-bot.js', {
|
|
token: Config.client.token,
|
|
mode: Debug.override.shardMode.enabled ? Debug.override.shardMode.value : 'process',
|
|
respawn: true,
|
|
totalShards,
|
|
shardList,
|
|
});
|
|
|
|
// Jobs
|
|
let jobs: Job[] = [
|
|
Config.clustering.enabled ? undefined : new UpdateServerCountJob(shardManager, httpService),
|
|
// TODO: Add new jobs here
|
|
].filter(Boolean);
|
|
|
|
let manager = new Manager(shardManager, new JobService(jobs));
|
|
|
|
// API
|
|
let guildsController = new GuildsController(shardManager);
|
|
let shardsController = new ShardsController(shardManager);
|
|
let rootController = new RootController();
|
|
let api = new Api([guildsController, shardsController, rootController]);
|
|
|
|
// Start
|
|
await manager.start();
|
|
await api.start();
|
|
if (Config.clustering.enabled) {
|
|
await masterApiService.ready();
|
|
}
|
|
}
|
|
|
|
process.on('unhandledRejection', (reason, _promise) => {
|
|
Logger.error(Logs.error.unhandledRejection, reason);
|
|
});
|
|
|
|
start().catch(error => {
|
|
Logger.error(Logs.error.unspecified, error);
|
|
});
|