discord-bot-rss-feed/discord-bot-core/bootstrapper.js

72 lines
2.2 KiB
JavaScript

//node imports
const FileSystem = require("fs"); //manage files
const Util = require("util");
//external lib imports
const Discord = require("discord.js");
const JsonFile = require("jsonfile"); //save/load data to/from json
const Config = require("./config.json");
const ParentPackageJSON = require("../package.json"); //used to provide some info about the bot
const DiscordUtil = require("./util.js"); //some discordjs helper functions of mine
const MessageHandler = require("./message-handler.js");
function bootstrap(token, component, guildDataModel, commands) {
process.on("uncaughtException", (err) => {
DiscordUtil.dateError("Uncaught exception!", err);
});
const client = new Discord.Client();
client.on("ready", () => {
onReady(client, component, guildDataModel, commands);
client.user.setGame("benji7425.github.io");
DiscordUtil.dateLog("Registered bot " + client.user.username);
});
client.on("disconnect", eventData => {
DiscordUtil.dateError("Bot was disconnected!", eventData.code, eventData.reason);
});
client.login(token);
}
function onReady(client, component, guildDataModel, commands) {
const saveFile = Util.format(Config.saveFile, ParentPackageJSON.name + "");
const guildsData =
FileSystem.existsSync(saveFile) ?
fromJSON(JsonFile.readFileSync(saveFile), guildDataModel) : {};
const writeFile = () =>
JsonFile.writeFile(
saveFile,
guildsData,
err => {
if (err) DiscordUtil.dateError("Error writing file", err);
});
setInterval(() => writeFile(), Config.saveIntervalSec * 1000);
client.on("message", message => {
if (message.author.id !== client.user.id) {
if (message.channel.type === "dm")
MessageHandler.handleDirectMessage({ client, message });
else if (message.channel.type === "text" && message.member)
MessageHandler.handleTextMessage({ client, commands, message, guildDataModel, guildsData, component, writeFile });
}
});
component.onReady(client, guildsData)
.then(() => writeFile())
.catch(err => DiscordUtil.dateError(err));
}
function fromJSON(json, guildDataModel) {
const guildsData = Object.keys(json);
guildsData.forEach(guildID => { json[guildID] = new guildDataModel(json[guildID]); });
return json;
}
module.exports = bootstrap;