aboutsummaryrefslogtreecommitdiff
path: root/src/lib/extensions/BushClient.ts
diff options
context:
space:
mode:
authorIRONM00N <64110067+IRONM00N@users.noreply.github.com>2021-05-26 21:36:50 -0400
committerIRONM00N <64110067+IRONM00N@users.noreply.github.com>2021-05-26 21:36:50 -0400
commit0caccda67d97dd74405aa4ece5d3f07e7c7dfc66 (patch)
treeac124c6c059d96f33fdd3bf1cfec282d8792f16b /src/lib/extensions/BushClient.ts
parent481a157a177e60f023b59e4e9acffc549760db40 (diff)
downloadtanzanite-0caccda67d97dd74405aa4ece5d3f07e7c7dfc66.tar.gz
tanzanite-0caccda67d97dd74405aa4ece5d3f07e7c7dfc66.tar.bz2
tanzanite-0caccda67d97dd74405aa4ece5d3f07e7c7dfc66.zip
some rebranding
Diffstat (limited to 'src/lib/extensions/BushClient.ts')
-rw-r--r--src/lib/extensions/BushClient.ts169
1 files changed, 169 insertions, 0 deletions
diff --git a/src/lib/extensions/BushClient.ts b/src/lib/extensions/BushClient.ts
new file mode 100644
index 0000000..8a8ae91
--- /dev/null
+++ b/src/lib/extensions/BushClient.ts
@@ -0,0 +1,169 @@
+import {
+ AkairoClient,
+ CommandHandler,
+ InhibitorHandler,
+ ListenerHandler,
+ TaskHandler
+} from 'discord-akairo';
+import { Guild } from 'discord.js';
+import * as path from 'path';
+import { Sequelize } from 'sequelize';
+import * as Models from '../models';
+import { Util } from './Util';
+import { exit } from 'process';
+import { Intents } from 'discord.js';
+import * as config from '../../config/options';
+import { Logger } from '../utils/Logger';
+import chalk from 'chalk';
+
+export type BotConfig = typeof config;
+
+export class BushClient extends AkairoClient {
+ public config: BotConfig;
+ public listenerHandler: ListenerHandler;
+ public inhibitorHandler: InhibitorHandler;
+ public commandHandler: CommandHandler;
+ public taskHandler: TaskHandler;
+ public util: Util;
+ public ownerID: string[];
+ public db: Sequelize;
+ public logger: Logger;
+ constructor(config: BotConfig) {
+ super(
+ {
+ ownerID: config.owners,
+ intents: Intents.NON_PRIVILEGED
+ },
+ {
+ allowedMentions: { parse: ['users'] }, // No everyone or role mentions by default
+ intents: Intents.NON_PRIVILEGED
+ }
+ );
+
+ // Set token
+ this.token = config.credentials.botToken;
+
+ // Set config
+ this.config = config;
+
+ // Create listener handler
+ this.listenerHandler = new ListenerHandler(this, {
+ directory: path.join(__dirname, '..', '..', 'listeners'),
+ automateCategories: true
+ });
+
+ // Create inhibitor handler
+ this.inhibitorHandler = new InhibitorHandler(this, {
+ directory: path.join(__dirname, '..', '..', 'inhibitors'),
+ automateCategories: true
+ });
+
+ // Create task handler
+ this.taskHandler = new TaskHandler(this, {
+ directory: path.join(__dirname, '..', '..', 'tasks')
+ });
+
+ // Create command handler
+ this.commandHandler = new CommandHandler(this, {
+ directory: path.join(__dirname, '..', '..', 'commands'),
+ prefix: async ({ guild }: { guild: Guild }) => {
+ const row = await Models.Guild.findByPk(guild.id);
+ if (!row) return this.config.prefix;
+ return row.prefix as string;
+ },
+ allowMention: true,
+ handleEdits: true,
+ commandUtil: true,
+ commandUtilLifetime: 3e5,
+ argumentDefaults: {
+ prompt: {
+ timeout: 'Timed out.',
+ ended: 'Too many tries.',
+ cancel: 'Canceled.',
+ time: 3e4
+ }
+ },
+ ignorePermissions: this.config.owners,
+ ignoreCooldown: this.config.owners,
+ automateCategories: true
+ });
+
+ this.util = new Util(this);
+ this.db = new Sequelize(
+ this.config.dev ? 'bushbot-dev' : 'bushbot',
+ this.config.db.username,
+ this.config.db.password,
+ {
+ dialect: 'postgres',
+ host: this.config.db.host,
+ port: this.config.db.port,
+ logging: false
+ }
+ );
+ this.logger = new Logger(this);
+ }
+
+ // Initialize everything
+ private async _init(): Promise<void> {
+ this.commandHandler.useListenerHandler(this.listenerHandler);
+ this.commandHandler.useInhibitorHandler(this.inhibitorHandler);
+ this.listenerHandler.setEmitters({
+ commandHandler: this.commandHandler,
+ listenerHandler: this.listenerHandler,
+ process
+ });
+ // loads all the handlers
+ const loaders = {
+ commands: this.commandHandler,
+ listeners: this.listenerHandler,
+ inhibitors: this.inhibitorHandler,
+ tasks: this.taskHandler
+ };
+ for (const loader of Object.keys(loaders)) {
+ try {
+ loaders[loader].loadAll();
+ this.logger.log(
+ chalk.green('Successfully loaded ' + chalk.cyan(loader) + '.')
+ );
+ } catch (e) {
+ console.error(
+ chalk.red(
+ 'Unable to load loader ' + chalk.cyan(loader) + ' with error ' + e
+ )
+ );
+ }
+ }
+ this.taskHandler.startAll();
+ await this.dbPreInit();
+ }
+
+ public async dbPreInit(): Promise<void> {
+ await this.db.authenticate();
+ Models.Guild.initModel(this.db, this);
+ Models.Modlog.initModel(this.db);
+ Models.Ban.initModel(this.db);
+ Models.Level.initModel(this.db);
+ try {
+ await this.db.sync(); // Sync all tables to fix everything if updated
+ } catch {
+ // Ignore error
+ }
+ }
+
+ public async start(): Promise<void> {
+ try {
+ await this._init();
+ await this.login(this.token);
+ } catch (e) {
+ console.error(chalk.red(e.stack));
+ exit(2);
+ }
+ }
+
+ public destroy(relogin = true): void | Promise<string> {
+ super.destroy();
+ if (relogin) {
+ return this.login(this.token);
+ }
+ }
+}