dbot/modules/command/command.js

125 lines
5.6 KiB
JavaScript
Raw Normal View History

/**
* Module Name: Command
* Description: An essential module which maps PRIVMSG input to an appropriate
* command and then runs that command, given the user isn't banned from or
* ignoring that command.
*/
var _ = require('underscore')._;
var command = function(dbot) {
/**
* Run the appropriate command given the input.
*/
this.listener = function(event) {
var commandName = event.params[0];
2013-08-13 01:18:40 +02:00
if(commandName.charAt(0) != '~') {
return;
}
2013-01-14 17:24:38 +01:00
if(!_.has(dbot.commands, commandName)) {
if(_.has(dbot.modules, 'quotes')) {
var key = event.message.substring(1);
2013-09-01 00:57:29 +02:00
dbot.api.quotes.getInterpolatedQuote(event.server,
event.channel.name, event.user, key, function(quote) {
if(quote) {
event.reply(key + ': ' + quote);
} else if(_.has(dbot.modules, 'spelling')) {
var commands = _.keys(dbot.commands)
winner = false,
closestMatch = Infinity;
2013-08-13 01:14:44 +02:00
_.each(commands, function(command) {
var distance = dbot.api.spelling.distance(commandName, command);
if(distance < closestMatch) {
closestMatch = distance;
winner = command;
}
});
2013-08-28 01:23:33 +02:00
if(closestMatch < 1) {
event.reply(commandName + ' not found. Did you mean ' + winner + '?');
return;
} else if(_.has(dbot.modules, 'quotes')) {
dbot.api.link.udLookup(key, function(word, definition) {
if(word) {
event.reply(key + '[UD]: ' + definition);
} else {
event.reply(dbot.t('category_not_found', { 'category': key }));
}
});
} else {
return;
}
2013-08-13 01:14:44 +02:00
}
});
return;
}
2013-08-13 01:14:44 +02:00
else if(_.has(dbot.modules, 'quotes')) {
commandName = '~';
2013-01-24 00:39:42 +01:00
} else {
return;
2013-01-24 00:39:42 +01:00
}
}
2013-09-07 19:55:48 +02:00
this.api.hasAccess(event.rUser, event.channel, commandName, function(hasAccess) {
2013-06-27 17:33:18 +02:00
dbot.api.ignore.isUserIgnoring(event.rUser, commandName, function(isIgnoring) {
dbot.api.ignore.isUserBanned(event.rUser, commandName, function(isBanned) {
if(isBanned) {
2013-05-27 19:48:36 +02:00
if(this.config.banOutput && commandName != '~') {
2013-05-27 19:45:30 +02:00
event.reply(dbot.t('command_ban', {'user': event.user}));
}
} else if(!hasAccess) {
if(this.config.accessOutput) {
event.reply(dbot.t('access_denied', { 'user': event.user }));
}
2013-07-25 00:48:35 +02:00
} else if(!isIgnoring && _.has(dbot.commands, commandName) && !dbot.commands[commandName].disabled) {
2013-04-23 21:07:23 +02:00
if(this.api.applyRegex(commandName, event)) {
try {
var command = dbot.commands[commandName],
results;
if(_.has(command, 'resolver')) {
event.res = [];
command.resolver(event, function(err) {
if(!err) {
results = command.apply(dbot.modules[command.module], [event]);
}
});
} else {
results = command.apply(dbot.modules[command.module], [event]);
}
2013-04-23 21:07:23 +02:00
} catch(err) {
if(dbot.config.debugMode == true) {
var stack = err.stack.split('\n').slice(1, dbot.config.debugLevel + 1);
2013-04-23 21:07:23 +02:00
event.reply('- Error in ' + commandName + ':');
event.reply('- Message: ' + err);
_.each(stack, function(stackLine, index) {
event.reply('- Stack[' + index + ']: ' +
stackLine.trim());
});
2013-04-23 21:07:23 +02:00
}
}
2013-07-25 00:42:02 +02:00
if(!_.include(['~reload', '~load', '~unload', '~setconfig'], commandName)) dbot.api.event.emit('command', [ event ]);
2013-04-23 21:07:23 +02:00
dbot.save();
} else {
2013-04-23 21:07:23 +02:00
if(commandName !== '~') {
if(_.has(dbot.usage, commandName)) {
event.reply('Usage: ' + dbot.usage[commandName]);
} else {
event.reply(dbot.t('syntax_error'));
}
}
}
}
}.bind(this));
}.bind(this));
}.bind(this));
}.bind(this);
this.on = 'PRIVMSG';
};
exports.fetch = function(dbot) {
return new command(dbot);
};