#!/usr/bin/eruby <% require 'cgi' require 'cgi/session' require 'uri' require 'net/http' require "rexml/document" require 'pp' ##################### @stats = { "Druid" => { "Intellect" => ["page/characterInfo/characterTab/baseStats/intellect", "effective"], "Agility" => ["page/characterInfo/characterTab/baseStats/agility", "effective"], "Strength" => ["page/characterInfo/characterTab/baseStats/strength", "effective"], "Stamina" => ["page/characterInfo/characterTab/baseStats/stamina", "effective"], "Spirit" => ["page/characterInfo/characterTab/baseStats/spirit", "effective"], "Arcane Damage" => ["page/characterInfo/characterTab/spell/bonusDamage/arcane", "value"], "Arcane Crit Chance" => ["page/characterInfo/characterTab/spell/critChance/arcane", "percent"], "Nature Damage" => ["page/characterInfo/characterTab/spell/bonusDamage/nature", "value"], "Nature Crit Chance" => ["page/characterInfo/characterTab/spell/critChance/nature", "percent"], "Spell Penetration" => ["page/characterInfo/characterTab/spell/penetration", "value"], "Mana Regen" => ["page/characterInfo/characterTab/spell/manaRegen", "casting"], "Healing" => ["page/characterInfo/characterTab/spell/bonusHealing", "value"], "Armor" => ["page/characterInfo/characterTab/baseStats/armor", "effective"], "Attack Power" => ["page/characterInfo/characterTab/melee/power", "effective"], "+Hit" => ["page/characterInfo/characterTab/melee/hitRating", "increasedHitPercent"], "+Crit" => ["page/characterInfo/characterTab/melee/critChance", "percent"], "Dodge" => ["page/characterInfo/characterTab/defenses/dodge", "percent"], "Defense" => ["page/characterInfo/characterTab/defenses/defense", "value"], "Parry" => ["page/characterInfo/characterTab/defenses/parry", "percent"], "Resilience" => ["page/characterInfo/characterTab/defenses/resilience", "value"] }, "Hunter" => { "Agility" => ["page/characterInfo/characterTab/baseStats/agility", "effective"], "Intellect" => ["page/characterInfo/characterTab/baseStats/intellect", "effective"], "Stamina" => ["page/characterInfo/characterTab/baseStats/stamina", "effective"], "Attack Power" => ["page/characterInfo/characterTab/ranged/power", "effective"], "Hit" => ["page/characterInfo/characterTab/ranged/hitRating", "increasedHitPercent"], "Crit" => ["page/characterInfo/characterTab/ranged/critChance", "percent"], "Ranged Weapon DPS" => ["page/characterInfo/characterTab/ranged/damage", "dps"], "Resilience" => ["page/characterInfo/characterTab/defenses/resilience", "value"], "Mana Regen" => ["page/characterInfo/characterTab/spell/manaRegen", "casting"], "Resilience" => ["page/characterInfo/characterTab/defenses/resilience", "value"] }, "Mage" => { "Intellect" => ["page/characterInfo/characterTab/baseStats/intellect", "effective"], "Stamina" => ["page/characterInfo/characterTab/baseStats/stamina", "effective"], "Arcane Damage" => ["page/characterInfo/characterTab/spell/bonusDamage/arcane", "value"], "Fire Damage" => ["page/characterInfo/characterTab/spell/bonusDamage/fire", "value"], "Frost Damage" => ["page/characterInfo/characterTab/spell/bonusDamage/frost", "value"], "Hit Rating" => ["page/characterInfo/characterTab/spell/hitRating", "increasedHitPercent"], "Arcane Crit Chance" => ["page/characterInfo/characterTab/spell/critChance/arcane", "percent"], "Fire Crit Chance" => ["page/characterInfo/characterTab/spell/critChance/fire", "percent"], "Frost Crit Chance" => ["page/characterInfo/characterTab/spell/critChance/frost", "percent"], "Spell Penetration" => ["page/characterInfo/characterTab/spell/penetration", "value"], "Mana Regen" => ["page/characterInfo/characterTab/spell/manaRegen", "casting"], "Resilience" => ["page/characterInfo/characterTab/defenses/resilience", "value"] }, "Priest" => { "Intellect" => ["page/characterInfo/characterTab/baseStats/intellect", "effective"], "Spirit" => ["page/characterInfo/characterTab/baseStats/spirit", "effective"], "Stamina" => ["page/characterInfo/characterTab/baseStats/stamina", "effective"], "Holy Damage" => ["page/characterInfo/characterTab/spell/bonusDamage/holy", "value"], "Shadow Damage" => ["page/characterInfo/characterTab/spell/bonusDamage/shadow", "value"], "Hit Rating" => ["page/characterInfo/characterTab/spell/hitRating", "increasedHitPercent"], "Holy Crit Chance" => ["page/characterInfo/characterTab/spell/critChance/holy", "percent"], "Healing" => ["page/characterInfo/characterTab/spell/bonusHealing", "value"], "Shadow Crit Chance" => ["page/characterInfo/characterTab/spell/critChance/shadow", "percent"], "Spell Penetration" => ["page/characterInfo/characterTab/spell/penetration", "value"], "Mana Regen" => ["page/characterInfo/characterTab/spell/manaRegen", "casting"], "Resilience" => ["page/characterInfo/characterTab/defenses/resilience", "value"] }, "Paladin" => { "Intellect" => ["page/characterInfo/characterTab/baseStats/intellect", "effective"], "Agility" => ["page/characterInfo/characterTab/baseStats/agility", "effective"], "Strength" => ["page/characterInfo/characterTab/baseStats/strength", "effective"], "Stamina" => ["page/characterInfo/characterTab/baseStats/stamina", "effective"], "Holy Damage" => ["page/characterInfo/characterTab/spell/bonusDamage/holy", "value"], "Holy Crit Chance" => ["page/characterInfo/characterTab/spell/critChance/holy", "percent"], "Spell Penetration" => ["page/characterInfo/characterTab/spell/penetration", "value"], "Mana Regen" => ["page/characterInfo/characterTab/spell/manaRegen", "casting"], "Healing" => ["page/characterInfo/characterTab/spell/bonusHealing", "value"], "Armor" => ["page/characterInfo/characterTab/baseStats/armor", "effective"], "Attack Power" => ["page/characterInfo/characterTab/melee/power", "effective"], "+Hit" => ["page/characterInfo/characterTab/melee/hitRating", "increasedHitPercent"], "+Crit" => ["page/characterInfo/characterTab/melee/critChance", "percent"], "Dodge" => ["page/characterInfo/characterTab/defenses/dodge", "percent"], "Parry" => ["page/characterInfo/characterTab/defenses/parry", "percent"], "Block" => ["page/characterInfo/characterTab/defenses/block", "percent"], "Resilience" => ["page/characterInfo/characterTab/defenses/resilience", "value"], "Defense" => ["page/characterInfo/characterTab/defenses/defense", "value"], }, "Rogue" => { "Agility" => ["page/characterInfo/characterTab/baseStats/agility", "effective"], "Stamina" => ["page/characterInfo/characterTab/baseStats/stamina", "effective"], "Armor" => ["page/characterInfo/characterTab/baseStats/armor", "effective"], "MH DPS" => ["page/characterInfo/characterTab/melee/mainHandDamage", "dps"], "OH DPS" => ["page/characterInfo/characterTab/melee/offHandDamage", "dps"], "Attack Power" => ["page/characterInfo/characterTab/melee/power", "effective"], "+Hit" => ["page/characterInfo/characterTab/melee/hitRating", "increasedHitPercent"], "+Crit" => ["page/characterInfo/characterTab/melee/critChance", "percent"], "Dodge" => ["page/characterInfo/characterTab/defenses/dodge", "percent"], "Parry" => ["page/characterInfo/characterTab/defenses/parry", "percent"], "Resilience" => ["page/characterInfo/characterTab/defenses/resilience", "value"] }, "Shaman" => { "Intellect" => ["page/characterInfo/characterTab/baseStats/intellect", "effective"], "Agility" => ["page/characterInfo/characterTab/baseStats/agility", "effective"], "Strength" => ["page/characterInfo/characterTab/baseStats/strength", "effective"], "Stamina" => ["page/characterInfo/characterTab/baseStats/stamina", "effective"], "Nature Damage" => ["page/characterInfo/characterTab/spell/bonusDamage/nature", "value"], "Nature Crit Chance" => ["page/characterInfo/characterTab/spell/critChance/nature", "percent"], "Spell Penetration" => ["page/characterInfo/characterTab/spell/penetration", "value"], "Mana Regen" => ["page/characterInfo/characterTab/spell/manaRegen", "casting"], "Healing" => ["page/characterInfo/characterTab/spell/bonusHealing", "value"], "Armor" => ["page/characterInfo/characterTab/baseStats/armor", "effective"], "Attack Power" => ["page/characterInfo/characterTab/melee/power", "effective"], "+Hit" => ["page/characterInfo/characterTab/melee/hitRating", "increasedHitPercent"], "+Crit" => ["page/characterInfo/characterTab/melee/critChance", "percent"], "Dodge" => ["page/characterInfo/characterTab/defenses/dodge", "percent"], "Parry" => ["page/characterInfo/characterTab/defenses/parry", "percent"], "Block" => ["page/characterInfo/characterTab/defenses/block", "percent"], "Resilience" => ["page/characterInfo/characterTab/defenses/resilience", "value"] }, "Warlock" => { "Intellect" => ["page/characterInfo/characterTab/baseStats/intellect", "effective"], "Stamina" => ["page/characterInfo/characterTab/baseStats/stamina", "effective"], "Fire Damage" => ["page/characterInfo/characterTab/spell/bonusDamage/fire", "value"], "Shadow Damage" => ["page/characterInfo/characterTab/spell/bonusDamage/shadow", "value"], "Hit Rating" => ["page/characterInfo/characterTab/spell/hitRating", "increasedHitPercent"], "Fire Crit Chance" => ["page/characterInfo/characterTab/spell/critChance/fire", "percent"], "Shadow Crit Chance" => ["page/characterInfo/characterTab/spell/critChance/shadow", "percent"], "Spell Penetration" => ["page/characterInfo/characterTab/spell/penetration", "value"], "Mana Regen" => ["page/characterInfo/characterTab/spell/manaRegen", "casting"], "Resilience" => ["page/characterInfo/characterTab/defenses/resilience", "value"] }, "Warrior" => { "Agility" => ["page/characterInfo/characterTab/baseStats/agility", "effective"], "Strength" => ["page/characterInfo/characterTab/baseStats/strength", "effective"], "Stamina" => ["page/characterInfo/characterTab/baseStats/stamina", "effective"], "Armor" => ["page/characterInfo/characterTab/baseStats/armor", "effective"], "Attack Power" => ["page/characterInfo/characterTab/melee/power", "effective"], "+Hit" => ["page/characterInfo/characterTab/melee/hitRating", "increasedHitPercent"], "+Crit" => ["page/characterInfo/characterTab/melee/critChance", "percent"], "Dodge" => ["page/characterInfo/characterTab/defenses/dodge", "percent"], "Parry" => ["page/characterInfo/characterTab/defenses/parry", "percent"], "Block" => ["page/characterInfo/characterTab/defenses/block", "percent"], "Resilience" => ["page/characterInfo/characterTab/defenses/resilience", "value"], "Defense" => ["page/characterInfo/characterTab/defenses/defense", "value"] }, } def getGuildMembers(realm, guild) url = "#{@base_url}/guild-info.xml?r=#{URI.encode realm}&n=#{URI.encode guild}&p=1" xml = getArmoryDataXML(url) raise "Could not get guild information" if not xml.elements["page/guildInfo/guild/members"] pages = xml.elements["page/guildInfo/guild/members"].attributes["maxPage"].to_i clist = getCharacterList(xml, 61, @clsFilter) 2.upto(pages) do |i| url = "#{@base_url}/guild-info.xml?r=#{URI.encode realm}&n=#{URI.encode guild}&p=#{i}" xml = getArmoryDataXML(url) clist = clist + getCharacterList(xml, 61, @clsFilter) end clist end def getCharacterList(xml, minLevel = 0, cls = nil) clist = [] xml.elements.each("page/guildInfo/guild/members/character") do |character| if character.attributes["level"].to_i >= minLevel if not cls or cls == character.attributes["class"] then clist.insert(-1, [character.attributes["name"], character.attributes["level"]]) end end end clist end def getArmoryDataXML(url) @xmlCache ||= {} return REXML::Document.new(@xmlCache[url]) if @xmlCache[url] uri = URI.parse(url) @xmlCache[url] = Net::HTTP.start(uri.host, uri.port) do |h| h.get "#{uri.path}?#{uri.query}", {"user-agent" => "Mozilla/5.0 Gecko/20070219 Firefox/2.0.0.2"} end.body REXML::Document.new @xmlCache[url] end def getCharacterStats(realm, charName) url = "#{@base_url}/character-sheet.xml?r=#{URI.encode realm}&n=#{URI.encode charName[0]}" xml = getArmoryDataXML(url) results = {} icons = [] @stats[@clsFilter].each do |key, val| elem = xml.elements[val[0]] if elem then if val.length > 1 results[key] = elem.attributes[val[1]] else results[key] = elem.text end if key == "Defense" then results[key] = results[key].to_i + elem.attributes["plusDefense"].to_i end else results[key] = "?" end end xml.elements.each("page/characterInfo/characterTab/buffs/spell") do |buff| icons.insert -1, buff end return results, icons end def createGuildSummary(realm, guild) classes = %w"Druid Hunter Mage Priest Paladin Rogue Shaman Warlock Warrior" filename = "out/#{realm.downcase.gsub(/[^a-z]/, "-")}-#{guild.downcase.gsub(/[^a-z]/, "-")}.html" guildname = guild oguild = guild guilds ||= guild.split(",") File.open("/var/www/html/tachyonsix/public_html/wow/compare/#{filename}", "w") do |file| file.write "
| Character | Level | "; @stats[@clsFilter].keys.sort.each {|k| file.write "#{k} | " } file.write "Buffs | " file.write "
|---|---|---|---|
| #{char[0]} | " file.write "#{char[1]} | " @stats[@clsFilter].keys.sort.each do |key| file.write "#{stats[key]} | "; end file.write ""
characterIcons[char].each do |buff|
bicon = buff.attributes["icon"]
desc = "" + buff.attributes["name"] + " " + buff.attributes["effect"].gsub(/(\r\n|\n)/, " ") file.write " | "
file.write "