-- TODO: Add support for librefm API. -- Just kidding, nobody actually uses that. local lastfm = {} local HTTP = require('socket.http') local URL = require('socket.url') local JSON = require('dkjson') local utilities = require('otouto.utilities') function lastfm:init(config) assert( config.lastfm_api_key, 'lastfm.lua requires a last.fm API key from http://last.fm/api.' ) lastfm.triggers = utilities.triggers(self.info.username, config.cmd_pat):t('lastfm', true):t('np', true):t('npfull', true):t('fmset', true).table lastfm.doc = config.cmd_pat .. [[np [username] Returns what you are or were last listening to. If you specify a username, info will be returned for that username. ]] .. config.cmd_pat .. [[npfull [username] Works like ]] .. config.cmd_pat .. [[np, but returns more info, differently formatted and including album art, if available. ]] .. config.cmd_pat .. [[fmset Sets your last.fm username. Otherwise, ]] .. config.cmd_pat .. [[np will use your Telegram username. Use "]] .. config.cmd_pat .. [[fmset --" to delete it.]] lastfm.command = 'lastfm' lastfm.base_url = 'http://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&format=json&limit=1&api_key=' .. config.lastfm_api_key .. '&user=' end function lastfm:action(msg, config) local input = utilities.input(msg.text) local from_id_str = tostring(msg.from.id) self.database.userdata[from_id_str] = self.database.userdata[from_id_str] or {} if string.match(msg.text_lower, '^'..config.cmd_pat..'lastfm') then utilities.send_message(msg.chat.id, lastfm.doc, true, msg.message_id, 'html') return elseif string.match(msg.text_lower, '^'..config.cmd_pat..'fmset') then if not input then utilities.send_message(msg.chat.id, lastfm.doc, true, msg.message_id, 'html') elseif input == '--' or input == utilities.char.em_dash then self.database.userdata[from_id_str].lastfm = nil utilities.send_reply(msg, 'Your last.fm username has been forgotten.') else self.database.userdata[from_id_str].lastfm = input utilities.send_reply(msg, 'Your last.fm username has been set to "' .. input .. '".') end return end local username local alert = '' if input then username = input elseif self.database.userdata[from_id_str].lastfm then username = self.database.userdata[from_id_str].lastfm elseif msg.from.username then username = msg.from.username alert = '\n\nYour username has been set to ' .. username .. '.\nTo change it, use '..config.cmd_pat..'fmset .' self.database.userdata[from_id_str].lastfm = username else utilities.send_reply(msg, 'Please specify your last.fm username or set it with '..config.cmd_pat..'fmset.') return end local orig = HTTP.TIMEOUT HTTP.TIMEOUT = 1 local jstr, res = HTTP.request(lastfm.base_url .. URL.escape(username)) HTTP.TIMEOUT = orig if res ~= 200 then utilities.send_reply(msg, config.errors.connection) return end local jdat = JSON.decode(jstr) if jdat.error then utilities.send_reply(msg, 'Please specify your last.fm username or set it with '..config.cmd_pat..'fmset.') return end local track = jdat.recenttracks.track[1] or jdat.recenttracks.track if not track then utilities.send_reply(msg, 'No history for this user.' .. alert) return end local output = utilities.html_escape(input or msg.from.first_name) if track['@attr'] and track['@attr'].nowplaying then output = output .. ' is currently listening to:' else output = output .. ' last listened to:' end if msg.text_lower:match('^' .. config.cmd_pat .. 'npfull') then output = '' .. utilities.html_escape(output) .. '' if track.name and #track.name > 0 then output = output .. '\n🎵 ' .. utilities.html_escape(track.name) else output = output .. '\n🎵 Unknown' end if track.artist and track.artist['#text'] and #track.artist['#text'] > 0 then output = output .. '\n👤 ' .. utilities.html_escape(track.artist['#text']) end if track.album and track.album['#text'] and #track.album['#text'] > 0 then output = output .. '\n💿 ' .. utilities.html_escape(track.album['#text']) end -- album art if track.image and track.image[3] and #track.image[3]['#text'] > 0 then output = '' .. utilities.char.zwnj .. '' .. output end else output = output .. '\n' if track.artist and track.artist['#text'] and #track.artist['#text'] > 0 then output = output .. utilities.html_escape(track.artist['#text']) .. ' - ' end output = output .. utilities.html_escape((track.name or 'Unknown')) end output = output .. alert utilities.send_message(msg.chat.id, output, nil, nil, 'html') end return lastfm