########################## # !armory # ########################## sub armory { my ($who, $char, $realm) = @_; if ($realm eq "undefined") { $realm = "Wildhammer"; } my $url = "http://armory.worldofwarcraft.com/character-sheet.xml?r=$realm&n=$char"; # setup objects # LWP::UserAgent for http gets my $ua = LWP::UserAgent->new(); # set browser id $ua->agent("Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2) Gecko/20070219 Firefox/2.0.0.2"); # Reqqqquest. my $req = HTTP::Request->new(GET => $url); # set referer $req->referer("http://armory.worldofwarcraft.com"); # Diagnostic. print "Armory search: $char, $realm.\n"; my $response = $ua->request($req); my $xml = XML::Simple->new(ForceArray=>[qw(spell arenaTeam)],KeyAttr=>[]); my $xmlshits = $response->content; my $data = $xml->XMLin("$xmlshits"); if ($response->is_error()) { $main::self->privmsg($who, "$response->status_line"); } else { my $html = $response->content; # Init result. my $result; # Populate vars for all characters. if (!$data->{characterInfo}->{character}) { $result = "ERROR: Character not found.\n"; } else { my $name = "$data->{characterInfo}->{character}->{name}"; my $level = "$data->{characterInfo}->{character}->{level}"; my $race = "$data->{characterInfo}->{character}->{race}"; my $server = "$data->{characterInfo}->{character}->{realm}"; my $battlegroup = "$data->{characterInfo}->{character}->{battleGroup}"; my $class = "$data->{characterInfo}->{character}->{class}"; my $spec = "$data->{characterInfo}->{characterTab}->{talentSpec}->{treeOne}"."/"."$data->{characterInfo}->{characterTab}->{talentSpec}->{treeTwo}"."/"."$data->{characterInfo}->{characterTab}->{talentSpec}->{treeThree}"; my $guild; if (!$data->{characterInfo}->{character}->{guildName}) { $guild = "no guild"; } else { $guild = "$data->{characterInfo}->{character}->{guildName}"; } my $health = "$data->{characterInfo}->{characterTab}->{characterBars}->{health}->{effective}"; my $mana = "$data->{characterInfo}->{characterTab}->{characterBars}->{secondBar}->{effective}"; #$data->{characterInfo}->{character}->{ my ($stat1,$stat2,$stat3,$stat4,$stat5,$stat6,$stat7,$stat8,$stat9,$stat10); # Class-based stat retrieval and formatting. ########## # HUNTER # ########## if ("$class" eq "Hunter") { $stat1 = $data->{characterInfo}->{characterTab}->{ranged}->{power}->{effective}; $stat2 = $data->{characterInfo}->{characterTab}->{ranged}->{critChance}->{percent}; $stat3 = $data->{characterInfo}->{characterTab}->{ranged}->{hitRating}->{increasedHitPercent}; $stat4 = $data->{characterInfo}->{characterTab}->{baseStats}->{agility}->{effective}; $stat5 = $data->{characterInfo}->{characterTab}->{defenses}->{resilience}->{value}; $result = "$name, Level $level $race $class ($spec), \<$guild\>, $server ($battlegroup). Health $health | Mana $mana | RAP $stat1 | Crit% $stat2 | Hit% $stat3 | Agility $stat4 | Resilience $stat5 | "; ########### # WARRIOR # ########### } elsif ("$class" eq "Warrior") { $stat1 = $data->{characterInfo}->{characterTab}->{melee}->{power}->{effective}; $stat2 = $data->{characterInfo}->{characterTab}->{melee}->{critChance}->{percent}; $stat3 = $data->{characterInfo}->{characterTab}->{melee}->{hitRating}->{increasedHitPercent}; $stat4 = $data->{characterInfo}->{characterTab}->{defenses}->{armor}->{effective}; $stat5 = $data->{characterInfo}->{characterTab}->{defenses}->{defense}->{value} + $data->{characterInfo}->{characterTab}->{defenses}->{defense}->{plusDefense}; $stat6 = $data->{characterInfo}->{characterTab}->{defenses}->{dodge}->{percent}; $stat7 = $data->{characterInfo}->{characterTab}->{defenses}->{parry}->{percent}; $stat8 = $data->{characterInfo}->{characterTab}->{defenses}->{block}->{percent}; $stat9 = $data->{characterInfo}->{characterTab}->{defenses}->{resilience}->{value}; $result = "$name, Level $level $race $class ($spec), \<$guild\>, $server ($battlegroup). Health $health | AP $stat1 | Crit% $stat2 | Hit% $stat3 | Armor $stat4 | Defense $stat5 | Dodge $stat6 | Parry $stat7 | Block $stat8 | Resilience $stat9 | "; ######### # ROGUE # ######### } elsif ("$class" eq "Rogue") { $stat1 = $data->{characterInfo}->{characterTab}->{melee}->{power}->{effective}; $stat2 = $data->{characterInfo}->{characterTab}->{melee}->{critChance}->{percent}; $stat3 = $data->{characterInfo}->{characterTab}->{melee}->{hitRating}->{increasedHitPercent}; $stat4 = $data->{characterInfo}->{characterTab}->{defenses}->{armor}->{effective}; $stat5 = $data->{characterInfo}->{characterTab}->{defenses}->{dodge}->{percent}; $stat6 = $data->{characterInfo}->{characterTab}->{defenses}->{parry}->{percent}; $stat7 = $data->{characterInfo}->{characterTab}->{defenses}->{resilience}->{value}; $result = "$name, Level $level $race $class ($spec), \<$guild\>, $server ($battlegroup). Health $health | AP $stat1 | Crit% $stat2 | Hit% $stat3 | Armor $stat4 | Dodge $stat5 | Parry $stat6 | Resilience $stat7 | "; ########### # PALADIN # ########### } elsif ("$class" eq "Paladin") { $stat1 = $data->{characterInfo}->{characterTab}->{melee}->{power}->{effective}; $stat2 = $data->{characterInfo}->{characterTab}->{melee}->{critChance}->{percent}; $stat3 = $data->{characterInfo}->{characterTab}->{melee}->{hitRating}->{increasedHitPercent}; $stat4 = $data->{characterInfo}->{characterTab}->{defenses}->{armor}->{effective}; $stat5 = $data->{characterInfo}->{characterTab}->{defenses}->{resilience}->{value}; # Unfortunately, we must things this way since they use the same name (spell) for misc buffs that get foreach'd later. foreach (@{$data->{characterInfo}->{characterTab}->{spell}}) { $stat6 = "$_->{bonusHealing}->{value}"; $stat7 = "$_->{critChance}->{holy}->{percent}"; $stat8 = "$_->{manaRegen}->{casting}"; $stat9 = "$_->{manaRegen}->{notCasting}"; } # $stat6 = $data->{characterInfo}->{characterTab}->{spell}->{bonusHealing}->{value}; # $stat7 = $data->{characterInfo}->{characterTab}->{spell}->{critChance}->{holy}->{percent}; # $stat8 = $data->{characterInfo}->{characterTab}->{spell}->{manaRegen}->{casting}; # $stat9 = $data->{characterInfo}->{characterTab}->{spell}->{manaRegen}->{notCasting}; $result = "$name, Level $level $race $class ($spec), \<$guild\>, $server ($battlegroup). Health $health | Mana $mana | AP $stat1 | Crit% $stat2 | Hit% $stat3 | Armor $stat4 | Resilience $stat5 | +Healing $stat6 | HolyCrit% $stat7 | MP5 $stat8/$stat9 | "; ######## # MAGE # ######## } elsif ("$class" eq "Mage") { foreach (@{$data->{characterInfo}->{characterTab}->{spell}}) { $stat1 = "$_->{bonusDamage}->{fire}->{value}"; $stat2 = "$_->{bonusDamage}->{frost}->{value}"; $stat3 = "$_->{critChance}->{arcane}->{percent}"; $stat4 = "$_->{hitRating}->{increasedHitPercent}"; $stat5 = "$_->{manaRegen}->{casting}"; $stat6 = "$_->{manaRegen}->{notCasting}"; } $stat7 = $data->{characterInfo}->{characterTab}->{baseStats}->{intellect}->{effective}; $stat8 = $data->{characterInfo}->{characterTab}->{defenses}->{resilience}->{value}; $result = "$name, Level $level $race $class ($spec), \<$guild\>, $server ($battlegroup). Health $health | Mana $mana | +FireDamage $stat1 | +FrostDamage $stat2 | SpellCrit% $stat3 | SpellHit% $stat4 | MP5 $stat5/$stat6 | Intellect $stat7 | Resilience $stat8 | "; ########## # SHAMAN # ########## } elsif ("$class" eq "Shaman") { $stat1 = $data->{characterInfo}->{characterTab}->{melee}->{power}->{effective}; $stat2 = $data->{characterInfo}->{characterTab}->{melee}->{critChance}->{percent}; $stat3 = $data->{characterInfo}->{characterTab}->{melee}->{hitRating}->{increasedHitPercent}; $stat4 = $data->{characterInfo}->{characterTab}->{defenses}->{armor}->{effective}; $stat5 = $data->{characterInfo}->{characterTab}->{defenses}->{resilience}->{value}; # Unfortunately, we must do things this way since they use the same name (spell) for misc buffs that get foreach'd later. foreach (@{$data->{characterInfo}->{characterTab}->{spell}}) { $stat6 = "$_->{bonusHealing}->{value}"; $stat7 = "$_->{critChance}->{nature}->{percent}"; $stat8 = "$_->{manaRegen}->{casting}"; $stat9 = "$_->{manaRegen}->{notCasting}"; } $result = "$name, Level $level $race $class ($spec), \<$guild\>, $server ($battlegroup). Health $health | Mana $mana | AP $stat1 | Crit% $stat2 | Hit% $stat3 | Armor $stat4 | Resilience $stat5 | +Healing $stat6 | SpellCrit% $stat7 | MP5 $stat8/$stat9 | "; ########## # PRIEST # ########## # Unfortunately, we must do things this way since they use the same name (spell) for misc buffs that get foreach'd later. } elsif ("$class" eq "Priest") { foreach (@{$data->{characterInfo}->{characterTab}->{spell}}) { $stat1 = "$_->{bonusHealing}->{value}"; $stat2 = "$_->{bonusDamage}->{shadow}->{value}"; $stat3 = "$_->{critChance}->{holy}->{percent}"; $stat4 = "$_->{manaRegen}->{casting}"; $stat5 = "$_->{manaRegen}->{notCasting}"; } $stat6 = $data->{characterInfo}->{characterTab}->{baseStats}->{spirit}->{effective}; $stat7 = $data->{characterInfo}->{characterTab}->{defenses}->{resilience}->{value}; $result = "$name, Level $level $race $class ($spec), \<$guild\>, $server ($battlegroup). Health $health | Mana $mana | +Healing $stat1 | +ShadowDamage $stat2 | SpellCrit% $stat3 | MP5 $stat4/$stat5 | Spirit $stat6 | Resilience $stat7 | "; ########### # WARLOCK # ########### } elsif ("$class" eq "Warlock") { foreach (@{$data->{characterInfo}->{characterTab}->{spell}}) { $stat1 = "$_->{bonusDamage}->{shadow}->{value}"; $stat2 = "$_->{bonusDamage}->{fire}->{value}"; $stat3 = "$_->{critChance}->{shadow}->{percent}"; $stat4 = "$_->{hitRating}->{increasedHitPercent}"; $stat5 = "$_->{manaRegen}->{casting}"; $stat6 = "$_->{manaRegen}->{notCasting}"; } $stat7 = $data->{characterInfo}->{characterTab}->{baseStats}->{intellect}->{effective}; $stat8 = $data->{characterInfo}->{characterTab}->{defenses}->{resilience}->{value}; $result = "$name, Level $level $race $class ($spec), \<$guild\>, $server ($battlegroup). Health $health | Mana $mana | +ShadowDamage $stat1 | +FireDamage $stat2 | SpellCrit% $stat3 | SpellHit% $stat4 | MP5 $stat5/$stat6 | Intellect $stat7 | Resilience $stat8 | "; ######### # DRUID # ######### # Unfortunately, we must do things this way since they use the same name (spell) for misc buffs that get foreach'd later. } elsif ("$class" eq "Druid") { foreach (@{$data->{characterInfo}->{characterTab}->{spell}}) { $stat1 = "$_->{bonusHealing}->{value}"; $stat2 = "$_->{bonusDamage}->{nature}->{value}"; $stat3 = "$_->{critChance}->{nature}->{percent}"; $stat4 = "$_->{manaRegen}->{casting}"; $stat5 = "$_->{manaRegen}->{notCasting}"; } $stat6 = $data->{characterInfo}->{characterTab}->{melee}->{power}->{effective}; $stat7 = $data->{characterInfo}->{characterTab}->{defenses}->{armor}->{effective}; $stat8 = $data->{characterInfo}->{characterTab}->{baseStats}->{agility}->{effective}; $stat9 = $data->{characterInfo}->{characterTab}->{baseStats}->{strength}->{effective}; $stat10 = $data->{characterInfo}->{characterTab}->{defenses}->{resilience}->{value}; $result = "$name, Level $level $race $class ($spec), \<$guild\>, $server ($battlegroup). Health $health | Mana $mana | +Healing $stat1 | +SpellDamage $stat2 | SpellCrit% $stat3 | MP5 $stat4/$stat5 | AP $stat6 | Armor $stat7 | Agility $stat8 | Strength $stat9 | Resilience $stat10 | "; } else { $result = "$name, Level $level $race $class ($spec), \<$guild\>, $server ($battlegroup). "; } # Arena stats. foreach (@{$data->{characterInfo}->{character}->{arenaTeams}->{arenaTeam}}) { $result .= "$_->{size}v$_->{size} $_->{rating} ($_->{ranking}), "; } $result =~ s/, $/ | /; # Fix the end of the buff list to make it pretty. $result .= "("; foreach my $e (@{$data->{characterInfo}->{characterTab}->{buffs}->{spell}}) { $result .= "$e->{name}, "; } if ($result =~ m/\($/) { $result .= "none)"; } else { $result =~ s/, $/)/; } # Return shit. $main::self->privmsg($who, "$result\n"); } } }