dbot/modules/atheme/atheme.js

156 lines
6.7 KiB
JavaScript
Raw Normal View History

/**
2014-09-05 13:38:33 +02:00
* Module Name: atheme
* Description: atheme mode references & retrieve channel flags
*/
2014-09-14 21:31:22 +02:00
var _ = require('underscore')._,
async = require('async');
2014-09-04 17:26:28 +02:00
var atheme = function(dbot) {
2014-09-05 10:51:48 +02:00
this.flagStack = {};
2014-09-14 21:02:45 +02:00
this.hostStack = {};
2014-09-05 10:51:48 +02:00
this.api = {
'getChannelFlags': function(server, channel, callback) {
if(!_.has(this.flagStack, server)) this.flagStack[server] = {};
2014-09-05 11:15:05 +02:00
if(_.has(this.flagStack[server], channel)) { // Already an active flag call
2014-09-05 10:51:48 +02:00
this.flagStack[server][channel].callbacks.push(callback);
} else {
this.flagStack[server][channel] = {
'flags': {},
'callbacks': [ callback ],
'timeout': null
2014-09-05 10:51:48 +02:00
};
}
dbot.say(server, 'chanserv', 'FLAGS ' + channel);
this.flagStack[server][channel].timeout = setTimeout(function() { // Delete callback if no response
2014-09-05 10:51:48 +02:00
if(_.has(this.flagStack[server], channel)) {
_.each(this.flagStack[server][channel].callbacks, function(callback) {
callback(true, null);
});
delete this.flagStack[server][channel];
}
2014-09-14 21:31:22 +02:00
}.bind(this), 20000);
2014-09-14 21:02:45 +02:00
},
'getVHosts': function(server, mask, callback) {
if(!_.has(this.hostStack, server)) this.hostStack[server] = {};
if(_.has(this.hostStack[server], mask)) { // Already an active host call
this.hostStack[server][channel].callbacks.push(callback);
} else {
this.hostStack[server][mask] = {
'users': [],
2015-07-07 19:58:56 +02:00
'callbacks': [ callback ],
'timeout': null
2014-09-14 21:02:45 +02:00
};
}
dbot.say(server, 'hostserv', 'LISTVHOST ' + mask);
2015-07-07 19:58:56 +02:00
this.hostStack[server][mask].timeout = setTimeout(function() { // Delete callback if no response
2014-09-14 21:02:45 +02:00
if(_.has(this.hostStack[server], mask)) {
_.each(this.hostStack[server][mask].callbacks, function(callback) {
callback(true, null);
});
delete this.hostStack[server][mask];
}
2014-09-15 23:19:41 +02:00
}.bind(this), 5000);
2014-09-05 10:51:48 +02:00
}
};
this.commands = {
'~chanserv': function(event) {
if(_.has(this.config.chanserv, event.input[1])) {
event.reply('ChanServ flag ' + event.input[1] + ': ' + this.config.chanserv[event.input[1]]);
} else {
event.reply('I don\'t know anything about ' + event.input[1]);
}
},
'~chanmode': function(event) {
if(_.has(this.config.chanmodes, event.input[1])) {
event.reply('Channel Mode ' + event.input[1] + ': ' + this.config.chanmodes[event.input[1]]);
} else {
event.reply('I don\'t know anything about ' + event.input[1]);
}
}
};
2014-09-04 17:26:28 +02:00
this.commands['~chanserv'].regex = [/^chanserv (\+.)/, 2];
this.commands['~chanmode'].regex = [/^chanmode (\+.)/, 2];
2014-09-05 10:51:48 +02:00
this.listener = function(event) {
2014-10-03 22:42:41 +02:00
if(event.action === 'NOTICE') {
if(event.user === 'ChanServ') {
var flags = event.params.match(/(\d+)\s+([^ ]+)\s+(\+\w+)\s+\((\#[\w\.]+)\)/),
end = event.params.match(/end of \u0002(\#[\w\.]+)\u0002 flags listing/i);
2014-09-05 10:51:48 +02:00
2014-10-03 22:42:41 +02:00
if(flags && _.has(this.flagStack[event.server], flags[4])) {
this.flagStack[event.server][flags[4]].flags[flags[2]] = flags[3];
} else if(end) {
if(_.has(this.flagStack[event.server], end[1])) {
// Parse wildcard hostmasks to nicks
var allFlags = this.flagStack[event.server][end[1]].flags,
hostMasks = {};
2014-09-14 21:31:22 +02:00
2014-10-03 22:42:41 +02:00
_.each(allFlags, function(f, u) { // TODO: combine to one loop
if(u.indexOf('*!*@') !== -1) {
hostMasks[u] = f;
delete allFlags[u];
}
});
async.each(_.keys(hostMasks), function(hostMask, done) {
2014-10-03 22:42:41 +02:00
this.api.getVHosts(event.server, hostMask.split('@')[1], function(err, users) {
_.each(users, function(user) {
allFlags[user] = hostMasks[hostMask];
});
done();
2014-09-14 21:31:22 +02:00
});
2014-10-03 22:42:41 +02:00
}.bind(this), function() {
_.each(this.flagStack[event.server][end[1]].callbacks, function(callback) {
callback(null, this.flagStack[event.server][end[1]].flags);
}.bind(this));
clearTimeout(this.flagStack[event.server][end[1]].timeout);
delete this.flagStack[event.server][end[1]];
}.bind(this));
2014-10-03 22:42:41 +02:00
}
2014-09-05 10:51:48 +02:00
}
2014-10-03 22:42:41 +02:00
} else if(event.user === 'HostServ') {
_.each(this.hostStack[event.server], function(el, mask) {
if(event.params.match(mask)) {
var user = event.params.match(/- ([^ ]+)/),
end = event.params.match(/matches for pattern/);
2014-09-14 21:02:45 +02:00
2014-10-03 22:42:41 +02:00
if(user) {
this.hostStack[event.server][mask].users.push(user[1]);
} else if(end) {
_.each(this.hostStack[event.server][mask].callbacks, function(callback) {
callback(null, this.hostStack[event.server][mask].users);
}, this);
2015-07-07 19:58:56 +02:00
clearTimeout(this.hostStack[event.server][mask].timeout);
2014-10-03 22:42:41 +02:00
delete this.hostStack[event.server][mask];
}
2014-09-14 21:02:45 +02:00
}
2014-10-03 22:42:41 +02:00
}, this);
}
} else { // PRIVMSG
2014-10-21 17:08:26 +02:00
console.log(event.message);
2014-10-03 22:42:41 +02:00
var akill = event.message.match(/([^ ]+) AKILL:ADD: ([^ ]+) \(reason: (.+)(\) )\(duration: ([^,)]+)/);
2014-10-03 22:56:11 +02:00
if(event.channel == '#services' && akill) {
2014-10-21 17:08:26 +02:00
console.log(akill);
var channel = dbot.config.servers[event.server].admin_channel;
dbot.api.users.getUser(akill[1] + '.' + event.server, function(err, user) {
dbot.api.report.notify('ban', 'tripsit', user, channel, dbot.t('akill', {
'host': akill[2],
'reason': akill[3],
'duration': akill[5]
}));
});
2014-10-03 22:42:41 +02:00
}
2014-09-05 10:51:48 +02:00
}
}.bind(this);
2014-10-03 22:42:41 +02:00
this.on = ['NOTICE', 'PRIVMSG'];
};
exports.fetch = function(dbot) {
2014-09-04 17:26:28 +02:00
return new atheme(dbot);
};