X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=lib%2Frbot%2Fcore%2Futils%2Futils.rb;h=77bdeecfb1cdeebc8a1759a622e148f5076b0be6;hb=783ffa4235330029d661752b1023db635b26f2b3;hp=5af26b699090cdf872fd1d2b637919e40de243b3;hpb=fd83bd02e2b82457e0a49214e075173505ebe994;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/lib/rbot/core/utils/utils.rb b/lib/rbot/core/utils/utils.rb index 5af26b69..77bdeecf 100644 --- a/lib/rbot/core/utils/utils.rb +++ b/lib/rbot/core/utils/utils.rb @@ -169,7 +169,7 @@ module ::Irc def Utils.bot=(b) debug "initializing utils" @@bot = b - @@safe_save_dir = "#{@@bot.botclass}/safe_save" + @@safe_save_dir = @@bot.path('safe_save') end @@ -179,10 +179,12 @@ module ::Irc SEC_PER_HR = SEC_PER_MIN * 60 # Seconds per day SEC_PER_DAY = SEC_PER_HR * 24 + # Seconds per week + SEC_PER_WK = SEC_PER_DAY * 7 # Seconds per (30-day) month SEC_PER_MNTH = SEC_PER_DAY * 30 - # Second per (30*12 = 360 day) year - SEC_PER_YR = SEC_PER_MNTH * 12 + # Second per (non-leap) year + SEC_PER_YR = SEC_PER_DAY * 365 # Auxiliary method needed by Utils.secs_to_string def Utils.secs_to_string_case(array, var, string, plural) @@ -245,45 +247,53 @@ module ::Irc def Utils.timeago(time, options = {}) start_date = options.delete(:start_date) || Time.new date_format = options.delete(:date_format) || "%x" - delta_minutes = (start_date.to_i - time.to_i).floor / 60 - if delta_minutes.abs <= (8724*60) # eight weeks? I'm lazy to count days for longer than that - distance = Utils.distance_of_time_in_words(delta_minutes); - if delta_minutes < 0 + delta = (start_date - time).round + if delta.abs < 2 + _("right now") + else + distance = Utils.age_string(delta) + if delta < 0 _("%{d} from now") % {:d => distance} else _("%{d} ago") % {:d => distance} end - else - return _("on %{date}") % {:date => time.strftime(date_format)} end end - # Translates a number of minutes into verbal distances. - # e.g. 0.5 => less than a minute - # 70 => about one hour - def Utils.distance_of_time_in_words(minutes) - case - when minutes < 0 - Utils.distance_of_time_in_words(-minutes) - when minutes < 1 - _("less than a minute") - when minutes < 50 - _("%{m} minutes") % {:m => minutes} - when minutes < 90 - _("about one hour") - when minutes < 1080 - _("%{m} hours") % {:m => (minutes / 60).round} - when minutes < 1440 - _("one day") - when minutes < 2880 - _("about one day") + + # Converts age in seconds to "nn units". Inspired by previous attempts + # but also gitweb's age_string() sub + def Utils.age_string(secs) + case + when secs < 0 + Utils.age_string(-secs) + when secs > 2*SEC_PER_YR + _("%{m} years") % { :m => secs/SEC_PER_YR } + when secs > 2*SEC_PER_MNTH + _("%{m} months") % { :m => secs/SEC_PER_MNTH } + when secs > 2*SEC_PER_WK + _("%{m} weeks") % { :m => secs/SEC_PER_WK } + when secs > 2*SEC_PER_DAY + _("%{m} days") % { :m => secs/SEC_PER_DAY } + when secs > 2*SEC_PER_HR + _("%{m} hours") % { :m => secs/SEC_PER_HR } + when (20*SEC_PER_MIN..40*SEC_PER_MIN).include?(secs) + _("half an hour") + when (50*SEC_PER_MIN..70*SEC_PER_MIN).include?(secs) + # _("about one hour") + _("an hour") + when (80*SEC_PER_MIN..100*SEC_PER_MIN).include?(secs) + _("an hour and a half") + when secs > 2*SEC_PER_MIN + _("%{m} minutes") % { :m => secs/SEC_PER_MIN } + when secs > 1 + _("%{m} seconds") % { :m => secs } else - _("%{m} days") % {:m => (minutes / 1440).round} + _("one second") + end end - end - # Execute an external program, returning a String obtained by redirecting - # the program's standards errors and output + # the program's standards errors and output # def Utils.safe_exec(command, *args) IO.popen("-") { |p| @@ -622,7 +632,7 @@ module ::Irc # returns non-nil, its results are merged in _ds_ and returned. Otherwise # nil is returned. # - # The input DataStream shuold have the downloaded HTML as primary key + # The input DataStream should have the downloaded HTML as primary key # (:text) and possibly a :headers key holding the resonse headers. # def Utils.try_htmlinfo_filters(ds) @@ -631,7 +641,7 @@ module ::Irc cur = nil # TODO filter priority filters.each { |n| - debug "testing filter #{n}" + debug "testing htmlinfo filter #{n}" cur = @@bot.filter(@@bot.global_filter_name(n, :htmlinfo), ds) debug "returned #{cur.pretty_inspect}" break if cur