]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/commitdiff
geoip plugin: added nick based network-wide lookup and fixed some charset issues
authorRaine Virta <rane@kapsi.fi>
Mon, 11 Aug 2008 16:11:27 +0000 (19:11 +0300)
committerGiuseppe Bilotta <giuseppe.bilotta@gmail.com>
Mon, 11 Aug 2008 16:26:47 +0000 (18:26 +0200)
data/rbot/plugins/geoip.rb

index 2fde9594b2428024d43d04a20ee45faac8f3211e..15372a8ba7f4fa1d75f8f64e6ac83a271922d510 100755 (executable)
@@ -7,25 +7,44 @@
 # Copyright:: (C) 2008 Raine Virta
 # License:: GPL v2
 #
-# Resolves the geographic locations of users and IP addresses
+# Resolves the geographic locations of users (network-wide) and IP addresses
 
 module GeoIP
   GEO_IP = "http://www.geoiptool.com/en/?IP="
+  REGEX  = {
+    :country => %r{Country:.*?<a href=".*?" target="_blank"> (.*?)</a>}m,
+    :region  => %r{Region:.*?<a href=".*?" target="_blank">(.*?)</a>}m,
+    :city    => %r{City:.*?<td align="left" class="arial_bold">(.*?)</td>}m
+  }
+
 
   def self.resolve(hostname)
-    raw = Irc::Utils.bot.httputil.get(GEO_IP+hostname, :cache => true)
+    res = {}
+    raw = Irc::Utils.bot.httputil.get_response(GEO_IP+hostname)
+    raw = raw.decompress_body(raw.raw_body)
 
-    {
-      :country => raw.scan(%r{Country:.*?<a href=".*?" target="_blank"> (.*?)</a>}m).to_s,
-      :region  => raw.scan(%r{Region:.*?<a href=".*?" target="_blank">(.*?)</a>}m).to_s,
-      :city    => raw.scan(%r{City:.*?<td align="left" class="arial_bold">(.*?)</td>}m).to_s
-    }
+    REGEX.each { |key, regex| res[key] = Iconv.conv('utf-8', 'ISO-8859-1', raw.scan(regex).to_s) }
+
+    return res
   end
 end
 
 class GeoIpPlugin < Plugin
   def help(plugin, topic="")
-    "geoip [<user|hostname|ip>] => returns the geographic location of whichever has been given"
+    "geoip [<user|hostname|ip>] => returns the geographic location of whichever has been given -- note: user can be anyone on the network"
+  end
+
+  def whois(m)
+    # need to see if the whois reply was invoked by this plugin
+    return unless m.whois[:nick] == @nick
+
+    if m.target
+      @bot.say @source, host2output(m.target.host, m.target.nick)
+    else
+      @bot.say @source, "no such user on "+@bot.server.hostname.split(".")[-2]
+    end
+
+    @nick, @source = nil
   end
 
   def geoip(m, params)
@@ -33,7 +52,8 @@ class GeoIpPlugin < Plugin
       m.reply host2output(m.source.host, m.source.nick)
     else
       if m.replyto.class == Channel
-        # check if there is an user with nick same as input given
+
+        # check if there is an user on the channel with nick same as input given
         user = m.replyto.users.find { |user| user.nick == params[:input] }
 
         if user
@@ -42,11 +62,17 @@ class GeoIpPlugin < Plugin
         end
       end
 
+      # input is a host name or an IP
       if params[:input] =~ /[a-z0-9\-]+(?:\.[a-z0-9\-]+)*\.[a-z]{2,3}/i ||
          params[:input] =~ Resolv::IPv4::Regex
         m.reply host2output(params[:input])
+
+      # assume input is a nick
       else
-        m.reply "invalid input"
+        @source = m.replyto
+        @nick   = params[:input]
+
+        @bot.whois(@nick)
       end
     end
   end
@@ -55,7 +81,7 @@ class GeoIpPlugin < Plugin
     geo = GeoIP::resolve(host)
 
     if geo[:country].empty?
-      return _("#{host} could not be resolved")
+      return _("#{nick ? "#{nick}'s location" : host} could not be resolved")
     end
 
     res = _("%{thing} is #{nick ? "from" : "located in"}") % {