wowr 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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