169 lines
4.3 KiB
JavaScript
169 lines
4.3 KiB
JavaScript
import { createRequire } from 'module';
|
|
const require = createRequire(import.meta.url);
|
|
|
|
import Eris from 'eris';
|
|
import Logger, { levels } from './logger.js';
|
|
import CommandParser, { Command } from './parser.js';
|
|
import { filename, dirname } from './utils.js';
|
|
import path from 'path';
|
|
import fs from 'fs';
|
|
|
|
const cfg = require('./config.json');
|
|
if (!fs.existsSync('./whitelist.json')) {
|
|
fs.writeFileSync('./whitelist.json', '{}');
|
|
}
|
|
|
|
const whitelist = require('./whitelist.json');
|
|
|
|
if (!fs.existsSync('./extset')) {
|
|
fs.mkdirSync('./extset');
|
|
}
|
|
|
|
const dir = dirname(import.meta.url);
|
|
|
|
const bot = new Eris(cfg.token);
|
|
|
|
global.ctx = {
|
|
bot: bot,
|
|
log_level: levels[cfg.log_level.toUpperCase()] || levels.WARN,
|
|
set_ctx: (key, value) => {
|
|
global.ctx[key] = value;
|
|
},
|
|
};
|
|
|
|
let extension_settings = {};
|
|
|
|
const loadSettings = (guild) => {
|
|
extension_settings[guild] = {};
|
|
if (!fs.existsSync(`./extset/${guild}.json`)) {
|
|
fs.writeFileSync(`./extset/${guild}.json`, '{}');
|
|
}
|
|
let settings = require(`./extset/${guild}.json`);
|
|
if (settings != undefined) {
|
|
extension_settings[guild] = settings;
|
|
}
|
|
};
|
|
const saveSettings = (guild) => {
|
|
let data = JSON.stringify(extension_settings[guild]);
|
|
fs.writeFileSync(`./extset/${guild}.json`, data);
|
|
};
|
|
|
|
global.ctx.settings = {};
|
|
global.ctx.settings.getSetting = (guild, extensionId, key) => {
|
|
if (!extension_settings[guild]) {
|
|
loadSettings(guild);
|
|
}
|
|
if (!extension_settings[guild][extensionId]) {
|
|
extension_settings[guild][extensionId] = {};
|
|
}
|
|
return extension_settings[guild][extensionId][key];
|
|
};
|
|
global.ctx.settings.setSetting = (guild, extensionId, key, value) => {
|
|
if (!extension_settings[guild]) {
|
|
loadSettings(guild);
|
|
}
|
|
if (!extension_settings[guild][extensionId]) {
|
|
extension_settings[guild][extensionId] = {};
|
|
}
|
|
extension_settings[guild][extensionId][key] = value;
|
|
saveSettings(guild);
|
|
};
|
|
|
|
const log = new Logger(filename(import.meta.url), global.ctx.log_level);
|
|
const parse = new CommandParser(global.ctx, cfg.prefix || undefined);
|
|
|
|
const checkUser = (user) => {
|
|
if (cfg.user_whitelist.includes(user.id) || (whitelist.user && whitelist.user.includes(user.id))) {
|
|
return true;
|
|
}
|
|
log.info(`user not on whitelist: ${user.username}`);
|
|
return false;
|
|
};
|
|
const checkGuild = (guild) => {
|
|
if (cfg.whitelist.includes(guild.id) || (whitelist.guild && whitelist.guild.includes(guild.id))) {
|
|
return true;
|
|
}
|
|
log.info(`guild not on whitelist: ${guild.name}`);
|
|
return false;
|
|
};
|
|
|
|
const saveWhitelist = () => {
|
|
let data = JSON.stringify(whitelist);
|
|
fs.writeFileSync('./whitelist.json', data);
|
|
};
|
|
|
|
global.ctx.whitelist = {
|
|
guild: checkGuild,
|
|
user: checkUser,
|
|
save: saveWhitelist,
|
|
wl: whitelist,
|
|
};
|
|
|
|
const listeners = {};
|
|
|
|
bot.on('ready', () => {
|
|
log.info('ready recieved.');
|
|
bot.guilds.forEach((guild) => checkGuild(guild));
|
|
});
|
|
|
|
bot.on('messageCreate', (msg) => parse.parseMsg(msg, global.ctx));
|
|
|
|
bot.on('error', (err) => log.error(err.stack));
|
|
|
|
bot.connect();
|
|
|
|
async function load_commands() {
|
|
for (let file of files) {
|
|
let p = path.join(cmd_dir, file);
|
|
log.debug('loading ' + p);
|
|
let obj;
|
|
try {
|
|
obj = await import('file:////' + p);
|
|
} catch (e) {
|
|
log.warn(`loading file ${file}, ran into issue: ${e.stack}`);
|
|
continue;
|
|
}
|
|
if (obj.default != undefined) {
|
|
if (obj.default.constructor.name == 'CommandInitializer') {
|
|
obj.default.initialize(global.ctx);
|
|
let cmds = obj.default.getCommands();
|
|
let aliases = obj.default.getAliases();
|
|
if (parse.isCmd(cmds)) {
|
|
parse.addCommand(cmds);
|
|
} else if (cmds.constructor.name == 'Array') {
|
|
for (let cmd of cmds) {
|
|
parse.addCommand(cmd);
|
|
}
|
|
}
|
|
if (aliases != undefined) {
|
|
parse.addAliases(aliases);
|
|
}
|
|
let events = obj.default.getEvents();
|
|
if (events != undefined) {
|
|
for (let event in events) {
|
|
if (!listeners[event]) {
|
|
listeners[event] = [];
|
|
}
|
|
log.trace(events[event]);
|
|
listeners[event] = listeners[event].concat(events[event]);
|
|
log.debug(`added ${events[event].length} events for ${event} from ${file}`);
|
|
bot.on(event, (...args) => {
|
|
for (let handler of listeners[event]) {
|
|
log.trace(event);
|
|
log.trace(handler);
|
|
handler.func(global.ctx, args);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
log.warn('module ' + file + ' returned an undefined module.');
|
|
}
|
|
}
|
|
}
|
|
|
|
let cmd_dir = path.join(dir, 'cmd');
|
|
log.trace(dir);
|
|
let files = fs.readdirSync(cmd_dir);
|
|
load_commands();
|