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',
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}
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
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