2017-09-24 23:07:35 +03:00
|
|
|
const FileSystem = require("fs");
|
|
|
|
const Discord = require("discord.js");
|
|
|
|
const JsonFile = require("jsonfile");
|
|
|
|
const RequireAll = require("require-all");
|
2017-10-02 01:19:10 +03:00
|
|
|
const CoreUtil = require("./Util.js");
|
2017-09-24 23:07:35 +03:00
|
|
|
const HandleMessage = require("./HandleMessage.js");
|
|
|
|
// @ts-ignore
|
|
|
|
const InternalConfig = require("./internal-config.json");
|
|
|
|
|
|
|
|
module.exports = class Client extends Discord.Client {
|
2017-09-20 01:26:30 +03:00
|
|
|
/**
|
2017-09-24 23:07:35 +03:00
|
|
|
* @param {*} token
|
|
|
|
* @param {*} dataFile
|
|
|
|
* @param {*} commandsDir
|
|
|
|
* @param {*} guildDataModel
|
2017-09-20 01:26:30 +03:00
|
|
|
*/
|
2017-09-24 23:07:35 +03:00
|
|
|
constructor(token, dataFile, commandsDir, guildDataModel) {
|
|
|
|
super();
|
2017-09-20 01:26:30 +03:00
|
|
|
|
2017-09-24 23:07:35 +03:00
|
|
|
this._token = token;
|
2017-09-20 01:26:30 +03:00
|
|
|
this.dataFile = dataFile;
|
2017-09-24 23:07:35 +03:00
|
|
|
this.commandsDir = commandsDir;
|
2017-09-20 01:26:30 +03:00
|
|
|
this.guildDataModel = guildDataModel;
|
|
|
|
|
2017-09-24 23:07:35 +03:00
|
|
|
this.commands = RequireAll(this.commandsDir);
|
|
|
|
this.guildsData = FileSystem.existsSync(this.dataFile) ? this.fromJSON(JsonFile.readFileSync(this.dataFile)) : {};
|
2017-09-20 01:26:30 +03:00
|
|
|
|
2017-09-24 23:07:35 +03:00
|
|
|
this.on("ready", this.onReady);
|
|
|
|
this.on("message", this.onMessage);
|
|
|
|
this.on("debug", this.onDebug);
|
2017-11-11 03:28:38 +02:00
|
|
|
this.on("guildCreate", this.onGuildCreate);
|
|
|
|
this.on("guildDelete", this.onGuildDelete);
|
2017-09-24 23:07:35 +03:00
|
|
|
process.on("uncaughtException", err => this.onUnhandledException(this, err));
|
2017-09-20 01:26:30 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
bootstrap() {
|
2017-09-24 23:07:35 +03:00
|
|
|
this.beforeLogin();
|
|
|
|
this.login(this._token);
|
|
|
|
}
|
2017-09-20 01:26:30 +03:00
|
|
|
|
2017-09-24 23:07:35 +03:00
|
|
|
beforeLogin() {
|
|
|
|
setInterval(() => this.writeFile(), InternalConfig.saveIntervalSec * 1000);
|
|
|
|
this.emit("beforeLogin");
|
2017-09-20 01:26:30 +03:00
|
|
|
}
|
|
|
|
|
2017-09-24 23:07:35 +03:00
|
|
|
onReady() {
|
2017-10-19 02:14:01 +03:00
|
|
|
this.user.setGame(InternalConfig.website.replace(/^https?:\/\//, ""));
|
2017-09-24 23:07:35 +03:00
|
|
|
CoreUtil.dateLog(`Registered bot ${this.user.username}`);
|
|
|
|
}
|
2017-09-20 01:26:30 +03:00
|
|
|
|
2017-09-24 23:07:35 +03:00
|
|
|
onMessage(message) {
|
2017-09-25 00:46:58 +03:00
|
|
|
if (message.channel.type === "text" && message.member) {
|
2017-11-11 03:28:38 +02:00
|
|
|
if (!this.guildsData[message.guild.id])
|
2017-10-02 01:19:10 +03:00
|
|
|
this.guildsData[message.guild.id] = new this.guildDataModel({ id: message.guild.id });
|
2017-09-25 00:46:58 +03:00
|
|
|
HandleMessage(this, message, this.commands, this.guildsData[message.guild.id]);
|
|
|
|
}
|
2017-09-24 23:07:35 +03:00
|
|
|
}
|
2017-09-20 01:26:30 +03:00
|
|
|
|
2017-09-24 23:07:35 +03:00
|
|
|
onDebug(info) {
|
|
|
|
if (!InternalConfig.debugIgnores.some(x => info.startsWith(x)))
|
2017-11-11 03:13:18 +02:00
|
|
|
CoreUtil.dateDebug(info);
|
2017-09-24 23:07:35 +03:00
|
|
|
}
|
2017-09-20 01:26:30 +03:00
|
|
|
|
2017-11-11 03:28:38 +02:00
|
|
|
onGuildCreate(guild) {
|
|
|
|
CoreUtil.dateLog(`Added to guild ${guild.name}`);
|
|
|
|
}
|
|
|
|
|
|
|
|
onGuildDelete(guild) {
|
|
|
|
CoreUtil.dateLog(`Removed from guild ${guild.name}, removing data for this guild`);
|
|
|
|
delete this.guildsData[guild.id];
|
|
|
|
this.writeFile();
|
|
|
|
}
|
|
|
|
|
2017-09-24 23:07:35 +03:00
|
|
|
onUnhandledException(client, err) {
|
|
|
|
CoreUtil.dateError(err.message || err);
|
|
|
|
CoreUtil.dateLog("Destroying existing client...");
|
|
|
|
client.destroy().then(() => {
|
|
|
|
CoreUtil.dateLog("Client destroyed, recreating...");
|
|
|
|
client.login(client._token);
|
|
|
|
});
|
|
|
|
}
|
2017-09-20 01:26:30 +03:00
|
|
|
|
2017-09-24 23:07:35 +03:00
|
|
|
writeFile() {
|
|
|
|
JsonFile.writeFile(
|
|
|
|
this.dataFile,
|
|
|
|
this.guildsData,
|
|
|
|
err => { if (err) CoreUtil.dateError(`Error writing data file! ${err.message || err}`); });
|
|
|
|
}
|
2017-09-20 01:26:30 +03:00
|
|
|
|
2017-09-24 23:07:35 +03:00
|
|
|
/**
|
|
|
|
* @param {*} json
|
|
|
|
* @param {*} guildDataModel
|
|
|
|
*/
|
|
|
|
fromJSON(json) {
|
|
|
|
const guildsData = Object.keys(json);
|
|
|
|
guildsData.forEach(guildID => { json[guildID] = new this.guildDataModel(json[guildID]); });
|
|
|
|
return json;
|
|
|
|
}
|
|
|
|
};
|