forked from GitHub/dbot
~tastiest
This commit is contained in:
parent
41fe000bf4
commit
93c53b93e2
@ -4,7 +4,8 @@
|
||||
*/
|
||||
|
||||
var _ = require('underscore')._,
|
||||
request = require('request');
|
||||
request = require('request'),
|
||||
async = require('async');
|
||||
|
||||
var lastfm = function(dbot) {
|
||||
this.ApiRoot = 'http://ws.audioscrobbler.com/2.0/';
|
||||
@ -226,6 +227,68 @@ var lastfm = function(dbot) {
|
||||
});
|
||||
},
|
||||
|
||||
'~tastiest': function(event) {
|
||||
dbot.api.profile.getAllProfilesWith('lastfm', function(profiles) {
|
||||
if(profiles) {
|
||||
var scores = {}; // Using this structure first for easier testing in the async
|
||||
async.eachSeries(profiles, function(p1, next) {
|
||||
scores[p1.id] = {};
|
||||
async.eachSeries(profiles, function(p2, subnext) {
|
||||
if(p1.id == p2.id || _.has(scores, p2.id) && _.has(scores[p2.id], p1.id)) {
|
||||
subnext();
|
||||
} else {
|
||||
this.api.tasteCompare(p1.profile.lastfm, p2.profile.lastfm, function(err, comp) {
|
||||
if(!err) {
|
||||
var score = Math.floor(comp.score * 100);
|
||||
scores[p1.id][p2.id] = score;
|
||||
}
|
||||
subnext();
|
||||
});
|
||||
}
|
||||
}.bind(this), function() { next(); });
|
||||
}.bind(this), function(err) {
|
||||
// Now we better structure the scores for sorting
|
||||
var goodScores = [];
|
||||
_.each(scores, function(subscores, p1) {
|
||||
_.each(subscores, function(aScore, p2) {
|
||||
goodScores.push({
|
||||
'p1': p1,
|
||||
'p2': p2,
|
||||
'score': aScore
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
var tastiest = _.chain(goodScores)
|
||||
.sortBy(function(p) { return p.score; })
|
||||
.reverse()
|
||||
.first(10)
|
||||
.value();
|
||||
|
||||
async.each(tastiest, function(pair, done) {
|
||||
dbot.api.users.getUser(pair.p1, function(user) {
|
||||
pair.p1 = user;
|
||||
dbot.api.users.getUser(pair.p2, function(user) {
|
||||
pair.p2 = user;
|
||||
done();
|
||||
});
|
||||
});
|
||||
}, function() {
|
||||
var output = 'Most musically compatible users: ';
|
||||
_.each(tastiest, function(pair) {
|
||||
output += pair.p1.currentNick + ' & ' +
|
||||
pair.p2.currentNick + ' (' + pair.score +
|
||||
'%), ';
|
||||
});
|
||||
event.reply(output.slice(0, -2));
|
||||
});
|
||||
});
|
||||
} else {
|
||||
event.reply('No suitable profiles');
|
||||
}
|
||||
}.bind(this));
|
||||
},
|
||||
|
||||
'~artists': function(event) {
|
||||
var u1 = event.rUser,
|
||||
lfm1 = event.rProfile.lastfm,
|
||||
|
@ -64,6 +64,21 @@ var api = function(dbot) {
|
||||
});
|
||||
},
|
||||
|
||||
'getAllProfilesWith': function(item, callback) {
|
||||
var profiles = [];
|
||||
this.db.scan('profiles', function(profile) {
|
||||
if(_.has(profile.profile, item)) {
|
||||
profiles.push(profile);
|
||||
}
|
||||
}, function(err) {
|
||||
if(!err) {
|
||||
callback(profiles);
|
||||
} else {
|
||||
console.log(err);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
'setProperty': function(server, nick, field, value, callback){
|
||||
this.api.getProfile(server, nick, function(err, user, profile){
|
||||
if(!err){
|
||||
|
Loading…
Reference in New Issue
Block a user