const fs = require('fs'); const _ = require('underscore'); const cache = require('../backbone/cache.js'); const alias = require('./alias.json'); let commands = {}; fs.readdirSync('./game/commands').forEach(file => { require(`./commands/${file}`)(commands); }); function a(context) { try { let cmd = context.alias[context.command].command; if(context.alias[context.command].arg) { let args = alias[context.command].arg + context.args; context.args = args; } context.command = cmd; } catch { console.info(`[${context.id}] Not an alias <${context.command}>`); } } const ex = /^!(?:([\w\d]+)|(?:([\w\d]+?)\s(.+)))$/ function c (context) { return new Promise((resolve, reject) => { let match = ex.exec(context.message.content); if (match) { context.command = match[2] ? match[2] : match[1]; context.args = match[3]; context.alias = alias; a(context); context.commands = commands; context.pid = context.message.author.id; cache.state(context.id) .then(data => { context.state = data; resolve(context); }).catch(err => reject(err)); } else { resolve(false); } }); } function p(message) { return new Promise((resolve, reject) => { let context = { message: message, id: message.guild.id }; c(context) .then(context => resolve(context)) .catch(err => reject(err)); }); } function x(context) { return new Promise((resolve, reject) => { if(context) { if(_.has(commands, context.command)) { console.info(`[${context.id}] Execute command <${context.command}>`); commands[context.command](context) .then(() => { if(context.stateChanged){ cache.commit(context.id); } else { console.info(`[${context.id}] No change to commit (Context.stateChanged == false)`); } resolve(); }) .catch(err => reject(err)); } else { console.warn(`[${context.id}] Unknown command <${context.command}>`); } } }); } module.exports = { parse: p, execute: x }