X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=data%2Frbot%2Fplugins%2Flastfm.rb;h=c288324833cd1d8318803981d8c2078222dc8a47;hb=16336b4a240a4265d1f2df1e30d7b68d3a924287;hp=a5f526f16a08032f64a20ca1714a50697d0484f0;hpb=5bcdd4c8279b35d78ed80883a77b7e459228b92d;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/data/rbot/plugins/lastfm.rb b/data/rbot/plugins/lastfm.rb index a5f526f1..c2883248 100644 --- a/data/rbot/plugins/lastfm.rb +++ b/data/rbot/plugins/lastfm.rb @@ -47,6 +47,8 @@ class ::LastFmEvent end +define_structure :LastFmVenue, :id, :city, :street, :postal, :country, :name, :url, :lat, :long + class LastFmPlugin < Plugin include REXML Config.register Config::IntegerValue.new('lastfm.max_events', @@ -129,17 +131,55 @@ class LastFmPlugin < Plugin end end + # TODO allow searching by country etc. + # + # Options: name, limit + def search_venue_by(options) + params = {} + params[:venue] = CGI.escape(options[:name]) + options.delete(:name) + params.merge!(options) + + uri = "#{APIURL}method=venue.search&" + uri << params.to_a.map {|e| e.join("=")}.join("&") + + xml = @bot.httputil.get_response(uri) + doc = Document.new xml.body + results = [] + + doc.root.elements.each("results/venuematches/venue") do |v| + venue = LastFmVenue.new + venue.id = v.elements["id"].text.to_i + venue.url = v.elements["url"].text + venue.lat = v.elements["location/geo:point/geo:lat"].text.to_f + venue.long = v.elements["location/geo:point/geo:long"].text.to_f + venue.name = v.elements["name"].text + venue.city = v.elements["location/city"].text + venue.street = v.elements["location/street"].text + venue.postal = v.elements["location/postalcode"].text + venue.country = v.elements["location/country"].text + + results << venue + end + results + end + def find_events(m, params) num = params[:num] || @bot.config['lastfm.default_events'] num = num.to_i.clip(1, @bot.config['lastfm.max_events']) location = params[:location] artist = params[:who] + venue = params[:venue] user = resolve_username(m, params[:user]) if location uri = "#{APIURL}method=geo.getevents&location=#{CGI.escape location.to_s}" emptymsg = _("no events found in %{location}") % {:location => location.to_s} + elsif venue + venues = search_venue_by(:name => venue.to_s, :limit => 1) + venue = venues.first + uri = "#{APIURL}method=venue.getevents&venue=#{venue.id}" elsif artist uri = "#{APIURL}method=artist.getevents&artist=#{CGI.escape artist.to_s}" emptymsg = _("no events found by %{artist}") % {:artist => artist.to_s} @@ -376,6 +416,44 @@ class LastFmPlugin < Plugin end end + def find_venue(m, params) + venue = params[:venue].to_s + venues = search_venue_by(:name => venue, :limit => 1) + venue = venues.last + + if venues.empty? + m.reply "sorry, can't find such venue" + return + end + + reply = _("%{b}%{name}%{b}, %{street}, %{u}%{city}%{u}, %{country}, see %{url} for more info") % { + :u => Underline, :b => Bold, :name => venue.name, :city => venue.city, :street => venue.street, + :country => venue.country, :url => venue.url + } + + if venue.street && venue.city + maps_uri = "http://maps.google.com/maps?q=#{venue.street},+#{venue.city}" + maps_uri << ",+#{venue.postal}" if venue.postal + elsif venue.lat && venue.long + maps_uri = "http://maps.google.com/maps?q=#{venue.lat},+#{venue.long}" + else + m.reply reply + return + end + + maps_uri << "+(#{venue.name.gsub(" ", "%A0")})" + + begin + require "shorturl" + maps_uri = ShortURL.shorten(CGI.escape(maps_uri)) + rescue LoadError => e + error e + end + + reply << _(" and %{maps} for maps") % { :maps => maps_uri, :b => Bold } + m.reply reply + end + def get_album(artist, album) xml = @bot.httputil.get("#{APIURL}method=album.getinfo&artist=#{CGI.escape artist}&album=#{CGI.escape album}") unless xml @@ -632,10 +710,12 @@ end plugin = LastFmPlugin.new plugin.map 'lastfm [:num] event[s] in *location', :action => :find_events, :requirements => { :num => /\d+/ }, :thread => true plugin.map 'lastfm [:num] event[s] by *who', :action => :find_events, :requirements => { :num => /\d+/ }, :thread => true +plugin.map 'lastfm [:num] event[s] at *venue', :action => :find_events, :requirements => { :num => /\d+/ }, :thread => true plugin.map 'lastfm [:num] event[s] [for] *who', :action => :find_events, :requirements => { :num => /\d+/ }, :thread => true plugin.map 'lastfm artist *artist', :action => :find_artist, :thread => true plugin.map 'lastfm album *album [by *artist]', :action => :find_album plugin.map 'lastfm track *track', :action => :find_track, :thread => true +plugin.map 'lastfm venue *venue', :action => :find_venue, :thread => true plugin.map 'lastfm set user[name] :who', :action => :set_user, :thread => true plugin.map 'lastfm set verb *present, *past', :action => :set_verb, :thread => true plugin.map 'lastfm who [:who]', :action => :get_user, :thread => true