wowr 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wowr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Humphreys
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-02-07 00:00:00 +00:00
12
+ date: 2008-06-05 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -29,12 +29,17 @@ extensions: []
29
29
 
30
30
  extra_rdoc_files:
31
31
  - README
32
+ - changelog.txt
32
33
  files:
33
34
  - lib/wowr.rb
34
- - lib/wowr/classes.rb
35
+ - lib/wowr/arena_team.rb
36
+ - lib/wowr/character.rb
37
+ - lib/wowr/guild.rb
38
+ - lib/wowr/item.rb
35
39
  - lib/wowr/exceptions.rb
36
40
  - lib/wowr/extensions.rb
37
41
  - README
42
+ - changelog.txt
38
43
  has_rdoc: true
39
44
  homepage: http://wowr.rubyforge.org/
40
45
  post_install_message:
@@ -1,1345 +0,0 @@
1
- # TODO: Item sources - Vendors
2
- # sourceType.vendor
3
- # sourceType.questReward
4
- # sourceType.createdBySpell
5
-
6
- # TODO: Split up classes depending on subject?  Character, Item, Guild, ArenaTeam
7
-
8
-
9
- # Wowr was written by Ben Humphreys!
10
- # http://wowr.benhumphreys.co.uk/
11
- module Wowr
12
- module Classes
13
-
14
- # Most basic
15
- # Composed of an ItemInfo and
16
- # Needs to be consolidated with ItemInfo and other stuff
17
- # to be a parent class that they extend?
18
- class Item
19
- attr_reader :id, :name, :icon
20
- alias_method :item_id, :id
21
-
22
- def initialize(elem)
23
- @id = elem[:id].to_i
24
- @name = elem[:name]
25
- @icon = elem[:icon]
26
- end
27
- end
28
-
29
-
30
- # Short character info, used in guild lists etc.
31
- # Note that the way that searches and character listings within guilds works,
32
- # there can be a variable amount of information filled in within the class.
33
- # Guild listings and search results contain a smaller amount of information than
34
- # single queries
35
- class Character
36
- attr_reader :name, :level, :url, :rank,
37
- :klass, :klass_id,
38
- :gender, :gender_id,
39
- :race, :race_id,
40
- :guild, :guild_id, :guild_url,
41
- :battle_group, :last_login,
42
- :relevance, :search_rank,
43
-
44
- :season_games_played, :season_games_won, :team_rank, :contribution # From ArenaTeam info
45
-
46
- def initialize(elem)
47
- @name = elem[:name]
48
- @level = elem[:level].to_i
49
- @url = elem[:url] || elem[:charUrl]
50
- @rank = elem[:rank].to_i
51
-
52
- @klass = elem[:class]
53
- @klass_id = elem[:classId].to_i
54
-
55
- @gender = elem[:gender]
56
- @gender_id = elem[:genderId].to_i
57
-
58
- @race = elem[:race]
59
- @race_id = elem[:raceId].to_i
60
-
61
- @guild = elem[:guild] == "" ? nil : elem[:guild]
62
- @guild_id = elem[:guildId].to_i == 0 ? nil : elem[:guildId].to_i
63
- @guild_url = elem[:guildUrl] == "" ? nil : elem[:guildUrl]
64
-
65
- @battle_group = elem[:battleGroup] == "" ? nil : elem[:battleGroup]
66
- @battle_group_id = elem[:battleGroupId].to_i
67
-
68
- @relevance = elem[:relevance].to_i
69
- @search_rank = elem[:searchRank].to_i
70
-
71
- # Incoming string is 2007-02-24 20:33:04.0, parse to datetime
72
- #@last_login = elem[:lastLoginDate] == "" ? nil : DateTime.parse(elem[:lastLoginDate])
73
- @last_login = elem[:lastLoginDate] == "" ? nil : elem[:lastLoginDate]
74
-
75
- # From ArenaTeam info, can be blank on normal requests
76
- #<character battleGroup="" charUrl="r=Draenor&amp;n=Lothaar" class="Paladin" classId="2"
77
- # contribution="1602" gamesPlayed="10" gamesWon="7" gender="Male" genderId="0"
78
- # guild="Passion" guildId="36659" guildUrl="r=Draenor&amp;n=Passion&amp;p=1" name="Lothaar"
79
- # race="Human" raceId="1" seasonGamesPlayed="20" seasonGamesWon="13" teamRank="1"/>
80
- @season_games_played = elem[:seasonGamesPlayed] == "" ? nil : elem[:seasonGamesPlayed].to_i
81
- @season_games_won = elem[:seasonGamesWon] == "" ? nil : elem[:seasonGamesWon].to_i
82
- @team_rank = elem[:teamRank] == "" ? nil : elem[:teamRank].to_i
83
- @contribution = elem[:contribution] == "" ? nil : elem[:contribution].to_i
84
- #@char_url = elem[:charUrl] # TODO: Merge with URL?
85
- end
86
- end
87
-
88
-
89
-
90
- # Full character details
91
- # uses characterInfo element
92
- # NEEDS TO EXTEND BASE CHARACTER THING
93
- class CharacterSheet
94
-
95
- # character_info
96
- attr_reader :name, :level, :char_url, :title,
97
- :gender, :gender_id,
98
- :race, :race_id,
99
- :klass, :klass_id,
100
- :faction, :faction_id,
101
- :guild, :guild_url,
102
- :realm,
103
- :battle_group,
104
- :arena_teams,
105
- :last_modified
106
-
107
- # character_tab
108
- attr_reader :health, :second_bar,
109
- :strength, :agility, :stamina, :intellect, :spirit
110
- alias_method :str, :strength
111
- alias_method :agi, :agility
112
- alias_method :sta, :stamina
113
- alias_method :int, :intellect
114
- alias_method :spi, :spirit
115
-
116
- attr_reader :title,
117
- :melee, :ranged, :spell,
118
- :defenses, :resistances,
119
- :talent_spec, :pvp,
120
- :professions,
121
- :items,
122
- :buffs, :debuffs
123
-
124
- # It's made up of two parts
125
- # Don't care about battlegroups yet
126
- # I don't think I can call stuff from the constructor?
127
- def initialize(elem)
128
- character_info(elem%'character')
129
- character_tab(elem%'characterTab')
130
- end
131
-
132
- # <character
133
- # battleGroup="Conviction"
134
- # charUrl="r=Genjuros&amp;n=Jonlok"
135
- # class="Warlock"
136
- # classId="9"
137
- # faction="Horde"
138
- # factionId="1"
139
- # gender="Male"
140
- # genderId="0"
141
- # guildName=""
142
- # lastModified="12 February 2008"
143
- # level="41"
144
- # name="Jonlok"
145
- # prefix=""
146
- # race="Orc"
147
- # raceId="2"
148
- # realm="Genjuros"
149
- # suffix=""/>
150
- def character_info(elem)
151
- # basic info
152
- @name = elem[:name]
153
- @level = elem[:level].to_i
154
- @char_url = elem[:charUrl]
155
-
156
- @klass = elem[:class]
157
- @klass_id = elem[:classId].to_i
158
-
159
- @gender = elem[:gender]
160
- @gender_id = elem[:genderId].to_i
161
-
162
- @race = elem[:race]
163
- @race_id = elem[:raceId].to_i
164
-
165
- @faction = elem[:faction]
166
- @faction_id = elem[:factionId].to_i
167
-
168
- @guild = elem[:guildName] == "" ? nil : elem[:guildName]
169
- @guild_url = elem[:guildUrl] == "" ? nil : elem[:guildUrl]
170
-
171
- @prefix = elem[:prefix]
172
- @suffix = elem[:suffix]
173
-
174
- @realm = elem[:realm]
175
-
176
- @battle_group = elem[:battleGroup]
177
-
178
- # format is February 11, 2008
179
- # except when it's korean, and then it's 2008년 5월 11일 (일)
180
- # tw is 2008&#24180;5&#26376;11&#26085; (2008年5月11日)
181
- # TODO: Datetime doesn't parse other languages nicely
182
- # Until then, just save it as a string
183
- begin
184
- @last_modified = elem[:lastModified] == "" ? nil : DateTime.parse(elem[:lastModified])
185
- rescue
186
- @last_modified = elem[:lastModified] == "" ? nil : elem[:lastModified]
187
- end
188
- #@last_modified = elem[:lastModified]#.to_time
189
-
190
- @arena_teams = []
191
- (elem/:arenaTeam).each do |arena_team|
192
- @arena_teams << ArenaTeam.new(arena_team)
193
- end
194
-
195
- end
196
-
197
- def character_tab(elem)
198
-
199
- # <title value=""/>
200
- @title = (elem%'title')[:value] == "" ? nil : (elem%'title')[:value]
201
- #@known_titles = <knownTitles/>
202
-
203
- @health = (elem%'characterBars'%'health')[:effective].to_i
204
- @second_bar = SecondBar.new(elem%'characterBars'%'secondBar')
205
-
206
- # base stats
207
- @strength = Strength.new(elem%'baseStats'%'strength')
208
- @agility = Agility.new(elem%'baseStats'%'agility')
209
- @stamina = Stamina.new(elem%'baseStats'%'stamina')
210
- @intellect = Intellect.new(elem%'baseStats'%'intellect')
211
- @spirit = Spirit.new(elem%'baseStats'%'spirit')
212
-
213
- # damage stuff
214
- @melee = Melee.new(elem%'melee')
215
- @ranged = Ranged.new(elem%'ranged')
216
- @spell = Spell.new(elem.at(' > spell')) # TODO: hacky?
217
- @defenses = Defenses.new(elem%'defenses')
218
-
219
- # TODO: Massive problem, doesn't fill in resistances for some reason
220
- resist_types = ['arcane', 'fire', 'frost', 'holy', 'nature', 'shadow']
221
- @resistances = {}
222
- resist_types.each do |res|
223
- @resistances[res] = Resistance.new(elem%'resistances'%res)
224
- end
225
-
226
- @talent_spec = TalentSpec.new(elem%'talentSpec')
227
-
228
- @pvp = Pvp.new(elem%'pvp')
229
-
230
- @professions = []
231
- (elem%'professions'/:skill).each do |skill|
232
- @professions << Profession.new(skill)
233
- end
234
-
235
- @items = []
236
- (elem%'items'/:item).each do |item|
237
- @items << EquippedItem.new(item)
238
- end
239
-
240
- @buffs = []
241
- (elem%'buffs'/:spell).each do |buff|
242
- @buffs << Buff.new(buff)
243
- end
244
-
245
- @debuffs = []
246
- (elem%'debuffs'/:spell).each do |debuff|
247
- @debuffs << Buff.new(debuff)
248
- end
249
- end
250
- end
251
-
252
-
253
-
254
- # Second stat bar, depends on character class
255
- class SecondBar
256
- attr_reader :effective, :casting, :not_casting, :type
257
-
258
- def initialize(elem)
259
- @effective = elem[:effective].to_i
260
- @casting = elem[:casting].to_i == -1 ? nil : elem[:casting].to_i
261
- @not_casting = elem[:notCasting].to_i == -1 ? nil : elem[:notCasting].to_i
262
- @type = elem[:type]
263
- end
264
- end
265
-
266
-
267
-
268
- class BaseStat # abstract?
269
- attr_reader :base, :effective
270
- end
271
-
272
- class Strength < BaseStat
273
- attr_reader :attack, :block
274
- def initialize(elem)
275
- @base = elem['base'].to_i
276
- @effective = elem['effective'].to_i
277
- @attack = elem['attack'].to_i
278
- @block = elem['block'].to_i == -1 ? nil : elem['block'].to_i
279
- end
280
- end
281
-
282
- class Agility < BaseStat
283
- attr_reader :armor, :attack, :crit_hit_percent
284
- def initialize(elem)
285
- @base = elem[:base].to_i
286
- @effective = elem[:effective].to_i
287
- @armor = elem[:armor].to_i
288
- @attack = elem[:attack].to_i == -1 ? nil : elem[:attack].to_i
289
- @crit_hit_percent = elem[:critHitPercent].to_f
290
- end
291
- end
292
-
293
- class Stamina < BaseStat
294
- attr_reader :health, :pet_bonus
295
- def initialize(elem)
296
- @base = elem[:base].to_i
297
- @effective = elem[:effective].to_i
298
- @health = elem[:health].to_i
299
- @pet_bonus = elem[:petBonus].to_i == -1 ? nil : elem[:petBonus].to_i
300
- end
301
- end
302
-
303
- class Intellect < BaseStat
304
- attr_reader :mana, :crit_hit_percent, :pet_bonus
305
- def initialize(elem)
306
- @base = elem[:base].to_i
307
- @effective = elem[:effective].to_i
308
- @mana = elem[:mana].to_i
309
- @crit_hit_percent = elem[:critHitPercent].to_f
310
- @pet_bonus = elem[:petBonus].to_i == -1 ? nil : elem[:petBonus].to_i
311
- end
312
- end
313
-
314
- class Spirit < BaseStat
315
- attr_reader :health_regen, :mana_regen
316
- def initialize(elem)
317
- @base = elem[:base].to_i
318
- @effective = elem[:effective].to_i
319
- @health_regen = elem[:healthRegen].to_i
320
- @mana_regen = elem[:manaRegen].to_i
321
- end
322
- end
323
-
324
- class Armor < BaseStat
325
- attr_reader :percent, :pet_bonus
326
- def initialize(elem)
327
- @base = elem[:base].to_i
328
- @effective = elem[:effective].to_i
329
- @percent = elem[:percent].to_f
330
- @pet_bonus = elem[:petBonus].to_i == -1 ? nil : elem[:petBonus].to_i
331
- end
332
- end
333
-
334
-
335
-
336
-
337
-
338
- # <melee>
339
- # <mainHandDamage dps="65.6" max="149" min="60" percent="0" speed="1.60"/>
340
- # <offHandDamage dps="0.0" max="0" min="0" percent="0" speed="2.00"/>
341
- # <mainHandSpeed hastePercent="0.00" hasteRating="0" value="1.60"/>
342
- # <offHandSpeed hastePercent="0.00" hasteRating="0" value="2.00"/>
343
- # <power base="338" effective="338" increasedDps="24.0"/>
344
- # <hitRating increasedHitPercent="0.00" value="0"/>
345
- # <critChance percent="4.16" plusPercent="0.00" rating="0"/>
346
- # <expertise additional="0" percent="0.00" rating="0" value="0"/>
347
- # </melee>
348
- class Melee
349
- attr_reader :main_hand_skill, :off_hand_skill,
350
- :main_hand_damage, :off_hand_damage,
351
- :main_hand_speed, :off_hand_speed,
352
- :speed, :hit_rating, :crit_chance
353
- :expertise
354
-
355
- def initialize(elem)
356
- # TODO: Do these not exist anymore?
357
- @main_hand_skill = WeaponSkill.new(elem%'mainHandWeaponSkill') if (elem%'mainHandWeaponSkill')
358
- @off_hand_skill = WeaponSkill.new(elem%'offHandWeaponSkill') if (elem%'offHandWeaponSkill')
359
-
360
- @main_hand_damage = WeaponDamage.new(elem%'mainHandDamage')
361
- @off_hand_damage = WeaponDamage.new(elem%'offHandDamage')
362
-
363
- @main_hand_speed = WeaponSpeed.new(elem%'mainHandSpeed')
364
- @off_hand_speed = WeaponSpeed.new(elem%'offHandSpeed')
365
-
366
- @power = WeaponPower.new(elem%'power')
367
- @hit_rating = WeaponHitRating.new(elem%'hitRating')
368
- @crit_chance = WeaponCritChance.new(elem%'critChance')
369
-
370
- @expertise = WeaponExpertise.new(elem%'expertise')
371
- end
372
- end
373
-
374
- # <ranged>
375
- # <weaponSkill rating="0" value="-1"/>
376
- # <damage dps="0.0" max="0" min="0" percent="0" speed="0.00"/>
377
- # <speed hastePercent="0.00" hasteRating="0" value="0.00"/>
378
- # <power base="57" effective="57" increasedDps="4.0" petAttack="-1.00" petSpell="-1.00"/>
379
- # <hitRating increasedHitPercent="0.00" value="0"/>
380
- # <critChance percent="0.92" plusPercent="0.00" rating="0"/>
381
- # </ranged>
382
- class Ranged
383
- attr_reader :weapon_skill, :damage, :speed, :power,
384
- :hit_rating, :crit_chance
385
-
386
- def initialize(elem)
387
- @weapon_skill = WeaponSkill.new(elem%'weaponSkill')
388
- @damage = WeaponDamage.new(elem%'damage')
389
- @speed = WeaponSpeed.new(elem%'speed')
390
- @power = WeaponPower.new(elem%'power')
391
- @hit_rating = WeaponHitRating.new(elem%'hitRating')
392
- @crit_chance = WeaponCritChance.new(elem%'critChance')
393
- end
394
- end
395
-
396
- class WeaponSkill
397
- attr_reader :rating, :value
398
-
399
- def initialize(elem)
400
- @value = elem[:value].to_i == -1 ? nil : elem[:value].to_i
401
- @rating = elem[:rating].to_i
402
- end
403
- end
404
-
405
- class WeaponDamage
406
- attr_reader :dps, :max, :min, :percent, :speed
407
-
408
- def initialize(elem)
409
- @dps = elem[:dps].to_f
410
- @max = elem[:max].to_i
411
- @min = elem[:min].to_i
412
- @percent = elem[:percent].to_f
413
- @speed = elem[:speed].to_f
414
- end
415
- end
416
-
417
- class WeaponSpeed
418
- attr_reader :haste_percent, :haste_rating, :value
419
-
420
- def initialize(elem)
421
- @haste_percent = elem[:hastePercent].to_f
422
- @haste_rating = elem[:hasteRating].to_f
423
- @value = elem[:value].to_f
424
- end
425
- end
426
-
427
- class WeaponPower
428
- attr_reader :base, :effective, :increased_dps, :pet_attack, :pet_spell
429
-
430
- def initialize(elem)
431
- @base = elem[:base].to_i
432
- @haste_rating = elem[:effective].to_i
433
- @increased_dps = elem[:increasedDps].to_f
434
- @pet_attack = (elem[:petAttack].to_f == -1 ? nil : elem[:petAttack].to_f)
435
- @pet_spell = (elem[:petSpell].to_f == -1 ? nil : elem[:petSpell].to_f)
436
- end
437
- end
438
-
439
- class WeaponHitRating
440
- attr_reader :increased_hit_percent, :value
441
-
442
- def initialize(elem)
443
- @increased_hit_percent = elem[:increasedHitPercent].to_f
444
- @value = elem[:value].to_f
445
- end
446
- end
447
-
448
- class WeaponCritChance
449
- attr_reader :percent, :plus_percent, :rating
450
-
451
- def initialize(elem)
452
- @percent = elem[:percent].to_f
453
- @plus_percent = elem[:plusPercent].to_f
454
- @rating = elem[:rating].to_i
455
- end
456
- end
457
-
458
- # <expertise additional="0" percent="0.00" rating="0" value="0"/>
459
- class WeaponExpertise
460
- attr_reader :additional, :percent, :rating, :value
461
-
462
- def initialize(elem)
463
- @additional = elem[:additional].to_i
464
- @percent = elem[:percent].to_f
465
- @rating = elem[:rating].to_i
466
- @value = elem[:value].to_i
467
- end
468
- end
469
-
470
-
471
- # Decided to do funky stuff to the XML to make it more useful.
472
- # instead of having two seperate lists of bonusDamage and critChance
473
- # merged it into one set of objects for each thing
474
- class Spell
475
- attr_reader :arcane, :fire, :frost, :holy, :nature, :shadow,
476
- :hit_rating, :bonus_healing, :penetration, :mana_regen
477
-
478
- def initialize(elem)
479
- @arcane = SpellDamage.new(elem%'bonusDamage'%'arcane', elem%'critChance'%'arcane')
480
- @fire = SpellDamage.new(elem%'bonusDamage'%'fire', elem%'critChance'%'fire')
481
- @frost = SpellDamage.new(elem%'bonusDamage'%'frost', elem%'critChance'%'frost')
482
- @holy = SpellDamage.new(elem%'bonusDamage'%'holy', elem%'critChance'%'holy')
483
- @nature = SpellDamage.new(elem%'bonusDamage'%'nature', elem%'critChance'%'nature')
484
- @shadow = SpellDamage.new(elem%'bonusDamage'%'shadow', elem%'critChance'%'shadow')
485
-
486
- @bonus_healing = (elem%'bonusHealing')[:value].to_i # is this right??
487
- @penetration = (elem%'penetration')[:value].to_i
488
- @hit_rating = WeaponHitRating.new(elem%'hitRating')
489
- @mana_regen = ManaRegen.new(elem%'manaRegen')
490
-
491
- # elements = %w[arcane fire frost holy nature shadow]
492
- # elements.each do |element|
493
- # # TODO: is this a good idea?
494
- # #instance_variable_set("@#{element}", foo) #??
495
- # #eval("@#{element} = SpellDamage.new(elem[:bonusDamage][element][:value], elem[:critChance][element][:percent]).to_f)")
496
- # # eval("@#{element} = SpellDamage.new((elem%'bonusDamage'%element)[:value].to_i,
497
- # # (elem%'critChance'%element)[:percent].to_f)")
498
- # end
499
- end
500
- end
501
-
502
- class SpellDamage
503
- attr_reader :value, :crit_chance_percent
504
- alias_method :percent, :crit_chance_percent
505
-
506
- def initialize(bonusDamage_elem, critChance_elem)
507
- @value = bonusDamage_elem[:value].to_i
508
- @crit_chance_percent = critChance_elem[:percent].to_f
509
- end
510
- end
511
-
512
- class ManaRegen
513
- attr_reader :casting, :not_casting
514
-
515
- def initialize(elem)
516
- @casting = elem[:casting].to_f
517
- @not_casting = elem[:notCasting].to_f
518
- end
519
- end
520
-
521
- class PetBonus
522
- attr_reader :attack, :damage, :from_Type
523
-
524
- def initialize(elem)
525
- @attack = elem[:attack].to_i == -1 ? nil : elem[:attack].to_i
526
- @damage = elem[:damage].to_i == -1 ? nil : elem[:damage].to_i
527
- @from_type = elem[:fromType] if elem[:fromType]
528
- end
529
- end
530
-
531
-
532
-
533
- class Defenses
534
- attr_reader :armor, :defense, :dodge, :parry, :block, :resilience
535
-
536
- def initialize(elem)
537
- @armor = Armor.new(elem%'armor')
538
- @defense = Defense.new(elem%'defense')
539
- @dodge = DodgeParryBlock.new(elem%'dodge')
540
- @parry = DodgeParryBlock.new(elem%'parry')
541
- @block = DodgeParryBlock.new(elem%'block')
542
- @resilience = Resilience.new(elem%'resilience')
543
- end
544
- end
545
-
546
- class Armor
547
- attr_reader :base, :effective, :percent, :pet_bonus
548
-
549
- def initialize(elem)
550
- @base = elem[:base].to_i
551
- @effective = elem[:effective].to_i
552
- @percent = elem[:percent].to_f
553
- @pet_bonus = elem[:petBonus].to_i == -1 ? nil : elem[:petBonus].to_i
554
- end
555
- end
556
-
557
- class Defense
558
- attr_reader :value, :increase_percent, :decrease_percent, :plus_defense, :rating
559
-
560
- def initialize(elem)
561
- @value = elem[:value].to_i
562
- @increase_percent = elem[:increasePercent].to_f
563
- @decrease_percent = elem[:decreasePercent].to_f
564
- @plus_defense = elem[:plusDefense].to_i
565
- @rating = elem[:rating].to_i
566
- end
567
- end
568
-
569
- class DodgeParryBlock
570
- attr_reader :percent, :increase_percent, :rating
571
-
572
- def initialize(elem)
573
- @percent = elem[:percent].to_f
574
- @increase_percent = elem[:increasePercent].to_f
575
- @rating = elem[:rating].to_i
576
- end
577
- end
578
-
579
- class Resilience
580
- attr_reader :damage_percent, :hit_percent, :value
581
-
582
- def initialize(elem)
583
- @damage_percent = elem[:damagePercent].to_f
584
- @hit_percent = elem[:hitPercent].to_f
585
- @value = elem[:value].to_f
586
- end
587
- end
588
-
589
-
590
-
591
- class Resistance
592
- attr_reader :value, :pet_bonus
593
-
594
- def initialize(elem)
595
- @value = elem[:value].to_i
596
- @pet_bonus = elem[:petBonus].to_i == -1 ? nil : elem[:petBonus].to_i
597
- end
598
- end
599
-
600
-
601
- # Note the list of talent trees starts at 1. This is quirky, but that's what's used in the XML
602
- class TalentSpec
603
- attr_reader :trees
604
-
605
- def initialize(elem)
606
- @trees = []
607
- @trees[1] = elem[:treeOne].to_i
608
- @trees[2] = elem[:treeTwo].to_i
609
- @trees[3] = elem[:treeThree].to_i
610
- end
611
- end
612
-
613
-
614
- # Player-versus-player data
615
- class Pvp
616
- attr_reader :lifetime_honorable_kills, :arena_currency
617
-
618
- def initialize(elem)
619
- @lifetime_honorable_kills = (elem%'lifetimehonorablekills')[:value].to_i
620
- @arena_currency = (elem%'arenacurrency')[:value].to_i
621
- end
622
- end
623
-
624
-
625
- # A buff
626
- class Buff
627
- attr_reader :name, :effect, :icon
628
-
629
- def initialize(elem)
630
- @name = elem[:name]
631
- @effect = elem[:effect]
632
- @icon = elem[:icon]
633
- end
634
- end
635
-
636
-
637
- # A player's profession, players can only have 2 max
638
- class Profession
639
- attr_reader :key, :name, :max, :value
640
-
641
- def initialize(elem)
642
- @key = elem[:key]
643
- @name = elem[:name]
644
- @value = elem[:value].to_i
645
- @max = elem[:max].to_i
646
- end
647
- end
648
-
649
-
650
- # An item equipped to a player
651
- class EquippedItem < Item
652
- attr_reader :durability, :max_durability, #:id, :item_id, :icon,
653
- :gems, :permanent_enchant,
654
- :random_properties_id, :seed, :slot
655
-
656
- def initialize(elem)
657
- super(elem)
658
- #@id = elem[:id].to_i
659
- #@icon = elem[:icon]
660
- @durability = elem[:durability].to_i
661
- @max_durability = elem[:maxDurability].to_i
662
- @gems = []
663
- @gems[0] = elem[:gem0Id].to_i == 0 ? nil : elem[:gem0Id].to_i
664
- @gems[1] = elem[:gem1Id].to_i == 0 ? nil : elem[:gem1Id].to_i
665
- @gems[2] = elem[:gem2Id].to_i == 0 ? nil : elem[:gem2Id].to_i
666
- @permanent_enchant = elem[:permanentEnchant].to_i
667
- @random_properties_id = elem[:randomPropertiesId] == 0 ? nil : elem[:randomPropertiesId].to_i
668
- @seed = elem[:seed].to_i # not sure if seed is so big it's overloading
669
- @slot = elem[:slot].to_i
670
- end
671
- end
672
-
673
-
674
- # A player guild containing members
675
- # note not all of these will be filled out, depending on how the data is found
676
- class Guild
677
- attr_reader :name, :url, :realm, :realm_url, :battle_group,
678
- :roster_url, :stats_url, :stats_url_escape,
679
- :faction, :faction_id,
680
- :members, :member_count
681
-
682
- def initialize(elem)
683
- if (elem%'guildKey')
684
- guild = (elem%'guildKey')
685
- else
686
- guild = elem
687
- end
688
-
689
- @name = guild[:name]
690
- @name_url = guild[:nameUrl]
691
- @url = guild[:url]
692
- @realm = guild[:realm]
693
- @realm_url = guild[:realmUrl]
694
- @battle_group = guild[:battleGroup]
695
- @faction = guild[:faction]
696
- @faction_id = guild[:factionId].to_i
697
-
698
- # some shortened versions
699
- if (elem%'guildInfo')
700
- @member_count = (elem%'guildInfo'%'guild'%'members')[:memberCount].to_i || nil
701
-
702
- @members = []
703
- (elem%'guildInfo'%'guild'%'members'/:character).each do |char|
704
- members << Character.new(char)
705
- end
706
- end
707
- end
708
- end
709
-
710
-
711
- # General skill category
712
- # eg Weapon Skills, Languages
713
- class SkillCategory
714
- attr_reader :key, :name, :skills
715
-
716
- def initialize(elem)
717
- @key = elem[:key]
718
- @name = elem[:name]
719
-
720
- @skills = []
721
- (elem/:skill).each do |skill|
722
- @skills << Skill.new(skill)
723
- end
724
- end
725
- end
726
-
727
- #
728
- # eg Daggers, Riding, Fishing
729
- class Skill
730
- attr_reader :key, :name, :value, :max
731
-
732
- def initialize(elem)
733
- @key = elem[:key]
734
- @name = elem[:name]
735
- @value = elem[:value]
736
- @max = elem[:max]
737
- end
738
- end
739
-
740
-
741
-
742
-
743
- # Larger group of factions
744
- # eg Alliance, Shattrath City, Steamwheedle Cartel
745
- # character-reputation.xml
746
- class FactionCategory
747
- attr_reader :key, :name, :factions
748
-
749
- def initialize(elem)
750
- @key = elem[:key]
751
- @name = elem[:name]
752
-
753
- @factions = []
754
- (elem/:faction).each do |faction|
755
- @factions << Faction.new(faction)
756
- end
757
- end
758
- end
759
-
760
- # Smaller NPC faction that is part of a FactionCategory
761
- # eg Darnassus, Argent Dawn
762
- class Faction
763
- attr_reader :key, :name, :reputation
764
-
765
- def initialize(elem)
766
- @key = elem[:key]
767
- @name = elem[:name]
768
- @reputation = elem[:reputation].to_i
769
- end
770
- end
771
-
772
-
773
-
774
-
775
- # Provides detailed item information
776
- # Note that the itemtooltip XML just returns an empty document when the item
777
- # can't be found.
778
- class ItemTooltip < Item
779
- attr_reader :desc, :overall_quality_id, :bonding, :max_count, #:id, :name, :icon,
780
- :class_id, :bonuses, :item_source,
781
- :bonuses, :resistances,
782
- :required_level,
783
- :allowable_classes,
784
- :armor, :durability,
785
- :sockets, :socket_match_enchant,
786
- :gem_properties
787
- alias_method :description, :desc
788
-
789
- def initialize(elem)
790
- @id = (elem%'id').html.to_i
791
- @name = (elem%'name').html
792
- @icon = (elem%'icon').html
793
- @desc = (elem%'desc').html if (elem%'desc')
794
- @overall_quality_id = (elem%'overallQualityId').html.to_i
795
- @bonding = (elem%'bonding').html.to_i
796
- @stackable = (elem%'stackable').html.to_i if (elem%'stackable')
797
- @max_count = (elem%'maxCount').html.to_i if (elem%'maxCount')
798
- @class_id = (elem%'classId').html.to_i
799
- @required_level = (elem%'requiredLevel').html.to_i if (elem%'requiredLevel')
800
-
801
- @equipData = ItemEquipData.new(elem%'equipData')
802
-
803
- # TODO: This appears to be a plain string at the moment
804
- #<gemProperties>+26 Healing +9 Spell Damage and 2% Reduced Threat</gemProperties>
805
- @gem_properties = (elem%'gemProperties').html if (elem%'gemProperties')
806
-
807
- # not all items have damage data
808
- @damage = ItemDamageData.new(elem%'damageData') if !(elem%'damageData').html.empty?
809
-
810
-
811
- # TODO: Test socket data with a variety of items
812
- # TODO: replace with socket Class?
813
- if (elem%'socketData')
814
- @sockets = []
815
- (elem%'socketData'/:socket).each do |socket|
816
- @sockets << socket[:color]
817
- end
818
-
819
- @socket_match_enchant = (elem%'socketData'%'socketMatchEnchant')
820
- end
821
-
822
-
823
- # When there is no data, stats are not present in @bonuses
824
- # TODO: When there is no stats at all, @bonuses shouldn't be set
825
- @bonuses = {}
826
-
827
- bonus_stats = {
828
- :strength => :bonusStrength,
829
- :agility => :bonusAgility,
830
- :stamina => :bonusStamina,
831
- :intellect => :bonusIntellect,
832
- :spirit => :bonusSpirit
833
- }
834
- bonus_stats.each do |stat, xml_elem|
835
- @bonuses[stat] = test_stat(elem/xml_elem) if test_stat(elem/xml_elem)
836
- end
837
-
838
- # Resistances
839
- @resistances = {}
840
-
841
- resist_stats = {
842
- :arcane => :arcaneResist,
843
- :fire => :fireResist,
844
- :frost => :frostResist,
845
- :holy => :holyResist,
846
- :nature => :natureResist,
847
- :shadow => :shadowResist
848
- }
849
- resist_stats.each do |stat, xml_elem|
850
- @resistances[stat] = test_stat(elem/xml_elem) if test_stat(elem/xml_elem)
851
- end
852
-
853
-
854
- if (elem%'allowableClasses')
855
- @allowable_classes = []
856
- (elem%'allowableClasses'/:class).each do |klass|
857
- @allowable_classes << klass.html
858
- end
859
- end
860
-
861
- # NOTE not representing armor bonus
862
- @armor = (elem%'armor').html.to_i if (elem%'armor')
863
-
864
- # NOTE not representing max
865
- @durability = (elem%'durability')[:current].to_i if (elem%'durability')
866
-
867
- if (elem%'spellData')
868
- @spells = []
869
- (elem%'spellData'/:spell).each do |spell|
870
- @spells << ItemSpell.new(spell)
871
- end
872
- end
873
-
874
- @setData = ItemSetData.new(elem%'setData') if (elem%'setData')
875
-
876
- # @item_sources = []
877
- # (elem/:itemSource).each do |source|
878
- # @item_sources << ItemSource.new(source)
879
- # end
880
- @item_source = ItemSource.new(elem%'itemSource') if (elem%'itemSource') # TODO: More than once source?
881
- end
882
-
883
- private
884
- def test_stat(elem)
885
- if elem
886
- if !elem.html.empty?
887
- return elem.html.to_i
888
- end
889
- end
890
- return nil
891
- end
892
- end
893
-
894
- class ItemEquipData
895
- attr_reader :inventory_type, :subclass_name, :container_slots
896
-
897
- def initialize(elem)
898
- @inventory_type = (elem%'inventoryType').html.to_i
899
- @subclass_name = (elem%'subclassName').html if (elem%'subclassName')
900
- @container_slots = (elem%'containerSlots').html.to_i if (elem%'containerSlots') # for baggies
901
- end
902
- end
903
-
904
- class ItemSetData
905
- attr_reader :name, :items, :set_bonuses
906
-
907
- def initialize(elem)
908
- @name = elem[:name]
909
-
910
- @items = []
911
- (elem/:item).each do |item|
912
- @items << item[:name]
913
- end
914
-
915
- @set_bonuses = []
916
- (elem/:setBonus).each do |bonus|
917
- @set_bonuses << ItemSetBonus.new(bonus)
918
- end
919
- end
920
- end
921
-
922
- class ItemSetBonus
923
- attr_reader :threshold, :description
924
- alias_method :desc, :description
925
-
926
- def initialize(elem)
927
- @threshold = elem[:threshold].to_i
928
- @description = elem[:desc]
929
- end
930
- end
931
-
932
- class ItemSpell
933
- attr_reader :trigger, :description
934
- alias_method :desc, :description
935
-
936
- def initialize(elem)
937
- @trigger = (elem%'trigger').html.to_i
938
- @description = (elem%'desc').html
939
- end
940
- end
941
-
942
- class ItemDamageData
943
- attr_reader :type, :min, :max, :speed, :dps
944
-
945
- def initialize(elem)
946
- @type = (elem%'damage'%'type').html.to_i
947
- @min = (elem%'damage'%'min').html.to_i
948
- @max = (elem%'damage'%'max').html.to_i
949
- @speed = (elem%'speed').html.to_i
950
- @dps = (elem%'dps').html.to_f
951
- end
952
- end
953
-
954
- class ItemSource
955
- attr_reader :value,
956
- :area_id, :area_name,
957
- :creature_id, :creature_name,
958
- :difficulty, :drop_rate
959
-
960
- def initialize(elem)
961
- @value = elem[:value]
962
- @area_id = elem[:areaId].to_i if elem[:areaId]
963
- @area_name = elem[:areaName] if elem[:areaName]
964
- @creature_id = elem[:creatureId].to_i if elem[:creatureId]
965
- @creature_name = elem[:creatureName] if elem[:creatureName]
966
- @difficulty = elem[:difficulty] if elem[:difficulty]
967
- @drop_rate = elem[:dropRate].to_i if elem[:dropRate]
968
- @required_level = elem[:reqLvl].to_i if elem[:reqLvl]
969
- end
970
- end
971
-
972
-
973
-
974
- # A really basic item type returned by searches
975
- class SearchItem < Item
976
- attr_reader :url, :rarity,
977
- :source, :item_level, :relevance
978
- alias_method :level, :item_level
979
-
980
- def initialize(elem)
981
- super(elem)
982
- @rarity = elem[:rarity].to_i
983
- @url = elem[:url]
984
-
985
- @item_level = elem.at("filter[@name='itemLevel']")[:value].to_i
986
- @source = elem.at("filter[@name='source']")[:value]
987
- @relevance = elem.at("filter[@name='relevance']")[:value].to_i
988
- end
989
- end
990
-
991
-
992
-
993
-
994
- # uses item-info.xml
995
- class ItemInfo < Item
996
- attr_reader :icon, :id, :level, :name, :quality, :type,
997
- :cost, :disenchants, :disenchant_skill_rank, :vendors,
998
- :plans_for
999
-
1000
- def initialize(elem)
1001
- @id = elem[:id].to_i
1002
- @level = elem[:level].to_i
1003
- @name = elem[:name]
1004
- @icon = elem[:icon]
1005
- @quality = elem[:quality].to_i
1006
- @type = elem[:type]
1007
-
1008
- # Cost can be in gold, or tokens
1009
- @cost = ItemCost.new(elem%'cost') if (elem%'cost')
1010
-
1011
-
1012
-
1013
- # is costs really an array?
1014
- #@costs = []
1015
- #(elem/:cost).each do |cost|
1016
- # @costs << ItemCost.new(cost)
1017
- #end
1018
-
1019
- if (elem%'disenchantLoot')
1020
- @disenchant_skill_rank = (elem%'disenchantLoot')[:requiredSkillRank].to_i
1021
-
1022
- @disenchant_items = []
1023
- (elem%'disenchantLoot'/:item).each do |item|
1024
- @disenchant_items << DisenchantItem.new(item)
1025
- end
1026
- end
1027
-
1028
- if (elem%'objectiveOfQuests')
1029
- @objective_of_quests = []
1030
- (elem%'objectiveOfQuests'/:quest).each do |quest|
1031
- @objective_of_quests << ItemQuest.new(quest)
1032
- end
1033
- end
1034
-
1035
- if (elem%'rewardFromQuests')
1036
- @reward_from_quests = []
1037
- (elem%'rewardFromQuests'/:quest).each do |quest|
1038
- @reward_from_quests << ItemQuest.new(quest)
1039
- end
1040
- end
1041
-
1042
- if (elem%'vendors')
1043
- @vendors = []
1044
- (elem%'vendors'/:creature).each do |vendor|
1045
- @vendors << ItemVendor.new(vendor)
1046
- end
1047
- end
1048
-
1049
- if (elem%'dropCreatures')
1050
- @drop_creatures = []
1051
- (elem%'dropCreatures'/:creature).each do |creature|
1052
- @drop_creatures << ItemDropCreature.new(creature)
1053
- end
1054
- end
1055
-
1056
- if (elem%'plansFor')
1057
- @plans_for = []
1058
- (elem%'plansFor'/:spell).each do |plan|
1059
- @plans_for << ItemPlansFor.new(plan)
1060
- end
1061
- end
1062
-
1063
- if (elem%'createdBy')
1064
- @created_by = []
1065
- (elem%'createdBy'/:spell).each do |c|
1066
- @created_by << ItemCreatedBy.new(c)
1067
- end
1068
- end
1069
- end
1070
- end
1071
-
1072
- # <rewardFromQuests>
1073
- # <quest name="Justice Dispensed" level="39" reqMinLevel="30" id="11206" area="Dustwallow Marsh" suggestedPartySize="0"></quest>
1074
- # <quest name="Peace at Last" level="39" reqMinLevel="30" id="11152" area="Dustwallow Marsh" suggestedPartySize="0"></quest>
1075
- # </rewardFromQuests>
1076
- # TODO: Rename
1077
- class ItemQuest
1078
- attr_reader :name, :id, :level, :min_level, :area, :suggested_party_size
1079
-
1080
- def initialize(elem)
1081
- @name = elem[:name]
1082
- @id = elem[:id].to_i
1083
- @level = elem[:level].to_i
1084
- @min_level = elem[:min_level].to_i
1085
- @area = elem[:area]
1086
- @suggested_party_size = elem[:suggested_party_size].to_i
1087
- end
1088
- end
1089
-
1090
-
1091
-
1092
- # Creatures that drop the item
1093
- # <creature name="Giant Marsh Frog" minLevel="1" type="Critter" maxLevel="1" dropRate="6" id="23979" classification="0" area="Dustwallow Marsh"></creature>
1094
- # <creature name="Nalorakk" minLevel="73" title="Bear Avatar" url="fl[source]=dungeon&amp;fl[difficulty]=normal&amp;fl[boss]=23576" type="Humanoid" maxLevel="73" dropRate="2" id="23576" classification="3" areaUrl="fl[source]=dungeon&amp;fl[boss]=all&amp;fl[difficulty]=normal&amp;fl[dungeon]=3805" area="Zul'Aman"></creature>
1095
- class ItemDropCreature
1096
- attr_reader :name, :id, :type, :min_level, :max_level, :drop_rate, :classification, :area
1097
-
1098
- def initialize(elem)
1099
- @name = elem[:name]
1100
- @id = elem[:id].to_i
1101
- @min_level = elem[:minLevel].to_i
1102
- @max_level = elem[:maxLevel].to_i
1103
- @drop_rate = elem[:dropRate].to_i
1104
- @classification = elem[:classification].to_i
1105
- @area = elem[:area]
1106
-
1107
- # optional boss stuff
1108
- @title = elem[:title] if elem[:title] # TODO: not nil when no property?
1109
- @url = elem[:url] if elem[:url]
1110
- @type = elem[:type] if elem[:type] # Humanoid etc.
1111
- @area_url = elem[:areaUrl] if elem[:areaUrl]
1112
- end
1113
- end
1114
-
1115
- # Cost can be gold or a set of required tokens
1116
- # See ItemCostToken
1117
- # <cost sellPrice="280" buyPrice="5600"></cost>
1118
- # <cost>
1119
- # <token icon="spell_holy_championsbond" id="29434" count="60"></token>
1120
- # </cost>
1121
- class ItemCost
1122
- attr_reader :buy_price, :sell_price, :tokens
1123
-
1124
- def initialize(elem)
1125
- @buy_price = elem[:buyPrice].to_i if elem[:buyPrice]
1126
- @sell_price = elem[:sellPrice].to_i if elem[:sellPrice]
1127
-
1128
- if (elem%'token')
1129
- @tokens = []
1130
- (elem/:token).each do |token|
1131
- @tokens << ItemCostToken.new(token)
1132
- end
1133
- end
1134
- end
1135
- end
1136
-
1137
- # <token icon="spell_holy_championsbond" id="29434" count="60"></token>
1138
- class ItemCostToken
1139
- attr_reader :id, :icon, :count
1140
-
1141
- def initialize(elem)
1142
- @id = elem[:id].to_i
1143
- @icon = elem[:icon]
1144
- @count = elem[:count].to_i
1145
- end
1146
- end
1147
-
1148
- # <item name="Void Crystal" minCount="1" maxCount="2" icon="inv_enchant_voidcrystal" type="Enchanting" level="70" dropRate="6" id="22450" quality="4"></item>
1149
- class DisenchantItem
1150
- attr_reader :name, :id, :icon, :level, :type, :drop_rate, :min_count, :max_count, :quality
1151
-
1152
- def initialize(elem)
1153
- @name = elem[:name]
1154
- @id = elem[:id].to_i
1155
- @icon = elem[:icon]
1156
- @level = elem[:level].to_i
1157
- @type = elem[:type]
1158
- @drop_rate = elem[:dropRate].to_i
1159
- @min_count = elem[:minCount].to_i
1160
- @max_count = elem[:maxCount].to_i
1161
- @quality = elem[:quality].to_i
1162
- end
1163
- end
1164
-
1165
- class ItemVendor
1166
- attr_reader :id, :name, :title, :type,
1167
- :area, :classification, :max_level, :min_level
1168
-
1169
- def initialize(elem)
1170
- @id = elem[:id].to_i
1171
- @name = elem[:name]
1172
- @title = elem[:title]
1173
- @type = elem[:type]
1174
- @area = elem[:area]
1175
- @classification = elem[:classification].to_i
1176
- @max_level = elem[:maxLevel].to_i
1177
- @min_level = elem[:minLevel].to_i
1178
- end
1179
- end
1180
-
1181
-
1182
-
1183
-
1184
- # TODO rename
1185
- # There is some sort of opposite relationship between PlansFor and CreatedBy
1186
- class ItemCreation
1187
- attr_reader :name, :id, :icon,
1188
- :item, :reagents
1189
-
1190
- def initialize(elem)
1191
- @name = elem[:name]
1192
- @id = elem[:id].to_i
1193
- @icon = elem[:icon]
1194
-
1195
- # not all items have reagents, some are just spells
1196
- if (elem%'reagent')
1197
- @reagents = []
1198
- (elem/:reagent).each do |reagent|
1199
- @reagents << Reagent.new(reagent)
1200
- end
1201
- end
1202
- end
1203
- end
1204
-
1205
-
1206
- # <plansFor>
1207
- # <spell name="Shadowprowler's Chestguard" icon="trade_leatherworking" id="42731">
1208
- # <item name="Shadowprowler's Chestguard" icon="inv_chest_plate11" type="Leather" level="105" id="33204" quality="4"></item>
1209
- # <reagent name="Heavy Knothide Leather" icon="inv_misc_leatherscrap_11" id="23793" count="10"></reagent>
1210
- # <reagent name="Bolt of Soulcloth" icon="inv_fabric_soulcloth_bolt" id="21844" count="16"></reagent>
1211
- # <reagent name="Primal Earth" icon="inv_elemental_primal_earth" id="22452" count="12"></reagent>
1212
- # <reagent name="Primal Shadow" icon="inv_elemental_primal_shadow" id="22456" count="12"></reagent>
1213
- # <reagent name="Primal Nether" icon="inv_elemental_primal_nether" id="23572" count="2"></reagent>
1214
- # </spell>
1215
- # </plansFor>
1216
- class ItemPlansFor < ItemCreation
1217
- def initialize(elem)
1218
- super(elem)
1219
- # TODO: Multiple items?
1220
- @item = CreatedItem.new(elem%'item') if (elem%'item')
1221
- end
1222
- end
1223
-
1224
- # <createdBy>
1225
- # <spell name="Bracing Earthstorm Diamond" icon="temp" id="32867">
1226
- # <item requiredSkill="Jewelcrafting" name="Design: Bracing Earthstorm Diamond" icon="inv_scroll_03" type="Jewelcrafting" level="73" id="25903" requiredSkillRank="365" quality="1"></item>
1227
- # <reagent name="Earthstorm Diamond" icon="inv_misc_gem_diamond_04" id="25867" count="1"></reagent>
1228
- # </spell>
1229
- # </createdBy>
1230
- class ItemCreatedBy < ItemCreation
1231
- def initialize(elem)
1232
- super(elem)
1233
- # TODO: Multiple items?
1234
- @item = PlanItem.new(elem%'item') if (elem%'item')
1235
- end
1236
- end
1237
-
1238
- # TODO: Might be better to reuse an existing Item class?
1239
- # <item name="Shadowprowler's Chestguard" icon="inv_chest_plate11" type="Leather" level="105" id="33204" quality="4"></item>
1240
- class CreatedItem < Item
1241
- attr_reader :type, :level, :quality
1242
-
1243
- def initialize(elem)
1244
- super(elem)
1245
- @type = elem[:type]
1246
- @level = elem[:level].to_i
1247
- @quality = elem[:quality].to_i
1248
- end
1249
- end
1250
-
1251
- # TODO: Might be better to reuse an existing Item class?
1252
- # <item requiredSkill="Jewelcrafting" name="Design: Bracing Earthstorm Diamond" icon="inv_scroll_03" type="Jewelcrafting" level="73" id="25903" requiredSkillRank="365" quality="1"></item>
1253
- class PlanItem < Item
1254
- attr_reader :required_skill, :type, :required_skill_rank, :level, :quality
1255
-
1256
- def initialize(elem)
1257
- super(elem)
1258
- @type = elem[:type]
1259
- @level = elem[:level].to_i
1260
- @quality = elem[:quality].to_i
1261
- @required_skill = elem[:requiredSkill]
1262
- @required_skill_rank = elem[:requiredSkillRank].to_i
1263
- end
1264
- end
1265
-
1266
- class Reagent
1267
- attr_reader :id, :name, :icon, :count
1268
-
1269
- def initialize(elem)
1270
- @id = elem[:id].to_i
1271
- @name = elem[:name]
1272
- @icon = elem[:icon]
1273
- @count = elem[:count].to_i
1274
- end
1275
- end
1276
-
1277
-
1278
-
1279
- # A group of individuals
1280
- # Note that search results don't contain the members
1281
- # <arenaTeams>
1282
- # <arenaTeam battleGroup="Blackout" faction="Alliance" factionId="0" gamesPlayed="10" gamesWon="7" lastSeasonRanking="0" name="SØPPERBIL" ranking="8721" rating="1610" realm="Draenor" realmUrl="b=Blackout&amp;r=Draenor&amp;ts=2&amp;t=S%C3%98PPERBIL&amp;ff=realm&amp;fv=Draenor&amp;select=S%C3%98PPERBIL" seasonGamesPlayed="49" seasonGamesWon="28" size="2" url="r=Draenor&amp;ts=2&amp;t=S%C3%98PPERBIL&amp;select=S%C3%98PPERBIL">
1283
- # <emblem background="ff2034cc" borderColor="ff14a30c" borderStyle="1" iconColor="ff1d800a" iconStyle="95"/>
1284
- # <members>
1285
- # <character battleGroup="" charUrl="r=Draenor&amp;n=Arussil" class="Rogue" classId="4" contribution="1613" gamesPlayed="10" gamesWon="7" gender="Male" genderId="0" guild="Adept" guildId="38253" guildUrl="r=Draenor&amp;n=Adept&amp;p=1" name="Arussil" race="Night Elf" raceId="4" seasonGamesPlayed="48" seasonGamesWon="28" teamRank="0"/>
1286
- # <character battleGroup="" charUrl="r=Draenor&amp;n=Cake" class="Shaman" classId="7" contribution="1516" gamesPlayed="0" gamesWon="0" gender="Male" genderId="0" guild="Adept" guildId="38253" guildUrl="r=Draenor&amp;n=Adept&amp;p=1" name="Cake" race="Draenei" raceId="11" seasonGamesPlayed="1" seasonGamesWon="1" teamRank="1"/>
1287
- #
1288
- # <character battleGroup="" charUrl="r=Draenor&amp;n=Efes" class="Druid" classId="11" contribution="1508" gamesPlayed="0" gamesWon="0" gender="Female" genderId="1" guild="Adept" guildId="38253" guildUrl="r=Draenor&amp;n=Adept&amp;p=1" name="Efes" race="Night Elf" raceId="4" seasonGamesPlayed="13" seasonGamesWon="7" teamRank="1"/>
1289
- # <character battleGroup="" charUrl="r=Draenor&amp;n=Lothaar" class="Paladin" classId="2" contribution="1602" gamesPlayed="10" gamesWon="7" gender="Male" genderId="0" guild="Ultimo Impero Oscuro" guildId="37203" guildUrl="r=Draenor&amp;n=Ultimo+Impero+Oscuro&amp;p=1" name="Lothaar" race="Human" raceId="1" seasonGamesPlayed="20" seasonGamesWon="13" teamRank="1"/>
1290
- # <character battleGroup="" charUrl="r=Draenor&amp;n=Lothaar" class="Paladin" classId="2" contribution="1602" gamesPlayed="10" gamesWon="7" gender="Male" genderId="0" guild="Passion" guildId="36659" guildUrl="r=Draenor&amp;n=Passion&amp;p=1" name="Lothaar" race="Human" raceId="1" seasonGamesPlayed="20" seasonGamesWon="13" teamRank="1"/>
1291
- # </members>
1292
- # </arenaTeam>
1293
- # </arenaTeams>
1294
- class ArenaTeam
1295
- attr_reader :name, :size, :battle_group, :faction, :faction_id, :realm, :realm_url,
1296
- :games_played, :games_won, :ranking, :rating,
1297
- :season_games_played, :season_games_won, :last_season_ranking,
1298
- :relevance, :url, :url_escape,
1299
- :characters, # can be blank on search results
1300
- :emblem
1301
-
1302
- def initialize(elem)
1303
- @name = elem[:name]
1304
- @size = elem[:size].to_i
1305
- @battle_group = elem[:battleGroup]
1306
- @faction = elem[:faction]
1307
- @faction_id = elem[:factionId].to_i
1308
- @realm = elem[:realm]
1309
- @realm_url = elem[:realmUrl]
1310
-
1311
- @games_played = elem[:gamesPlayed].to_i
1312
- @games_won = elem[:gamesWon].to_i
1313
- @ranking = elem[:ranking].to_i
1314
- @rating = elem[:rating].to_i
1315
-
1316
- @season_games_played = elem[:seasonGamesPlayed].to_i
1317
- @season_games_won = elem[:seasonGamesWon].to_i
1318
- @last_season_ranking = elem[:lastSeasonRanking].to_i
1319
-
1320
- @relevance = elem[:relevance].to_i
1321
- @url = elem[:url]
1322
-
1323
- @emblem = ArenaTeamEmblem.new(elem%'emblem')
1324
-
1325
- @members = []
1326
- (elem%'members'/:character).each do |character|
1327
- @members << Character.new(character)
1328
- end
1329
- end
1330
- end
1331
-
1332
- class ArenaTeamEmblem
1333
- attr_reader :background, :border_color, :border_style, :icon_colour, :icon_style
1334
-
1335
- def initialize(elem)
1336
- @background = elem[:background]
1337
- @border_color = elem[:borderColor]
1338
- @border_style = elem[:borderStyle].to_i
1339
- @icon_color = elem[:iconColor]
1340
- @icon_style = elem[:iconStyle].to_i
1341
- end
1342
- end
1343
-
1344
- end
1345
- end