diff options
author | TymanWasTaken <32660892+tymanwastaken@users.noreply.github.com> | 2021-04-27 21:06:22 -0600 |
---|---|---|
committer | TymanWasTaken <32660892+tymanwastaken@users.noreply.github.com> | 2021-04-27 21:06:22 -0600 |
commit | 763fb7d98c3accbb21adf035a7cf0a83cb9533c9 (patch) | |
tree | 9d333fbca2a2a8e19d79904a4e29226174925cfc /src/lib/extensions/BotClient.ts | |
download | tanzanite-763fb7d98c3accbb21adf035a7cf0a83cb9533c9.tar.gz tanzanite-763fb7d98c3accbb21adf035a7cf0a83cb9533c9.tar.bz2 tanzanite-763fb7d98c3accbb21adf035a7cf0a83cb9533c9.zip |
legit just copy utilibot v2 code
Diffstat (limited to 'src/lib/extensions/BotClient.ts')
-rw-r--r-- | src/lib/extensions/BotClient.ts | 274 |
1 files changed, 274 insertions, 0 deletions
diff --git a/src/lib/extensions/BotClient.ts b/src/lib/extensions/BotClient.ts new file mode 100644 index 0000000..4d1c31a --- /dev/null +++ b/src/lib/extensions/BotClient.ts @@ -0,0 +1,274 @@ +import { + AkairoClient, + CommandHandler, + InhibitorHandler, + ListenerHandler +} from 'discord-akairo'; +import { Guild } from 'discord.js'; +import * as path from 'path'; +import { DataTypes, Model, Sequelize } from 'sequelize'; +import * as Models from '../types/Models'; +import { BotGuild } from './BotGuild'; +import { BotMessage } from './BotMessage'; +import { Util } from './Util'; +import * as Tasks from '../../tasks'; +import { v4 as uuidv4 } from 'uuid'; +import { exit } from 'process'; +import { TopGGHandler } from '../utils/TopGG'; + +export interface BotConfig { + credentials: { + botToken: string; + dblToken: string; + dblWebhookAuth: string; + }; + owners: string[]; + prefix: string; + dev: boolean; + db: { + username: string; + password: string; + host: string; + port: number; + }; + topGGPort: number; + channels: { + dblVote: string; + log: string; + error: string; + dm: string; + command: string; + }; +} + +export class BotClient extends AkairoClient { + public config: BotConfig; + public listenerHandler: ListenerHandler; + public inhibitorHandler: InhibitorHandler; + public commandHandler: CommandHandler; + public topGGHandler: TopGGHandler; + public util: Util; + public ownerID: string[]; + public db: Sequelize; + constructor(config: BotConfig) { + super( + { + ownerID: config.owners + }, + { + allowedMentions: { parse: ['users'] } // No everyone or role mentions by default + } + ); + + // 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 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 ? 'utilibot-dev' : 'utilibot', + this.config.db.username, + this.config.db.password, + { + dialect: 'postgres', + host: this.config.db.host, + port: this.config.db.port, + logging: false + } + ); + this.topGGHandler = new TopGGHandler(this); + BotGuild.install(); + BotMessage.install(); + } + + // 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 + }; + for (const loader of Object.keys(loaders)) { + try { + loaders[loader].loadAll(); + console.log('Successfully loaded ' + loader + '.'); + } catch (e) { + console.error('Unable to load loader ' + loader + ' with error ' + e); + } + } + await this.dbPreInit(); + Object.keys(Tasks).forEach((t) => { + setInterval(() => Tasks[t](this), 60000); + }); + this.topGGHandler.init(); + } + + public async dbPreInit(): Promise<void> { + await this.db.authenticate(); + Models.Guild.init( + { + id: { + type: DataTypes.STRING, + primaryKey: true + }, + prefix: { + type: DataTypes.STRING, + allowNull: false, + defaultValue: this.config.prefix + } + }, + { sequelize: this.db } + ); + Models.Modlog.init( + { + id: { + type: DataTypes.STRING, + primaryKey: true, + allowNull: false, + defaultValue: uuidv4 + }, + type: { + type: new DataTypes.ENUM( + 'BAN', + 'TEMPBAN', + 'MUTE', + 'TEMPMUTE', + 'KICK', + 'WARN' + ), + allowNull: false + }, + user: { + type: DataTypes.STRING, + allowNull: false + }, + moderator: { + type: DataTypes.STRING, + allowNull: false + }, + duration: { + type: DataTypes.STRING, + allowNull: true + }, + reason: { + type: DataTypes.STRING, + allowNull: true + }, + guild: { + type: DataTypes.STRING, + references: { + model: Models.Guild as typeof Model + } + } + }, + { sequelize: this.db } + ); + Models.Ban.init( + { + id: { + type: DataTypes.STRING, + primaryKey: true, + allowNull: false, + defaultValue: uuidv4 + }, + user: { + type: DataTypes.STRING, + allowNull: false + }, + guild: { + type: DataTypes.STRING, + allowNull: false, + references: { + model: Models.Guild as typeof Model, + key: 'id' + } + }, + expires: { + type: DataTypes.DATE, + allowNull: true + }, + reason: { + type: DataTypes.STRING, + allowNull: true + }, + modlog: { + type: DataTypes.STRING, + allowNull: false, + references: { + model: Models.Modlog as typeof Model + } + } + }, + { sequelize: this.db } + ); + try { + await this.db.sync({ alter: true }); // 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(e.stack); + exit(2); + } + } + + public destroy(relogin = true): void | Promise<string> { + super.destroy(); + if (relogin) { + return this.login(this.token); + } + } +} |