diff options
author | Giuseppe Bilotta <giuseppe.bilotta@gmail.com> | 2009-02-16 21:14:32 +0100 |
---|---|---|
committer | Giuseppe Bilotta <giuseppe.bilotta@gmail.com> | 2009-02-16 21:44:08 +0100 |
commit | b0c190de376cba959429b38f2fb44ec46d681910 (patch) | |
tree | 7c3b13ecbb3f9f7dfc2f41fb127f3bc79a286bdf | |
parent | 909ebc3ca68e4fbfa0fc673e8109cd8131d55a5b (diff) |
lastfm: limits to user data output
Define configuration keys for maximum and default number of user data
items output, with a separate value for shouts (which are usually much
more verbose and therefore would have a much lower maximum and default).
Each command also allow the specification of the number of entries
actually output (different than the default, clipped at the configured
maximum.
This way user data has the same rate limiting as events.
Internally, the switches for the user data are also made more uniform to
select, where it makes sense, different sentences depending on how many
entries are being displayed (none, all, some).
-rw-r--r-- | data/rbot/plugins/lastfm.rb | 93 |
1 files changed, 65 insertions, 28 deletions
diff --git a/data/rbot/plugins/lastfm.rb b/data/rbot/plugins/lastfm.rb index d2e43fa0..71fde1f4 100644 --- a/data/rbot/plugins/lastfm.rb +++ b/data/rbot/plugins/lastfm.rb @@ -53,6 +53,18 @@ class LastFmPlugin < Plugin Config.register Config::IntegerValue.new('lastfm.default_events', :default => 3, :validate => Proc.new{|v| v > 1}, :desc => "Default number of events to display.") + Config.register Config::IntegerValue.new('lastfm.max_shouts', + :default => 5, :validate => Proc.new{|v| v > 1}, + :desc => "Maximum number of user shouts to display.") + Config.register Config::IntegerValue.new('lastfm.default_shouts', + :default => 3, :validate => Proc.new{|v| v > 1}, + :desc => "Default number of user shouts to display.") + Config.register Config::IntegerValue.new('lastfm.max_user_data', + :default => 25, :validate => Proc.new{|v| v > 1}, + :desc => "Maximum number of user data entries (except events and shouts) to display.") + Config.register Config::IntegerValue.new('lastfm.default_user_data', + :default => 10, :validate => Proc.new{|v| v > 1}, + :desc => "Default number of user data entries (except events and shouts) to display.") APIKEY = "b25b959554ed76058ac220b7b2e0a026" APIURL = "http://ws.audioscrobbler.com/2.0/?api_key=#{APIKEY}&" @@ -398,6 +410,14 @@ class LastFmPlugin < Plugin params[:action] end.to_sym + if action == :shouts + num = params[:num] || @bot.config['lastfm.default_shouts'] + num = num.to_i.clip(1, @bot.config['lastfm.max_shouts']) + else + num = params[:num] || @bot.config['lastfm.default_user_data'] + num = num.to_i.clip(1, @bot.config['lastfm.max_user_data']) + end + user = resolve_username(m, params[:user]) uri = "#{APIURL}method=user.get#{action}&user=#{CGI.escape user}" @@ -425,71 +445,88 @@ class LastFmPlugin < Plugin return end + seemore = _("; see %{uri} for more") case action when :friends friends = doc.root.get_elements("friends/user").map do |u| u.elements["name"].text end - unless friends.empty? - m.reply _("%{user} has %{total} friends; %{friends}") % - { :user => user, :total => friends.size, :friends => friends.join(", ") } + if friends.empty? + reply = _("%{user} has no friends :(") + elsif friends.length <= num + reply = _("%{user} has %{total} friends: %{friends}") else - m.reply _("%{user} has no friends :(") % { :user => user } + reply = _("%{user} has %{total} friends, including %{friends}") + reply << seemore end + m.reply reply % { + :user => user, + :total => friends.size, + :friends => friends.shuffle[0, num].join(", "), + :uri => "http://www.last.fm/user/#{CGI.escape user}/friends" + } when :lovedtracks loved = doc.root.get_elements("lovedtracks/track").map do |track| [track.elements["artist/name"].text, track.elements["name"].text].join(" - ") end - loved_prep = loved.shuffle[0..4].to_enum(:each_with_index).collect { |e,i| (i % 2).zero? ? Underline+e+Underline : e } + loved_prep = loved.shuffle[0, num].to_enum(:each_with_index).collect { |e,i| (i % 2).zero? ? Underline+e+Underline : e } - unless loved.empty? - m.reply _("%{user} has loved %{total} tracks, including %{tracks} %{uri}") % { + if loved.empty? + reply = _("%{user} has not loved any tracks") + elsif loved.length <= num + reply = _("%{user} has loved %{total} tracks: %{tracks}") + else + reply = _("%{user} has loved %{total} tracks, including %{tracks}") + reply << seemore + end + m.reply reply % { :user => user, :total => loved.size, :tracks => loved_prep.join(", "), :uri => "http://www.last.fm/user/#{CGI.escape user}/library/loved" } - else - m.reply _("%{user} has not loved any tracks") % { :user => user } - end when :neighbours nbrs = doc.root.get_elements("neighbours/user").map do |u| u.elements["name"].text end - unless nbrs.empty? - m.reply _("%{user}'s musical neighbors include %{nbrs} %{uri}") % { - :user => user, - :nbrs => nbrs.shuffle[0..9].join(", "), - :uri => "http://www.last.fm/user/#{CGI.escape user}/neighbours" - } + if nbrs.empty? + reply = _("no one seems to share %{user}'s musical taste") + elsif nbrs.length <= num + reply = _("%{user} musical neighbours are %{nbrs}") else - m.reply _("no one seems to share %{user}'s musical taste") % { :user => user } + reply = _("%{user} musical neighbours include %{nbrs}") + reply << seemore end + m.reply reply % { + :user => user, + :nbrs => nbrs.shuffle[0, num].join(", "), + :uri => "http://www.last.fm/user/#{CGI.escape user}/neighbours" + } when :recenttracks tracks = doc.root.get_elements("recenttracks/track").map do |track| [track.elements["artist"].text, track.elements["name"].text].join(" - ") end - tracks_prep = tracks.to_enum(:each_with_index).collect { |e,i| (i % 2).zero? ? Underline+e+Underline : e } + tracks_prep = tracks[0, num].to_enum(:each_with_index).collect { |e,i| (i % 2).zero? ? Underline+e+Underline : e } - unless tracks.empty? + if tracks.empty? + m.reply _("%{user} hasn't played anything recently") % { :user => user } + else m.reply _("%{user} has recently played %{tracks}") % { :user => user, :tracks => tracks_prep.join(", ") } - else - m.reply _("%{user} hasn't played anything recently") % { :user => user } end when :shouts shouts = doc.root.get_elements("shouts/shout") - unless shouts.empty? - shouts[0..4].each do |shout| + if shouts.empty? + m.reply _("there are no shouts for %{user}") % { :user => user } + else + shouts[0, num].each do |shout| m.reply _("<%{author}> %{body}") % { :body => shout.elements["body"].text, :author => shout.elements["author"].text, } end - else - m.reply _("there are no shouts for %{user}") % { :user => user } end when :toptracks, :topalbums, :topartists, :weeklytrackchart, :weeklyalbumchart, :weeklyartistchart type = action.to_s.scan(/track|album|artist/).to_s @@ -513,7 +550,7 @@ class LastFmPlugin < Plugin :bold => Bold } end - m.reply items[0..9].join(", ") + m.reply items[0, num].join(", ") end end @@ -535,11 +572,11 @@ plugin.map 'lastfm set verb *present, *past', :action => :set_verb, :thread => t plugin.map 'lastfm who [:who]', :action => :get_user, :thread => true plugin.map 'lastfm compare to :user2', :action => :tasteometer, :thread => true plugin.map 'lastfm compare [:user1] [to] :user2', :action => :tasteometer, :thread => true -plugin.map "lastfm [user] :action [:user]", :thread => true, +plugin.map "lastfm [user] [:num] :action [:user]", :thread => true, :requirements => { :action => /^(?:events|shouts|friends|neighbou?rs|(?:loved|recent?)tracks|top(?:album|artist|track)s?|weekly(?:albums?|artists?|tracks?)(?:chart)?)$/ } -plugin.map 'lastfm [user] :action [:user] over [*period]', :thread => true, +plugin.map 'lastfm [user] [:num] :action [:user] over [*period]', :thread => true, :requirements => { :action => /^(?:top(?:album|artist|track)s?)$/, :period => /^(?:(?:3|6|12) months)|(?:a\s|1\s)?year$/ |