]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/commitdiff
lastfm plugin: command to compactly display next events in a requested location
authorGiuseppe Bilotta <giuseppe.bilotta@gmail.com>
Thu, 5 Apr 2007 22:20:30 +0000 (22:20 +0000)
committerGiuseppe Bilotta <giuseppe.bilotta@gmail.com>
Thu, 5 Apr 2007 22:20:30 +0000 (22:20 +0000)
data/rbot/plugins/lastfm.rb

index f2ecd053dcef480d565baa2a1114c2f7c33f69a0..e0fa8a3a2dcddb8498c9bc90e8720f19a9c1ff8d 100644 (file)
 
 require 'open-uri'
 
+class ::LastFmEvent
+  attr_accessor :url, :date, :artist, :location, :attendance
+  def initialize(url, date, artist, location, attendance)
+    @url = url
+    @date = date
+    @artist = artist
+    @location = location
+    @attendance = attendance
+  end
+end
+
 class LastFmPlugin < Plugin
 
   LASTFM = "http://www.last.fm"
 
   def help(plugin, topic="")
     case topic.intern
+    when :event, :events
+      "lastfm events in <location> => show information on events in or near <location> from last.fm"
     when :artist, :group
       "lastfm artist <name> => show information on artist/group <name> from last.fm"
     when :song, :track
       "lastfm track <name> => show information on track/song <name> from last.fm [not implemented yet]"
     when :album
-      "lastfm album <name> => show information on album <name> from last.fm"
+      "lastfm album <name> => show information on album <name> from last.fm [not implemented yet]"
     else
-      "lastfm <function> <user> => lastfm data for <user> on last.fm where <function> in [recenttracks, topartists, topalbums, toptracks, tags, friends, neighbors]. other topics: artist, group, song, track, album"
+      "lastfm <function> <user> => lastfm data for <user> on last.fm where <function> in [recenttracks, topartists, topalbums, toptracks, tags, friends, neighbors]. other topics: events, artist, group, song, track, album"
     end
   end
 
@@ -35,8 +48,49 @@ class LastFmPlugin < Plugin
     action = :neighbours if action == :neighbors
     what = params[:what]
     case action
+    when :events, :event
+      page = nil
+      begin
+        location = what.to_s.sub(/^in\s+/,'')
+        raise "wrong location #{location}" if location.empty?
+        esc = URI.escape(location)
+        page = @bot.httputil.get "#{LASTFM}/events/?findloc=#{esc}"
+        if page
+          events = Array.new
+          disp_events = Array.new
+
+          # matches are:
+          # 1. day 2. moth 3. year 4. url_who 5. who 6. url_where 7. where 8. how_many
+          pre_events = page.scan(/<tr class="vevent\s+\w+\s+\S+?-(\d\d)-(\d\d)-(\d\d\d\d)\s*">.*?<a class="url summary" href="(\/event\/\d+)">(.*?)<\/a>.*?<a href="(\/venue\/\d+)">(.*?)<\/a>.*?<td class="attendance">(.*?)<\/td>\s+<\/tr>/m)
+          debug pre_events.inspect
+          pre_events.each { |day, month, year, url_who, who, url_where, where, how_many|
+            date = Time.utc(year.to_i, month.to_i, day.to_i)
+            url = LASTFM + url_who
+            artist = who.ircify_html
+            loc = where.ircify_html
+            attendance = how_many.ircify_html
+            events << LastFmEvent.new(url, date, artist, loc, attendance)
+          }
+          debug events.inspect
+
+          events[0..2].each { |event|
+            disp_events << "%s %s @ %s (%s) %s" % [event.date.strftime("%a %b, %d %Y"), event.artist, event.location, event.attendance, event.url]
+          }
+          m.reply disp_events.join(' | ')
+        else
+          m.reply "No events found in #{location}"
+          return
+        end
+      rescue Exception => e
+        m.reply "I had problems looking for events #{what.to_s}"
+        error e.inspect
+        debug e.backtrace.join("\n")
+        debug page[0...10*1024] if page
+        return
+      end
     when :artist, :group
       artist = what.to_s
+      page = nil
       begin
         esc = URI.escape(artist)
         page = @bot.httputil.get "#{LASTFM}/music/#{esc}"
@@ -56,12 +110,13 @@ class LastFmPlugin < Plugin
           m.reply "%s : %s\n%s" % [title, url, wiki]
         else
           m.reply "no data found on #{artist}"
+          return
         end
       rescue Exception => e
         m.reply "I had problems looking for #{artist}"
         error e.inspect
         debug e.backtrace.join("\n")
-        debug page[0...10*1024]
+        debug page[0...10*1024] if page
         return
       end
     when :song, :track