X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=lib%2Frbot%2Fcore%2Futils%2Futils.rb;h=f9912ebb0b367b8e1e450b80b0e340644080ad44;hb=ab0c959bc7305d853e4a52b2a0f25a5fc78f4bfb;hp=7b1ff7f15b81b79b873fce8753cf1b19f1421644;hpb=ab5703bcdf888e0ea9d65ba194eaeea922f72146;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/lib/rbot/core/utils/utils.rb b/lib/rbot/core/utils/utils.rb index 7b1ff7f1..f9912ebb 100644 --- a/lib/rbot/core/utils/utils.rb +++ b/lib/rbot/core/utils/utils.rb @@ -6,9 +6,6 @@ # Author:: Tom Gilbert # Author:: Giuseppe "Oblomov" Bilotta # -# Copyright:: (C) 2002-2006 Tom Gilbert -# Copyright:: (C) 2007 Giuseppe Bilotta -# # TODO some of these Utils should be rewritten as extensions to the approriate # standard Ruby classes and accordingly be moved to extends.rb @@ -172,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 @@ -182,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) @@ -239,9 +238,62 @@ module ::Irc end end + # Returns human readable time. + # Like: 5 days ago + # about one hour ago + # options + # :start_date, sets the time to measure against, defaults to now + # :date_format, used with to_formatted_s, default to :default + def Utils.timeago(time, options = {}) + start_date = options.delete(:start_date) || Time.new + date_format = options.delete(:date_format) || "%x" + 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 + end + end + + # 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 + _("one second") + 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| @@ -580,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) @@ -589,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 @@ -618,11 +670,19 @@ module ::Irc # uri_fragment:: the URI fragment of the original request # def Utils.get_string_html_info(text, opts={}) + debug "getting string html info" txt = text.dup title = txt.ircify_html_title + debug opts if frag = opts[:uri_fragment] and not frag.empty? - fragreg = /.*?]*name=["']?#{frag}["']?.*?>/im - txt.sub!(fragreg,'') + fragreg = /]+\s+)?(?:name|id)=["']?#{frag}["']?[^>]*>/im + debug fragreg + debug txt + if txt.match(fragreg) + # grab the post-match + txt = $' + end + debug txt end c_opts = opts.dup c_opts[:strip] ||= title @@ -663,6 +723,20 @@ module ::Irc return retval end + # Returns a comma separated list except for the last element + # which is joined in with specified conjunction + # + def Utils.comma_list(words, options={}) + defaults = { :join_with => ", ", :join_last_with => _(" and ") } + opts = defaults.merge(options) + + if words.size < 2 + words.last + else + [words[0..-2].join(opts[:join_with]), words.last].join(opts[:join_last_with]) + end + end + end end