95 lines
2.6 KiB
TypeScript
95 lines
2.6 KiB
TypeScript
import {
|
|
AkairoClient,
|
|
CommandHandler,
|
|
InhibitorHandler,
|
|
ListenerHandler,
|
|
} from "discord-akairo";
|
|
import { EventEmitter } from "events";
|
|
import { Config } from "../config/Config";
|
|
import { parseDuration } from "../config/Constants";
|
|
import { Appeal } from "../entity/Appeal";
|
|
import { errorEmbed } from "./Util";
|
|
|
|
class Bot extends AkairoClient {
|
|
static config: Config;
|
|
|
|
inhibitorHandler: InhibitorHandler;
|
|
commandHandler: CommandHandler;
|
|
listenerHandler: ListenerHandler;
|
|
|
|
constructor(config: Config, appealEmitter: EventEmitter) {
|
|
super({}, { partials: ["REACTION", "MESSAGE"] });
|
|
|
|
Bot.config = config;
|
|
super.login(config.bot.token);
|
|
|
|
this.inhibitorHandler = new InhibitorHandler(this, {
|
|
directory: `${__dirname}/inhibitors`,
|
|
});
|
|
|
|
this.commandHandler = new CommandHandler(this, {
|
|
directory: `${__dirname}/commands`,
|
|
prefix: config.bot.prefix,
|
|
argumentDefaults: {
|
|
prompt: {
|
|
retries: 0,
|
|
time: 15000,
|
|
cancel: () => errorEmbed("Command Cancelled"),
|
|
ended: () =>
|
|
errorEmbed("Invalid input").setDescription("Command ended."),
|
|
timeout: () =>
|
|
errorEmbed("Timed out").setDescription(
|
|
"No response received for 15 seconds."
|
|
),
|
|
},
|
|
},
|
|
});
|
|
|
|
this.listenerHandler = new ListenerHandler(this, {
|
|
directory: `${__dirname}/listeners`,
|
|
});
|
|
|
|
this.listenerHandler.setEmitters({
|
|
commandHandler: this.commandHandler,
|
|
inhibitorHandler: this.inhibitorHandler,
|
|
listenerHandler: this.listenerHandler,
|
|
appealHandler: appealEmitter,
|
|
});
|
|
|
|
this.commandHandler.useInhibitorHandler(this.inhibitorHandler);
|
|
|
|
this.commandHandler.resolver.addType("timestring", (_, phrase) => {
|
|
if (!phrase) return null;
|
|
|
|
const d = parseDuration(phrase);
|
|
if (d === "") return null;
|
|
return d;
|
|
});
|
|
|
|
this.commandHandler.resolver.addType("appeal", async (message, phrase) => {
|
|
if (!phrase) return null;
|
|
if (!message.guild) return null;
|
|
|
|
const appeal = await Appeal.appeal(phrase, message.guild.id)
|
|
.then((a) => a)
|
|
.catch((_) => null);
|
|
return appeal;
|
|
});
|
|
|
|
this.commandHandler.resolver.addType("optionalDate", (_, phrase) => {
|
|
if (!phrase) return null;
|
|
if (phrase === "never") return "never";
|
|
if (phrase === "now") return "now";
|
|
const timestamp = Date.parse(phrase);
|
|
if (isNaN(timestamp)) return null;
|
|
return new Date(timestamp);
|
|
});
|
|
|
|
this.inhibitorHandler.loadAll();
|
|
this.commandHandler.loadAll();
|
|
this.listenerHandler.loadAll();
|
|
}
|
|
}
|
|
|
|
export default Bot;
|