summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiuseppe Bilotta <giuseppe.bilotta@gmail.com>2007-04-05 22:20:30 +0000
committerGiuseppe Bilotta <giuseppe.bilotta@gmail.com>2007-04-05 22:20:30 +0000
commit7fa6a62c6c54e958459559235997972106ce26d6 (patch)
tree84dffda6c2008e3daec43a8944acca6f992722c1
parentdf7f5c991a7f518177be58be2b0d901c1e8b4353 (diff)
lastfm plugin: command to compactly display next events in a requested location
-rw-r--r--data/rbot/plugins/lastfm.rb61
1 files changed, 58 insertions, 3 deletions
diff --git a/data/rbot/plugins/lastfm.rb b/data/rbot/plugins/lastfm.rb
index f2ecd053..e0fa8a3a 100644
--- a/data/rbot/plugins/lastfm.rb
+++ b/data/rbot/plugins/lastfm.rb
@@ -13,20 +13,33 @@
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