2019-10-14 15:46:10 -04:00
|
|
|
import Eris from 'eris';
|
|
|
|
import mongoose from 'mongoose';
|
2019-10-20 19:28:35 -04:00
|
|
|
import signale from 'signale';
|
2019-10-14 15:46:10 -04:00
|
|
|
import fs from 'fs-extra';
|
|
|
|
import path from 'path';
|
2019-10-27 20:30:03 -04:00
|
|
|
import config from './config.json';
|
2019-10-18 18:16:32 -04:00
|
|
|
import { Account, AccountInterface, Moderation, ModerationInterface, Domain, DomainInterface } from './models';
|
2019-10-15 20:34:13 -04:00
|
|
|
import { emojis } from './stores';
|
2019-10-31 14:32:59 -04:00
|
|
|
import { Command, Util, Collection } from './class';
|
2019-10-14 15:46:10 -04:00
|
|
|
|
2019-10-14 18:01:05 -04:00
|
|
|
|
2019-10-14 15:46:10 -04:00
|
|
|
export default class Client extends Eris.Client {
|
2019-10-22 18:40:02 -04:00
|
|
|
public config: { 'token': string; 'cloudflare': string; 'prefix': string; 'emailPass': string; };
|
2019-10-20 19:28:35 -04:00
|
|
|
|
2019-10-14 23:32:37 -04:00
|
|
|
public util: Util;
|
|
|
|
|
2019-10-31 16:12:08 -04:00
|
|
|
public commands: Collection<Command>;
|
2019-10-14 23:32:37 -04:00
|
|
|
|
2019-10-14 15:46:10 -04:00
|
|
|
public aliases: Map<string, string>;
|
2019-10-14 23:32:37 -04:00
|
|
|
|
2019-10-17 15:42:57 -04:00
|
|
|
public db: { Account: mongoose.Model<AccountInterface>; Domain: mongoose.Model<DomainInterface>; Moderation: mongoose.Model<ModerationInterface>; };
|
2019-10-14 23:32:37 -04:00
|
|
|
|
|
|
|
public stores: { emojis: { success: string, loading: string, error: string }; };
|
|
|
|
|
2019-10-20 19:28:35 -04:00
|
|
|
public signale: signale.Signale;
|
|
|
|
|
2019-10-14 15:46:10 -04:00
|
|
|
constructor() {
|
2019-10-14 23:32:37 -04:00
|
|
|
super(config.token, { getAllUsers: true, restMode: true, defaultImageFormat: 'png' });
|
2019-10-14 15:46:10 -04:00
|
|
|
|
2019-10-27 20:17:29 -04:00
|
|
|
process.title = 'cloudservices';
|
2019-10-20 19:28:35 -04:00
|
|
|
this.config = config;
|
2019-10-14 23:32:37 -04:00
|
|
|
this.util = new Util(this);
|
2019-10-31 14:32:59 -04:00
|
|
|
this.commands = new Collection({ base: Command });
|
2019-10-17 15:42:57 -04:00
|
|
|
this.db = { Account, Domain, Moderation };
|
2019-10-14 23:32:37 -04:00
|
|
|
this.stores = { emojis };
|
2019-10-20 19:28:35 -04:00
|
|
|
this.signale = signale;
|
|
|
|
this.signale.config({
|
|
|
|
displayDate: true,
|
|
|
|
displayTimestamp: true,
|
|
|
|
displayFilename: true,
|
|
|
|
});
|
2019-10-27 20:54:48 -04:00
|
|
|
this.events();
|
2019-10-26 00:02:44 -04:00
|
|
|
this.loadFunctions();
|
|
|
|
this.init();
|
|
|
|
}
|
|
|
|
|
2019-10-27 20:54:48 -04:00
|
|
|
private async events() {
|
|
|
|
process.on('unhandledRejection', (error) => {
|
|
|
|
this.signale.error(error);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2019-10-26 00:02:44 -04:00
|
|
|
private async loadFunctions() {
|
|
|
|
const functions = await fs.readdir('./functions');
|
|
|
|
functions.forEach(async (func) => {
|
2019-10-29 12:13:40 -04:00
|
|
|
if (func === 'index.ts' || func === 'index.js') return;
|
2019-10-26 00:02:44 -04:00
|
|
|
try {
|
2019-10-28 18:11:08 -04:00
|
|
|
(require(`./functions/${func}`).default)(this);
|
2019-10-26 00:02:44 -04:00
|
|
|
} catch (error) {
|
2019-10-29 12:09:12 -04:00
|
|
|
this.signale.error(`Error occured loading ${func}`);
|
2019-10-26 00:02:44 -04:00
|
|
|
await this.util.handleError(error);
|
|
|
|
}
|
|
|
|
});
|
2019-10-14 15:46:10 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
public loadCommand(commandPath: string) {
|
|
|
|
// eslint-disable-next-line no-useless-catch
|
|
|
|
try {
|
2019-10-27 20:47:45 -04:00
|
|
|
// eslint-disable-next-line
|
2019-10-31 14:32:59 -04:00
|
|
|
const command: Command = new (require(commandPath).default)(this);
|
|
|
|
if (command.subcmds.length) {
|
|
|
|
command.subcmds.forEach((C) => {
|
|
|
|
const cmd: Command = new C(this);
|
|
|
|
command.subcommands.add(cmd.name, cmd);
|
|
|
|
});
|
|
|
|
delete command.subcmds;
|
|
|
|
}
|
|
|
|
this.commands.add(command.name, command);
|
2019-10-20 19:28:35 -04:00
|
|
|
this.signale.complete(`Loaded command ${command.name}`);
|
2019-10-14 15:46:10 -04:00
|
|
|
} catch (err) { throw err; }
|
|
|
|
}
|
|
|
|
|
|
|
|
public async init() {
|
|
|
|
const evtFiles = await fs.readdir('./events/');
|
|
|
|
const commands = await fs.readdir(path.join(__dirname, './commands/'));
|
2019-10-14 23:32:37 -04:00
|
|
|
commands.forEach((command) => {
|
2019-10-27 20:43:48 -04:00
|
|
|
if (command === 'index.js') return;
|
2019-10-20 19:28:35 -04:00
|
|
|
this.loadCommand(`./commands/${command}`);
|
2019-10-14 15:46:10 -04:00
|
|
|
});
|
2019-10-14 23:32:37 -04:00
|
|
|
|
|
|
|
evtFiles.forEach((file) => {
|
2019-10-14 15:46:10 -04:00
|
|
|
const eventName = file.split('.')[0];
|
2019-10-27 20:47:45 -04:00
|
|
|
if (file === 'index.js') return;
|
|
|
|
// eslint-disable-next-line
|
|
|
|
const event = new (require(`./events/${file}`).default)(this);
|
2019-10-20 19:28:35 -04:00
|
|
|
this.signale.complete(`Loaded event ${eventName}`);
|
2019-10-14 15:46:10 -04:00
|
|
|
this.on(eventName, (...args) => event.run(...args));
|
|
|
|
delete require.cache[require.resolve(`./events/${file}`)];
|
|
|
|
});
|
|
|
|
|
2019-10-27 23:05:24 -04:00
|
|
|
await mongoose.connect(config.mongoURL, { useNewUrlParser: true, useUnifiedTopology: true });
|
2019-10-27 20:10:23 -04:00
|
|
|
await this.connect();
|
2019-10-29 12:15:20 -04:00
|
|
|
this.on('ready', () => {
|
|
|
|
this.signale.info(`Connected to Discord as ${this.user.username}#${this.user.discriminator}`);
|
|
|
|
});
|
2019-10-14 15:46:10 -04:00
|
|
|
}
|
2019-10-14 23:32:37 -04:00
|
|
|
}
|
2019-10-27 20:23:01 -04:00
|
|
|
|
|
|
|
// eslint-disable-next-line
|
|
|
|
new Client();
|