implement modular commands - fixes #1

master
lub 7 years ago
parent 6be87c48d0
commit b6aa1ed45e

@ -78,7 +78,7 @@ const findShortcut = (shortcut, objects) => {
return expansion; return expansion;
}; };
const expandCommand = (msg, projects) => { commands.expandCommand = (msg, projects) => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const regex = /^!([a-zA-Z0-9]+) ([a-zA-Z0-9]+) ([a-zA-Z0-9]+) ?(.*)$/; const regex = /^!([a-zA-Z0-9]+) ([a-zA-Z0-9]+) ([a-zA-Z0-9]+) ?(.*)$/;
const shortcuts = msg.match(regex); const shortcuts = msg.match(regex);
@ -90,6 +90,7 @@ const expandCommand = (msg, projects) => {
expansion.project = expansion.project.toLowerCase(); expansion.project = expansion.project.toLowerCase();
} else { } else {
reject('could not resolve project: ' + shortcuts[1]); reject('could not resolve project: ' + shortcuts[1]);
return;
} }
expansion.service = findShortcut(shortcuts[2], projects[expansion.project]); expansion.service = findShortcut(shortcuts[2], projects[expansion.project]);
@ -97,6 +98,7 @@ const expandCommand = (msg, projects) => {
expansion.service = expansion.service.toLowerCase(); expansion.service = expansion.service.toLowerCase();
} else { } else {
reject('could not resolve service: ' + shortcuts[2]); reject('could not resolve service: ' + shortcuts[2]);
return;
} }
expansion.subcommand = findShortcut(shortcuts[3], projects[expansion.project][expansion.service]); expansion.subcommand = findShortcut(shortcuts[3], projects[expansion.project][expansion.service]);
@ -104,12 +106,14 @@ const expandCommand = (msg, projects) => {
expansion.subcommand = expansion.subcommand.toLowerCase(); expansion.subcommand = expansion.subcommand.toLowerCase();
} else { } else {
reject('could not resolve subcommand: ' + shortcuts[4]); reject('could not resolve subcommand: ' + shortcuts[4]);
return;
} }
// if args are given, write them in command // if args are given, write them in command
if(shortcuts[4]) expansion.args = shortcuts[4]; if(shortcuts[4]) expansion.args = shortcuts[4];
resolve(expansion); resolve(expansion);
return;
}); });
}; };

@ -5,7 +5,7 @@ const sdk = require('matrix-js-sdk');
const yaml = require('js-yaml'); const yaml = require('js-yaml');
global.config = yaml.safeLoad(fs.readFileSync('config.yaml')); global.config = yaml.safeLoad(fs.readFileSync('config.yaml'));
const matrixClient = sdk.createClient({ global.matrixClient = sdk.createClient({
baseUrl: config.matrix.baseurl, baseUrl: config.matrix.baseurl,
accessToken: config.matrix.accesstoken, accessToken: config.matrix.accesstoken,
userId: config.matrix.userid userId: config.matrix.userid
@ -25,24 +25,6 @@ process.on('unhandledRejection', (reason) => {
console.log('Reason: ' + reason); console.log('Reason: ' + reason);
}); });
const commands = {};
commands['rebuild'] = {};
commands['rebuild'].regex = /^!rebuild ([a-zA-Z0-9\-]*)$/;
commands['rebuild'].usage = '!rebuild <container>';
commands['rebuild'].exec = function(args, room, event) {
const container = args[1];
matrixClient.sendNotice(room.roomId, 'rebuilding container ' + container);
remoteExec('./rebuild.sh ' + container)
.then(function(result) {
matrixClient.sendNotice(room.roomId, event.sender.userId + '\nrebuilt container ' + container);
}, function(result) {
matrixClient.sendNotice(room.roomId, event.sender.userId + '\nrebuild of container ' + container + ' failed.\ncode: ' + result.code + '\nstdout: \n```\n' + result.stdout + '```\nstderr: \n```\n' + result.stderr + '\n```');
});
};
matrixClient.on('Room.timeline', function(event, room, resetTimeline) { matrixClient.on('Room.timeline', function(event, room, resetTimeline) {
@ -53,33 +35,29 @@ matrixClient.on('Room.timeline', function(event, room, resetTimeline) {
return; return;
} }
let body = event.getContent().body; const body = event.getContent().body;
let project = body.match(/^\!([a-zA-Z]*)/); commands.expandCommand(body, commands.projects)
if(project === null) { .then((expansion) => {
return; let subcommand = commands.projects[expansion.project][expansion.service][expansion.subcommand];
} const args = expansion.args.match(subcommand.regex);
project = project[1];
const command = commands[project]; if(args === null && !subcommand.regex.test(expansion.args)) {
matrixClient.sendNotice(room.roomId, 'usage: ' + subcommand.usage);
if(command !== undefined) {
const args = body.match(command.regex);
if(args === null) {
matrixClient.sendNotice(room.roomId, 'usage: ' + command.usage);
return; return;
} }
command.exec(args, room, event); subcommand.exec(args, room, event);
}else{ //command not found }, (fail) => { // command not found
let tmp = commands.fetchCommand(project, commands); /* let tmp = commands.fetchCommand(project, commands.projects);
let suggestions = ""; let suggestions = "";
for(let i = 0; i < tmp.length; i++){ for(let i = 0; i < tmp.length; i++){
suggestions += "\n"+tmp[i]; suggestions += "\n"+tmp[i];
} }
matrixClient.sendNotice(room.roomId, 'Unrecognized command.\n' + matrixClient.sendNotice(room.roomId, 'Unrecognized command.\n' +
'Did you mean:'+suggestions); 'Did you mean:'+suggestions);
} */
});
}); });

@ -8,15 +8,17 @@ lubiland['infrastructure'] = {};
lubiland['infrastructure']['rebuild'] = {}; lubiland['infrastructure']['rebuild'] = {};
lubiland['infrastructure']['rebuild'].regex = /^([a-zA-Z0-9\-\_]*)$/; lubiland['infrastructure']['rebuild'].regex = /^([a-zA-Z0-9\-\_]*)$/;
lubiland['infrastructure']['rebuild'].usage = '<container>'; lubiland['infrastructure']['rebuild'].usage = '<container>';
lubiland['infrastructure']['rebuild'].exec = (args) => { lubiland['infrastructure']['rebuild'].exec = (args, room, event) => {
const container = args[1]; return new Promise((resolve, reject) => {
const container = args[1];
matrixClient.sendNotice(room.roomId, 'rebuilding container ' + container);
matrixClient.sendNotice(room.roomId, 'rebuilding container ' + container);
remoteExec('./rebuild.sh ' + container)
.then(function(result) { remoteExec('./rebuild.sh ' + container)
matrixClient.sendNotice(room.roomId, event.sender.userId + '\nrebuilt container ' + container); .then(function(success) {
}, function(result) { matrixClient.sendNotice(room.roomId, event.sender.userId + '\nrebuilt container ' + container);
matrixClient.sendNotice(room.roomId, event.sender.userId + '\nrebuild of container ' + container + ' failed.\ncode: ' + result.code + '\nstdout: \n```\n' + result.stdout + '```\nstderr: \n```\n' + result.stderr + '\n```'); }, function(process) {
matrixClient.sendNotice(room.roomId, event.sender.userId + '\nrebuild of container ' + container + ' failed.\ncode: ' + process.code + '\nstdout: \n```\n' + process.stdout + '```\nstderr: \n```\n' + process.stderr + '\n```');
});
}); });
}; };