diff --git a/modules/command/api.js b/modules/command/api.js index b74637c..9a0caf7 100644 --- a/modules/command/api.js +++ b/modules/command/api.js @@ -5,46 +5,36 @@ var api = function(dbot) { /** * Does the user have the correct access level to use the command? */ - 'hasAccess': function(user, channel, command, callback) { - var accessNeeded = dbot.commands[command].access; + 'hasAccess': function(event, command, callback) { + var accessNeeded = dbot.commands[command].access, + allowedNicks, + user = event.rUser; - if(accessNeeded == 'admin' || accessNeeded == 'moderator' || - accessNeeded == 'power_user' || accessNeeded == 'voice') { - var allowedNicks = dbot.config.admins; - if(accessNeeded == 'moderator') allowedNicks = _.union(allowedNicks, dbot.config.moderators); - if(accessNeeded == 'power_user') { - allowedNicks = _.union(allowedNicks, dbot.config.moderators); - allowedNicks = _.union(allowedNicks, dbot.config.power_users); - } - if(accessNeeded == 'voice') { - allowedNicks = _.union(allowedNicks, dbot.config.moderators); - allowedNicks = _.union(allowedNicks, dbot.config.power_users); - allowedNicks = _.union(allowedNicks, - _.chain(channel.nicks) - .filter(function(nick) { - return nick.op == true || nick.voice == true; - }) - .pluck('name') - .value()); - } - - if(!_.include(allowedNicks, user.primaryNick) && !_.include(allowedNicks, user.currentNick)) { - callback(false); + if(_.isUndefined(accessNeeded) || accessNeeded == null) { + return callback(true); + } else if(!_.isFunction(accessNeeded)) { + if(_.has(dbot.access, accessNeeded)) { + accessNeeded = dbot.access[accessNeeded]; } else { - if(_.has(dbot.modules, 'nickserv') && this.config.useNickserv == true) { - dbot.api.nickserv.auth(user.server, user.currentNick, function(result, primary) { - if(result == true && primary == user.primaryNick) { - callback(true); - } else { - callback(false); - } - }); - } else { - callback(true); - } + return callback(true); } + } + allowedNicks = accessNeeded(event); + + if(!_.include(allowedNicks, user.primaryNick) && !_.include(allowedNicks, user.currentNick)) { + callback(false); } else { - callback(true); + if(_.has(dbot.modules, 'nickserv') && this.config.useNickserv == true) { + dbot.api.nickserv.auth(user.server, user.currentNick, function(result, primary) { + if(result == true && primary == user.primaryNick) { + callback(true); + } else { + callback(false); + } + }); + } else { + callback(true); + } } }, diff --git a/modules/command/command.js b/modules/command/command.js index 1c7878b..1cb0c5e 100644 --- a/modules/command/command.js +++ b/modules/command/command.js @@ -58,7 +58,7 @@ var command = function(dbot) { } } - this.api.hasAccess(event.rUser, event.channel, commandName, function(hasAccess) { + this.api.hasAccess(event, commandName, function(hasAccess) { dbot.api.ignore.isUserIgnoring(event.rUser, commandName, function(isIgnoring) { dbot.api.ignore.isUserBanned(event.rUser, commandName, function(isBanned) { if(isBanned) { @@ -114,6 +114,35 @@ var command = function(dbot) { }.bind(this)); }.bind(this); this.on = 'PRIVMSG'; + + this.onLoad = function() { + // Not sure this is the right place for this. Perhaps they should be in + // another file? + + dbot.access = { + 'admin': function(event) { + return dbot.config.admins; + }, + + 'moderator': function(event) { + return [].concat(dbot.access.admin(event), dbot.config.moderators); + }, + + 'power_user': function(event) { + return [].concat(dbot.access.admin(event), dbot.access.moderator(event), dbot.config.power_users); + }, + + 'voice': function(event) { + return [].concat(dbot.access.admin(event), dbot.access.moderator(event), dbot.access.power_user(event), + _.chain(event.channel.nicks) + .filter(function(nick) { + return nick.op == true || nick.voice == true; + }) + .pluck('name') + .value()); + } + }; + }.bind(this); }; exports.fetch = function(dbot) {