dbot/modules/nickserv/nickserv.js

111 lines
4.2 KiB
JavaScript
Raw Normal View History

var _ = require('underscore')._;
2013-04-23 20:48:41 +02:00
var nickserv = function(dbot) {
this.authStack = {};
this.userStack = {};
2013-04-23 20:48:41 +02:00
this.api = {
'auth': function(server, nick, callback) {
var nickserv = dbot.config.servers[server].nickserv,
infoCommand = this.config.servers[server].infoCommand;
if(!_.has(this.authStack, server)) this.authStack[server] = {};
this.authStack[server][nick] = callback;
2013-10-20 18:16:21 +02:00
dbot.say(server, nickserv, infoCommand + ' ' + nick + ' *');
},
'getUserHost': function(server, nick, callback) {
if(!_.has(this.userStack, server)) this.userStack[server] = {};
this.userStack[server][nick] = callback;
2013-06-09 18:06:58 +02:00
dbot.instance.connections[server].send('USERHOST ' + nick);
setTimeout(function() {
2013-08-26 01:04:46 +02:00
if(_.has(this.userStack[server], nick)) {
dbot.instance.connections[server].send('WHOWAS ' + nick);
setTimeout(function() {
if(_.has(this.userStack[server], nick)) {
callback(false);
}
2013-08-26 01:09:34 +02:00
}.bind(this), 4000);
2013-08-26 01:04:46 +02:00
}
2013-08-26 00:56:19 +02:00
}.bind(this), 4000);
2013-04-23 20:48:41 +02:00
}
};
this.commands = {
'~auth': function(event) {
var user = event.params[1] || event.user;
2013-10-20 18:16:21 +02:00
this.api.auth(event.server, user, function(isAuthed, account) {
if(isAuthed) {
2013-10-20 18:16:21 +02:00
if(user == account) {
event.reply(dbot.t('authed', { 'nick': user }));
} else {
event.reply(dbot.t('authed_as', {
'nick': user,
'account': account
}));
}
} else {
event.reply(dbot.t('not_authed', { 'nick': user }));
}
});
},
'~hostmask': function(event) {
var user = event.params[1] || event.user;
this.api.getUserHost(event.server, user, function(host) {
if(host) {
event.reply(dbot.t('hostmask', {
'nick': user,
'host': host
}));
} else {
event.reply(dbot.t('no_hostmask', { 'nick': user }));
}
});
}
};
2013-04-23 20:48:41 +02:00
this.listener = function(event) {
if(event.action == 'NOTICE') {
var nickserv = dbot.config.servers[event.server].nickserv,
statusRegex = this.config.servers[event.server].matcher,
acceptableState = this.config.servers[event.server].acceptableState;
2013-04-23 21:07:23 +02:00
if(event.user == nickserv) {
var info = event.params.match(statusRegex);
if(info && _.has(this.authStack, event.server)) {
2013-10-20 18:16:21 +02:00
if(info[3] == acceptableState) {
this.authStack[event.server][info[1]](true, info[2]);
} else {
2013-10-20 18:37:46 +02:00
this.authStack[event.server][info[1]](false, info[2]);
}
2013-04-23 20:48:41 +02:00
}
}
} else if(event.action == '302') {
2013-06-09 19:42:41 +02:00
var match = event.params.match(/:(.+)=([^@]+)@(.+)$/);
2013-08-26 01:09:34 +02:00
if(match && match[1]) match[1] = match[1].replace('\*', '');
if(match && _.has(this.userStack, event.server) && _.has(this.userStack[event.server], match[1])) {
2013-07-05 00:44:19 +02:00
var callback = this.userStack[event.server][match[1]];
delete this.userStack[event.server][match[1]];
2013-07-05 00:44:19 +02:00
callback(match[3].trim());
}
2013-08-26 01:04:46 +02:00
} else if(event.action == '314') {
2013-08-26 01:09:34 +02:00
var params = event.params.split(' '),
2013-08-26 01:04:46 +02:00
nick = params[1],
host = params[3];
if(_.has(this.userStack, event.server) && _.has(this.userStack[event.server], nick)) {
var callback = this.userStack[event.server][nick];
delete this.userStack[event.server][nick];
callback(host);
}
2013-04-23 20:48:41 +02:00
}
}.bind(this);
2013-08-26 01:04:46 +02:00
this.on = ['NOTICE', '302', '314'];
2013-04-23 20:48:41 +02:00
};
exports.fetch = function(dbot) {
return new nickserv(dbot);
};