dbot/modules/users/api.js

159 lines
5.2 KiB
JavaScript
Raw Permalink Normal View History

var _ = require('underscore')._,
uuid = require('node-uuid'),
databank = require('databank'),
AlreadyExistsError = databank.AlreadyExistsError,
NoSuchThingError = databank.NoSuchThingError,
NotImplementedError = databank.NotImplementedError;
var api = function(dbot) {
var escapeRegexen = function(str) {
return (str+'').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
};
var api = {
// Return a user record given a primary nick or an alias
'resolveUser': function(server, nick, callback) {
var user = false;
this.db.search('users', { 'server': server }, function(result) {
if(result.primaryNick == nick || _.include(result.aliases, nick)) {
user = result;
}
}, function(err) {
if(!err) {
callback(user);
}
});
},
// Return many user records given primary nicks of aliases
'resolveUsers': function(server, nicks, callback) {
var users = [];
this.db.search('users', { 'server': server }, function(result) {
var pNicks = result.aliases.slice(0).unshift(result.primaryNick);
for(var i=0;i<pNicks.length;i++) {
var n = _.indexOf(nicks, pNicks[i]);
if(n != -1) {
users.push(result);
nicks = _.without(nicks, nicks[n]);
break;
}
}
}, function(err) {
if(!err) {
console.log(nicks);
callback(users, nicks);
}
});
},
2013-04-10 01:16:00 +02:00
// Return a user record given a UUID
'getUser': function(uuid, callback) {
2013-04-20 20:40:30 +02:00
this.db.read('users', uuid, function(err, user) {
2013-04-10 01:16:00 +02:00
if(err) user = false;
callback(user);
});
},
'getChannel': function(server, channelName, callback) {
var channel = false;
this.db.search('channel_users', {
'server': server,
'name': channelName
}, function(result) {
channel = result;
}, function(err) {
if(!err) {
callback(channel);
}
});
},
'getRandomChannelUser': function(server, channel, callback) {
var channel;
this.db.search('channel_users', {
'server': server,
'channel': channel
}, function(result) {
channel = result;
}, function(err) {
if(!err) {
if(!_.isUndefined(channel.users)) {
var randomUser = channel.users[_.random(0, channel.users.length - 1)];
this.api.resolveUser(server, randomUser, function(user) {
callback(user);
});
} else {
callback(false);
}
}
});
2013-01-26 20:21:09 +01:00
},
'getAllUsers': function(callback) {
var users = [];
this.db.scan('users', function(user) {
users.push(user);
}, function(err) {
if(!err) {
callback(users);
}
});
2013-01-22 01:24:12 +01:00
},
'getAllChannels': function(callback) {
var channels = [];
this.db.scan('channel_users', function(channel) {
channels.push(channel);
}, function(err) {
if(!err) {
callback(channels);
}
});
},
'isOnline': function(server, nick, channel, callback) {
this.api.resolveUser(server, nick, function(user) {
var possiNicks = [user].concat(user.aliases);
2013-01-24 01:23:26 +01:00
if(_.has(dbot.instance.connections[server].channels, channel)) {
var onlineNicks = dbot.instance.connections[server].channels[channel].nicks;
var isOnline = _.any(onlineNicks, function(nick) {
nick = nick.name;
return _.include(possiNicks, nick);
}, this);
callback(isOnline);
}
});
},
'isKnownUser': function(server, nick, callback) {
this.api.resolveUser(server, nick, function(isKnown) {
if(isKnown == false) {
callback(false);
} else {
callback(true);
}
});
}
};
api['resolveUser'].external = true;
api['resolveUser'].extMap = [ 'server', 'nick', 'callback' ];
api['getChannel'].external = true;
api['getChannel'].extMap = [ 'server', 'channel', 'callback' ];
2013-04-20 18:34:02 +02:00
api['getAllUsers'].external = true;
api['getAllUsers'].extMap = [ 'callback' ];
api['getAllChannels'].external = true;
api['getAllChannels'].extMap = [ 'callback' ];
return api;
};
exports.fetch = function(dbot) {
return api(dbot);
};