Baphomet is the dedicated bot for nulloctet matrix
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

111 lines
3.9 KiB

let { logger } = require('./logging');
let { modules } = require('./module/index');
let trie = require('trie-prefix-tree');
let { getShortestPrefix } = require('./utility');
let help = require('./module/help');
let message = require('./message');
let utility = require('./utility');
let sentinelValue = '!';
class Engine {
constructor(config, bot, modules) {
this.config = config;
this.bot = bot;
this.modules = modules;
this.moduleMap = new Map();
this.commandMap = new Map();
this.commandRadixTree = trie([]);
}
initModules() {
this.modules.forEach((module) => {
logger.info("Loading module: %s", module.name);
this.moduleMap.set(module.command, module);
this.commandMap.set(module.command, module);
this.commandRadixTree.addWord(module.command);
});
this.modules.forEach((module) => {
let shortCommand = getShortestPrefix(this.commandRadixTree, module.command, 3);
logger.info("Adding short command %s for module: %s", shortCommand, module.name);
this.commandMap.set(shortCommand, module);
});
this.helpModule = help.create(this.moduleMap)
this.commandMap.set('help', this.helpModule);
logger.info("Bound modules to keywords: %o", this.moduleMap);
}
init() {
logger.info("Initializing modules");
this.initModules();
/* Bind Message Parsing */
let engine = this;
let handleMessages = (event, room, toStartOfTimeline) => {
/* Don't process messages from self */
if (event.sender.userId !== this.config.userId) {
/* don't process messages that aren't of type m.room.message */
if (event.getType() !== "m.room.message") {
logger.debug("Recieved message of type: %s", event.getType());
return;
} else {
let messageBody = event.event.content.body;
logger.debug("[%s] %s", room.name, messageBody);
if (messageBody.indexOf(sentinelValue) === 0) {
let command = messageBody.split(' ')[0].substring(1);
var responseMessage = null;
if (engine.commandMap.has(command)) {
responseMessage = engine.commandMap.get(command).handleMessage(event, room);
} else {
responseMessage = engine.helpModule.help();
}
logger.debug("Responding to room: %s", room.roomId);
if (responseMessage instanceof Object) {
engine.bot.client.sendMessage(room.roomId, responseMessage);
} else if (utility.isString(responseMessage)) {
engine.bot.client.sendMessage(room.roomId, message.createBasic(responseMessage));
} else {
logger.error("Unable to process response message: %s", responseMessage);
}
}
}
}
}
this.bot.init(handleMessages);
/* Capture Exit Conditions */
["SIGINT", "SIGTERM"].forEach((signature) => {
process.on(signature, async () => {
await this.bot.sendStatusShutdown()
.then(() => {
logger.info("Gracefully stopping Matrix SDK Client")
this.bot.client.stopClient();
});
process.exit(0);
});
});
process.on('exit', () => {
logger.info("Shutting Down");
});
return this;
}
run() {
this.bot.connect();
return this;
}
}
function create(config, bot) {
return new Engine(config, bot, modules)
}
exports.create = create;