#!/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 " #{guild} summary " file.write "

#{guildname} Class Comparison

Last Updated: #{Time.now.to_s}

\n" classes.each do |cls| @clsFilter = cls characters = [] # print "Getting guilds: " guilds.each do |guild| characters = characters + getGuildMembers(realm, guild.strip) end characterStats = {} characterIcons = {} characters.each do |char| characterStats[char], characterIcons[char] = getCharacterStats(realm, char) end file.write "

#{cls}

\n"; file.write ""; @stats[@clsFilter].keys.sort.each {|k| file.write "" } file.write "" file.write "\n" characterStats.each do |char, stats| next if stats.values[0] == "?" file.write "" file.write "" @stats[@clsFilter].keys.sort.each do |key| file.write ""; end file.write "" file.write "\n" end file.write "
CharacterLevel#{k}Buffs
#{char[0]}#{char[1]}#{stats[key]}" characterIcons[char].each do |buff| bicon = buff.attributes["icon"] desc = "" + buff.attributes["name"] + "
" + buff.attributes["effect"].gsub(/(\r\n|\n)/, "
") file.write "" end file.write "
\n" end file.write "

Generated by Antiarc's Guild Summary tool at http://wow.tachyonsix.com/compare/compare.rhtml." file.write "" end %>

Results available here: <%=realm%>-<%=oguild%>. Please link to this link as it is static and will not tax my system or the Armory.

<% end cgi = CGI.new begin sess = CGI::Session.new(cgi, "session_key" => "rubyweb", "prefix" => "guild_tool.") if false and cgi["realm"] and cgi["realm"].length > 0 and cgi["guild"] and cgi["guild"].length > 0 and (sess["gen_id"] == cgi["gen_id"]) then sess["gen_id"] = nil @base_url = "http://armory.worldofwarcraft.com" @base_url = "http://armory.wow-europe.com" if cgi["loc"] == "EU" createGuildSummary(cgi["realm"], cgi["guild"]) end rescue puts "Something went wrong. Check your input. (#{$!})

(This usually means the script couldn't get data from Blizzard. Try again later.)" end sess["gen_id"] = rand(1000000) %>

Guild summary generator

Enter the information below to request an up-to-date guild summary from the Armory. Please use it sparingly, as it requires a large amount of resources both on my end and from the Armory itself.

For an example of the output, see this page.

If you want to browse already-generated summaries, you can do so as well. You might try looking here for your file if your browser seems to stall and never come back.

Offline for a bit - my server's getting slaughtered. I'll hopefully have a lighter version up in a bit.

This tool has moved. Please go to http://wow.tachyonsix.com/armory for the new (faster) versions. <% File.open("/var/www/html/tachyonsix/public_html/wow/compare/referers", "a") do |f| f.write ENV["HTTP_REFERER"] + "\n" if ENV["HTTP_REFERER"] and not ENV["HTTP_REFERER"].match /wow\.tachyonsix\.com/ end %>