From 96926ab5fa2a9c555af18c6fd9713d91f61e5918 Mon Sep 17 00:00:00 2001 From: reality Date: Thu, 24 Oct 2013 20:31:49 +0000 Subject: [PATCH] fancy ass too complicated suggestion thing + lastfm module rewrite w/ proper api --- modules/lastfm/lastfm.js | 337 ++++++++++++++++++++++-------------- modules/lastfm/strings.json | 3 + modules/profile/api.js | 3 +- modules/profile/profile.js | 10 ++ 4 files changed, 224 insertions(+), 129 deletions(-) diff --git a/modules/lastfm/lastfm.js b/modules/lastfm/lastfm.js index f6e8a67..ae6e4bc 100644 --- a/modules/lastfm/lastfm.js +++ b/modules/lastfm/lastfm.js @@ -9,157 +9,240 @@ var _ = require('underscore')._, var lastfm = function(dbot) { this.ApiRoot = 'http://ws.audioscrobbler.com/2.0/'; - this.api = { - 'getListening': function(user, callback) { - dbot.api.profile.getProfileByUUID(user.id, function(profile) { - if(profile && profile.profile.lastfm != null) { - profile = profile.profile; - request.get(this.ApiRoot, { - 'qs': { - 'user': profile.lastfm, - 'limit': 2, - 'nowplaying': true, - 'method': 'user.getrecenttracks', - 'api_key': this.config.api_key, - 'format': 'json' - }, - 'json': true - }, function(err, res, body) { - if(_.has(body, 'error') && body.error == 6) { - callback('no_user', user, null); - } else if(_.has(body, 'recenttracks') && !_.isUndefined(body.recenttracks.track[0])) { - callback(null, user, body.recenttracks.track[0]); - } else { - callback('no_listen', user, null); - } - }); + this.internalAPI = { + 'getLastFM': function(server, nick, callback) { + dbot.api.profile.getProfile(server, nick, function(err, user, profile) { + if(user) { + if(profile && _.has(profile.profile, 'lastfm')) { + callback(user, profile.profile.lastfm); + } else { + callback(user, null); + } } else { - callback('no_profile', user, null); + callback(null, null); } - }.bind(this)); + }); + } + }; + this.api = { + 'getRandomArtistTrack': function(mbid, callback) { + request.get(this.ApiRoot, { + 'qs': { + 'method': 'artist.gettoptracks', + 'mbid': mbid, + 'api_key': this.config.api_key, + 'format': 'json' + }, + 'json': true + }, function(err, res, body) { + if(_.has(body, 'toptracks') && _.has(body.toptracks, 'track')) { + var tracks = body.toptracks.track; + choice = _.random(0, tracks.length - 1), + track = tracks[choice]; + callback(null, track); + } else { + callback('idk', body); + } + }); + }, + + 'getSimilarArtists': function(mbid, callback) { + request.get(this.ApiRoot, { + 'qs': { + 'method': 'artist.getsimilar', + 'mbid': mbid, + 'api_key': this.config.api_key, + 'format': 'json' + }, + 'json': true + }, function(err, res, body) { + if(_.has(body, 'similarartists') && _.has(body.similarartists, 'artist')) { + callback(null, body.similarartists.artist); + } else { + callback('idk', body); + } + }); + }, + + 'getListening': function(username, callback) { + request.get(this.ApiRoot, { + 'qs': { + 'user': username, + 'limit': 2, + 'nowplaying': true, + 'method': 'user.getrecenttracks', + 'api_key': this.config.api_key, + 'format': 'json' + }, + 'json': true + }, function(err, res, body) { + if(_.has(body, 'error') && body.error == 6) { + callback('no_user', null); + } else if(_.has(body, 'recenttracks') && !_.isUndefined(body.recenttracks.track[0])) { + callback(null, body.recenttracks.track[0]); + } else { + callback('no_listen', null); + } + }); }, 'tasteCompare': function(user, oUser, callback) { - dbot.api.profile.getProfileByUUID(user.id, function(profile) { - if(profile && profile.profile.lastfm != null) { - profile = profile.profile; - dbot.api.profile.getProfileByUUID(oUser.id, function(oProfile) { - if(oProfile && oProfile.profile.lastfm != null) { - oProfile = oProfile.profile; - request.get(this.ApiRoot, { - 'qs': { - 'type1': 'user', - 'type2': 'user', - 'value1': profile.lastfm, - 'value2': oProfile.lastfm, - 'method': 'tasteometer.compare', - 'api_key': this.config.api_key, - 'format': 'json' - }, - 'json': true - }, function(err, res, body) { - console.log(body); - if(_.has(body, 'error') && body.error == 6 || body.error == 7) { - callback('no_user', user, null); - } else if(_.has(body, 'comparison') && _.has(body.comparison, 'result')) { - callback(null, body.comparison.result); - } else { - callback('idk', null); - } - }); - } else { - callback('no_oprofile', null); - } - }.bind(this)); + request.get(this.ApiRoot, { + 'qs': { + 'type1': 'user', + 'type2': 'user', + 'value1': user, + 'value2': oUser, + 'method': 'tasteometer.compare', + 'api_key': this.config.api_key, + 'format': 'json' + }, + 'json': true + }, function(err, res, body) { + if(_.has(body, 'error') && body.error == 6 || body.error == 7) { + callback('no_user', user, null); + } else if(_.has(body, 'comparison') && _.has(body.comparison, 'result')) { + callback(null, body.comparison.result); } else { - callback('no_profile', null); + callback('idk', null); } - }.bind(this)); + }); } }; this.commands = { - '~listening': function(event) { - var outputListening = function(err, user, track) { - if(!err) { - var term = track.name + ' ' + track.artist['#text'], - output = ''; - if(_.has(track, '@attr') && _.has(track['@attr'], 'nowplaying') && track['@attr'].nowplaying == 'true') { - output = dbot.t('now_listening', { - 'user': user.currentNick, - 'track': track.name, - 'artist': track.artist['#text'] - }); - } else { - output = dbot.t('last_listened', { - 'user': user.currentNick, - 'track': track.name, - 'artist': track.artist['#text'] - }); - } - dbot.api.youtube.search(term, function(body) { - if(_.isObject(body) && _.has(body, 'feed') && _.has(body.feed, 'entry')) { - var v = body.feed.entry[0]; - link = v.link[0].href.match(dbot.modules.youtube.LinkRegex); - if(link) { - output += ' - http://youtu.be/' + link[2]; + '~suggestion': function(event) { + if(event.rProfile && _.has(event.rProfile, 'lastfm')) { + this.api.getListening(event.rProfile.lastfm, function(err, track) { + if(!err) { + this.api.getSimilarArtists(track.artist.mbid, function(err, similar) { + if(!err) { + var choice = _.random(0, similar.length - 1); + this.api.getRandomArtistTrack(similar[choice].mbid, function(err, track) { + if(!err) { + var output = dbot.t('lfm_suggestion', { + 'user': event.user, + 'name': track.name, + 'artist': track.artist.name + }); + var term = track.name + ' ' + track.artist.name; + dbot.api.youtube.search(term, function(body) { + if(_.isObject(body) && _.has(body, 'feed') && _.has(body.feed, 'entry')) { + var v = body.feed.entry[0]; + link = v.link[0].href.match(dbot.modules.youtube.LinkRegex); + if(link) { + output += ' - http://youtu.be/' + link[2]; + } + } + event.reply(output); + }); + } else { + event.reply('something broke'); + } + }); + } else { + event.reply('something broke'); } - } - event.reply(output); - }); - } else { - if(err == 'no_user') { - event.reply('Unknown Last.FM user.'); - } else if(err == 'no_listen') { - event.reply(dbot.t('no_listen', { 'user': user.currentNick })); - } else if(err == 'no_profile') { - event.reply('Set a lastfm username with "~set lastfm username"'); - } - } - }; - - if(event.params[1]) { - dbot.api.users.resolveUser(event.server, event.params[1], function(user) { - if(user) { - this.api.getListening(user, outputListening); + }.bind(this)); } else { - event.reply('Unrecognised user.'); + if(err == 'no_user') { + event.reply('Unknown Last.FM user.'); + } else if(err == 'no_listen') { + event.reply(dbot.t('no_listen', { 'user': event.user })); + } } }.bind(this)); } else { - this.api.getListening(event.rUser, outputListening); + event.reply(event.user + ': Set a lastfm username with "~set lastfm username"'); + } + }, + + '~listening': function(event) { + var getListening = function(user, lfm) { + if(user && lfm) { + this.api.getListening(lfm, function(err, track) { + if(!err) { + var term = track.name + ' ' + track.artist['#text'], + output = ''; + if(_.has(track, '@attr') && _.has(track['@attr'], 'nowplaying') && track['@attr'].nowplaying == 'true') { + output = dbot.t('now_listening', { + 'user': user.currentNick, + 'track': track.name, + 'artist': track.artist['#text'] + }); + } else { + output = dbot.t('last_listened', { + 'user': user.currentNick, + 'track': track.name, + 'artist': track.artist['#text'] + }); + } + dbot.api.youtube.search(term, function(body) { + if(_.isObject(body) && _.has(body, 'feed') && _.has(body.feed, 'entry')) { + var v = body.feed.entry[0]; + link = v.link[0].href.match(dbot.modules.youtube.LinkRegex); + if(link) { + output += ' - http://youtu.be/' + link[2]; + } + } + event.reply(output); + }); + } else { + if(err == 'no_user') { + event.reply('Unknown LastFM user.'); + } else if(err == 'no_listen') { + event.reply(dbot.t('no_listen', { 'user': user.currentNick })); + } + } + }); + } else { + if(!user) { + event.reply('Unknown user.'); + } else { + event.reply(user.currentNick + ': Set a lastfm username with "~set lastfm username"'); + } + } + }.bind(this); + + if(event.params[1]) { + this.internalAPI.getLastFM(event.server, event.params[1], getListening); + } else { + getListening(event.rUser, event.rProfile.lastfm); } }, '~taste': function(event) { - var oNick = event.params[1]; - dbot.api.users.resolveUser(event.server, oNick, function(oUser) { - if(oUser) { - this.api.tasteCompare(event.rUser, oUser, function(err, comp) { - if(!err) { - var score = Math.floor(comp.score * 100); - event.reply(dbot.t('taste_compat', { - 'user1': event.user, - 'user2': oUser.currentNick, - 'score': score - })); - } else { - if(err == 'no_user') { - event.reply('Unknown Last.FM user.'); - } else if(err == 'no_profile') { - event.reply(event.user + ': Set a lastfm username with "~set lastfm username"'); - } else if(err == 'no_oprofile') { - event.reply(oUser.currentNick + ': Set a lastfm username with "~set lastfm username"'); + if(event.rProfile && _.has(event.rProfile, 'lastfm')) { + this.internalAPI.getLastFM(event.server, event.params[1], function(u2, lfm2) { + if(u2 && lfm2) { + this.api.tasteCompare(event.rProfile.lastfm, lfm2, function(err, comp) { + if(!err) { + var score = Math.floor(comp.score * 100); + event.reply(dbot.t('taste_compat', { + 'user1': event.user, + 'user2': u2.currentNick, + 'score': score + })); } else { - event.reply('Well something went wrong and I don\'t know what it means'); + if(err == 'no_user') { + event.reply('Unknown Last.FM user.'); + } else { + event.reply('Well something went wrong and I don\'t know what it means'); + } } + }); + } else { + if(!u2) { + event.reply('No such user.'); + } else { + event.reply(u2.currentNick + ': Set a lastfm username with "~set lastfm username"'); } - }); - } else { - event.reply('Unknown user.'); - } - }.bind(this)); + } + }.bind(this)); + } else { + event.reply(event.user + ': Set a lastfm username with "~set lastfm username"'); + } } }; }; diff --git a/modules/lastfm/strings.json b/modules/lastfm/strings.json index 31683ef..dda2848 100644 --- a/modules/lastfm/strings.json +++ b/modules/lastfm/strings.json @@ -10,5 +10,8 @@ }, "taste_compat": { "en": "{user1} and {user2} are {score}% musically compatible!" + }, + "lfm_suggestion": { + "en": "{user}: Try listening to {name} by {artist}" } } diff --git a/modules/profile/api.js b/modules/profile/api.js index 7341cb6..ad73aca 100644 --- a/modules/profile/api.js +++ b/modules/profile/api.js @@ -33,8 +33,7 @@ var api = function(dbot) { this.db.read('profiles', user.id, function(err, profile){ if(!err){ callback(false, user, profile); - } - else{ + } else { callback(true, user, null); } }); diff --git a/modules/profile/profile.js b/modules/profile/profile.js index 2a28d5c..c2f264c 100644 --- a/modules/profile/profile.js +++ b/modules/profile/profile.js @@ -22,6 +22,16 @@ var profile = function(dbot) { // Add API Hooks dbot.api.event.addHook('new_user', this.api.createProfile); + dbot.instance.addPreEmitHook(function(event, callback) { + if(!event.rUser) return callback(); + this.api.getProfileByUUID(event.rUser.id, function(uProfile) { + if(uProfile) { + event.rProfile = uProfile.profile; + callback(); + } + }.bind(this)); + }.bind(this)); + //TODO(@samstudio8) Profile Merging //dbot.api.command.addHook('~mergeusers', this.api.mergeProfile); };