]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - data/rbot/plugins/wow.rb
From Ralph Churchill, a new weather plugin using the new XML format rather
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / wow.rb
diff --git a/data/rbot/plugins/wow.rb b/data/rbot/plugins/wow.rb
new file mode 100644 (file)
index 0000000..4faadaf
--- /dev/null
@@ -0,0 +1,123 @@
+#
+# World of Warcraft Realm Status plugin for rbot
+# by MrChucho (mrchucho@mrchucho.net)
+# Copyright (C) 2006 Ralph M. Churchill
+#
+# Requires: insatiable appetite for World of Warcraft
+#
+require 'open-uri'
+require 'rexml/document'
+
+class Realm
+    attr_accessor :name,:status,:type,:pop
+    def initialize(name,status,type,pop)
+        self.name = pretty_realm(name)
+        self.status = pretty_status(status)
+        self.type = pretty_type(type)
+        self.pop = pretty_pop(pop)
+    end
+    def Realm.get_realm_status(realm_name)
+        begin
+            open("http://www.worldofwarcraft.com/realmstatus/status.xml") do |xmldoc|
+                realm_list = (REXML::Document.new xmldoc).root
+                realm_data = realm_list.elements["r[@n=\"#{realm_name}\"]"]
+                if realm_data and realm_data.attributes.any? then
+                    realm = Realm.new(
+                        realm_data.attributes['n'],
+                        realm_data.attributes['s'].to_i,
+                        realm_data.attributes['t'].to_i,
+                        realm_data.attributes['l'].to_i)
+                else
+                    "Realm, #{realm_name}, not found."
+                end
+            end
+        rescue => err
+            "Error retrieving realm status: #{err}"
+        end
+    end
+    def to_s
+        "#{name} (#{type}) Status: #{status} Population: #{pop}"
+    end
+    # just a longer, tabluar format
+    # might be good if displaying multiple realms
+    def _to_s
+        sprintf("%-8s %-20s %-8s %-9s\n%-11s %-22s %-8s %-9s",
+            "Status","Realm","Type","Population",
+            status,name,type,pop)
+    end
+private
+    def pretty_status(status)
+        case status
+        when 1
+            "\ 33Up\ 3"
+        when 2
+            "\ 35Down\ 3"
+        end
+    end
+    def pretty_pop(pop)
+        case pop
+        when 1
+            "\ 33Low\ 3"
+        when 2
+            "\ 37Medium\ 3"
+        when 3
+            "\ 34High\ 3"
+        when 4
+            "\ 35Max(Queued)\ 3"
+        end
+    end
+    def pretty_realm(realm)
+        "\ 2#{realm}\ 2"
+    end
+    def pretty_type(type)
+        case type
+        when 0
+            'RP-PVP'
+        when 1
+            'Normal'
+        when 2
+            'PVP'
+        when 3
+            'RP'
+        end
+    end
+end
+
+class RealmPlugin < Plugin
+    USAGE="realm <realm> => determine the status of a Warcraft realm"
+    def initialize
+        super
+        class << @registry
+            def store(val)
+                val
+            end
+            def restore(val)
+                val
+            end
+        end
+    end
+    def help(plugin,topic="")
+        USAGE
+    end
+    def usage(m,params={})
+        m.reply USAGE
+    end
+    def realm(m,params)
+        if params[:realm_name] and params[:realm_name].any?
+            realm_name = params[:realm_name].collect{|tok|
+                tok.capitalize
+            }.join(' ')
+            @registry[m.sourcenick] = realm_name
+            m.reply Realm.get_realm_status(realm_name)
+        else
+            if @registry.has_key?(m.sourcenick)
+                realm_name = @registry[m.sourcenick]
+                m.reply Realm.get_realm_status(realm_name)
+            else
+                m.reply "I don't know which realm you want.\n#{USAGE}"
+            end
+        end
+    end
+end
+plugin = RealmPlugin.new
+plugin.map 'realm *realm_name', :defaults => {:realm_name => false}