wowr 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README +6 -4
- data/lib/wowr.rb +145 -49
- data/lib/wowr/classes.rb +9 -1
- data/lib/wowr/exceptions.rb +3 -0
- metadata +2 -2
data/README
CHANGED
@@ -19,12 +19,14 @@ When initialising the library, it is possible to set a number of parameters to b
|
|
19
19
|
|
20
20
|
# all parameters optional
|
21
21
|
api = Wowr::API.new(:character_name => 'Foo',
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
:guild_name => 'Bar',
|
23
|
+
:realm => 'Baz',
|
24
|
+
:locale => 'eu', # defaults to US www
|
25
|
+
:lang => 'fr_fr', # remove for locale default language
|
26
|
+
:caching => true # defaults to false)
|
25
27
|
|
26
28
|
# Character requests
|
27
|
-
my_char = api.get_character_sheet
|
29
|
+
my_char = api.get_character_sheet # gets character with API default values
|
28
30
|
char_boo = api.get_character_sheet(:character_name => 'Boo')
|
29
31
|
chars = api.search_characters(:search => 'Cake')
|
30
32
|
|
data/lib/wowr.rb
CHANGED
@@ -15,17 +15,22 @@ require 'cgi'
|
|
15
15
|
require 'fileutils' # for making directories :S
|
16
16
|
|
17
17
|
# TODO: what does this do?
|
18
|
-
|
18
|
+
$:.unshift(File.dirname(__FILE__)) unless $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
19
|
+
|
20
|
+
# require 'lib/wowr/exceptions.rb'
|
21
|
+
# require 'lib/wowr/extensions.rb'
|
22
|
+
# require 'lib/wowr/classes.rb'
|
23
|
+
|
24
|
+
require 'wowr/exceptions.rb'
|
25
|
+
require 'wowr/extensions.rb'
|
26
|
+
require 'wowr/classes.rb'
|
19
27
|
|
20
|
-
require 'lib/wowr/exceptions.rb'
|
21
|
-
require 'lib/wowr/extensions.rb'
|
22
|
-
require 'lib/wowr/classes.rb'
|
23
28
|
|
24
29
|
module Wowr
|
25
30
|
class API
|
26
31
|
|
27
|
-
@@
|
28
|
-
@@eu_armory_url = 'http://eu.wowarmory.com/'
|
32
|
+
@@armory_url_base = 'wowarmory.com/'
|
33
|
+
# @@eu_armory_url = 'http://eu.wowarmory.com/'
|
29
34
|
|
30
35
|
@@search_url = 'search.xml'
|
31
36
|
|
@@ -112,30 +117,49 @@ module Wowr
|
|
112
117
|
|
113
118
|
@@arena_team_sizes = [2, 3, 5]
|
114
119
|
|
115
|
-
attr_accessor :character_name, :guild_name, :realm, :locale, :caching
|
120
|
+
attr_accessor :character_name, :guild_name, :realm, :locale, :lang, :caching, :debug
|
116
121
|
|
117
122
|
# You can set up the API with an optional default guild and realm
|
118
123
|
# These will be used in all your API requests unless you specify otherwise
|
119
124
|
# For item requests, the locale will not matter in results, but may affect the speed of replies
|
120
125
|
# Caching is off by default
|
121
126
|
# TODO: are these nil declarations pointless?
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
+
# :character_name => nil,
|
128
|
+
# :guild_name => nil,
|
129
|
+
# :realm => nil,
|
130
|
+
# :locale => 'us',
|
131
|
+
# :caching => false,
|
132
|
+
# :debug => false
|
133
|
+
def initialize(options = {})
|
127
134
|
@character_name = options[:character_name]
|
128
135
|
@guild_name = options[:guild_name]
|
129
136
|
@realm = options[:realm]
|
130
|
-
@locale = options[:locale]
|
137
|
+
@locale = options[:locale] || :us
|
131
138
|
@caching = options[:caching]
|
139
|
+
|
140
|
+
if (options[:lang].nil?)
|
141
|
+
@lang = 'default'
|
142
|
+
else
|
143
|
+
@lang = options[:lang]
|
144
|
+
end
|
145
|
+
|
146
|
+
@debug = options[:debug]
|
132
147
|
end
|
133
148
|
|
134
149
|
|
150
|
+
# def self.test
|
151
|
+
# puts @debug
|
152
|
+
# puts @caching
|
153
|
+
# puts @locale
|
154
|
+
# end
|
155
|
+
|
156
|
+
|
135
157
|
# General-purpose search
|
136
158
|
# All specific searches are wrappers around this method.
|
137
159
|
# Caching is disabled for searching
|
138
160
|
def search(options = {:search => nil, :type => nil})
|
161
|
+
options = merge_defaults(options)
|
162
|
+
|
139
163
|
if @@search_types.include? options[:type]
|
140
164
|
raise Wowr::Exceptions::InvalidSearchType.new
|
141
165
|
end
|
@@ -184,12 +208,17 @@ module Wowr
|
|
184
208
|
# Characters
|
185
209
|
# Note searches go across all realms by default
|
186
210
|
# Caching is disabled for searching
|
187
|
-
def search_characters(options = {:name =>
|
211
|
+
def search_characters(options = {:name => nil})
|
188
212
|
options.merge!(:type => @@search_types[:character])
|
189
213
|
return search(options)
|
190
214
|
end
|
191
215
|
|
192
|
-
def get_character_sheet(options = {
|
216
|
+
def get_character_sheet(options = {})
|
217
|
+
|
218
|
+
options = {:character_name => @character_name}.merge(options) if (!@character_name.nil?)
|
219
|
+
|
220
|
+
options = merge_defaults(options)
|
221
|
+
|
193
222
|
xml = get_xml(@@character_sheet_url, options)
|
194
223
|
|
195
224
|
# resist_types = ['arcane', 'fire', 'frost', 'holy', 'nature', 'shadow']
|
@@ -198,7 +227,6 @@ module Wowr
|
|
198
227
|
# @resistances[res] = Wowr::Classes::Resistance.new(xml%'resistances'%res)
|
199
228
|
# end
|
200
229
|
# puts @resistances.to_yaml
|
201
|
-
puts xml
|
202
230
|
return Wowr::Classes::CharacterSheet.new(xml)
|
203
231
|
end
|
204
232
|
|
@@ -207,18 +235,24 @@ module Wowr
|
|
207
235
|
# Guilds
|
208
236
|
# Note searches go across all realms by default
|
209
237
|
# Caching is disabled for searching
|
210
|
-
def search_guilds(options = {:search =>
|
211
|
-
options.merge!(:type => @@search_types[:guild]
|
238
|
+
def search_guilds(options = {:search => nil})
|
239
|
+
options.merge!(:type => @@search_types[:guild],
|
240
|
+
:caching => false)
|
241
|
+
|
212
242
|
return search(options)
|
213
243
|
end
|
214
244
|
|
215
|
-
def get_guild(options = {
|
245
|
+
def get_guild(options = {})
|
246
|
+
# overwrite default with parameters, but only if the defaults aren't blank
|
247
|
+
options = {:guild_name => @guild_name}.merge(options) if (!@guild_name.nil?)
|
248
|
+
|
249
|
+
options = merge_defaults(options)
|
250
|
+
|
216
251
|
xml = get_xml(@@guild_info_url, options)
|
217
252
|
return Wowr::Classes::Guild.new(xml)
|
218
253
|
end
|
219
254
|
|
220
255
|
|
221
|
-
|
222
256
|
# Items
|
223
257
|
# Items are not realm-specific
|
224
258
|
# Caching is disabled for searching
|
@@ -233,7 +267,9 @@ module Wowr
|
|
233
267
|
#return Wowr::Classes::ItemTooltip.new(xml%'itemTooltip')
|
234
268
|
#end
|
235
269
|
|
236
|
-
def get_item_info(options = {:item_id => nil
|
270
|
+
def get_item_info(options = {:item_id => nil})
|
271
|
+
options = merge_defaults(options)
|
272
|
+
|
237
273
|
xml = get_xml(@@item_info_url, options)
|
238
274
|
if (xml%'itemInfo'%'item')
|
239
275
|
return Wowr::Classes::ItemInfo.new(xml%'itemInfo'%'item')
|
@@ -242,7 +278,9 @@ module Wowr
|
|
242
278
|
end
|
243
279
|
end
|
244
280
|
|
245
|
-
def get_item_tooltip(options = {:item_id => nil
|
281
|
+
def get_item_tooltip(options = {:item_id => nil})
|
282
|
+
options = merge_defaults(options)
|
283
|
+
|
246
284
|
xml = get_xml(@@item_tooltip_url, options)
|
247
285
|
|
248
286
|
# tooltip returns empty document when not found
|
@@ -262,7 +300,9 @@ module Wowr
|
|
262
300
|
return search(options)
|
263
301
|
end
|
264
302
|
|
265
|
-
def get_arena_team(options = {
|
303
|
+
def get_arena_team(options = {})
|
304
|
+
options = merge_defaults(options)
|
305
|
+
|
266
306
|
if !@@arena_team_sizes.include?(options[:team_size])
|
267
307
|
raise Wowr::Exceptions::InvalidArenaTeamSize.new("Arena teams size must be: #{@@arena_team_sizes.inspect}")
|
268
308
|
end
|
@@ -287,10 +327,34 @@ module Wowr
|
|
287
327
|
end
|
288
328
|
|
289
329
|
|
330
|
+
|
331
|
+
def merge_defaults(options = {})
|
332
|
+
# defaults[:name] = @charater_name if @charater_name
|
333
|
+
# defaults[:name] = @charater_name if @charater_name
|
334
|
+
defaults = {}
|
335
|
+
defaults[:realm] = @realm if @realm
|
336
|
+
defaults[:locale] = @locale if @locale
|
337
|
+
defaults[:lang] = @lang if @lang
|
338
|
+
defaults[:caching] = @caching if @caching
|
339
|
+
defaults[:debug] = @debug if @debug
|
340
|
+
|
341
|
+
# defaults = {:realm => @realm,
|
342
|
+
# :locale => @locale,
|
343
|
+
# :lang => @lang,
|
344
|
+
# :caching => @caching,
|
345
|
+
# :debug => @debug}
|
346
|
+
|
347
|
+
# overwrite defaults with any given options
|
348
|
+
defaults.merge!(options)
|
349
|
+
end
|
350
|
+
|
351
|
+
|
290
352
|
protected
|
291
353
|
|
292
354
|
# TODO: pretty damn hacky
|
293
|
-
def get_xml(url, options = {
|
355
|
+
def get_xml(url, options = {})
|
356
|
+
# puts options.to_yaml
|
357
|
+
|
294
358
|
# better way of doing this?
|
295
359
|
# Map custom keys to the HTTP request values
|
296
360
|
reqs = {
|
@@ -315,20 +379,24 @@ module Wowr
|
|
315
379
|
query = '?' + params.join('&')
|
316
380
|
end
|
317
381
|
|
318
|
-
locale = options[:locale] || @locale
|
382
|
+
# locale = options[:locale] || @locale
|
319
383
|
|
320
|
-
base = self.base_url(locale)
|
384
|
+
base = self.base_url(options[:locale])
|
321
385
|
full_query = base + url + query
|
322
386
|
|
323
|
-
|
387
|
+
if options[:debug]
|
388
|
+
puts full_query
|
389
|
+
end
|
324
390
|
|
325
391
|
if options[:caching]
|
326
|
-
response = get_cache(full_query)
|
392
|
+
response = get_cache(full_query, options)
|
327
393
|
else
|
328
394
|
response = http_request(full_query)
|
329
395
|
end
|
330
396
|
|
331
|
-
|
397
|
+
if options[:debug]
|
398
|
+
# puts response
|
399
|
+
end
|
332
400
|
|
333
401
|
doc = Hpricot.XML(response)
|
334
402
|
begin
|
@@ -354,17 +422,25 @@ module Wowr
|
|
354
422
|
end
|
355
423
|
|
356
424
|
# TODO Rename
|
357
|
-
def http_request(url)
|
358
|
-
|
425
|
+
def http_request(url, options = {})
|
426
|
+
|
427
|
+
req = Net::HTTP::Get.new(url)#, headers)
|
359
428
|
req["user-agent"] = "Mozilla/5.0 Gecko/20070219 Firefox/2.0.0.2"
|
429
|
+
req["cookie"] = "cookieMenu=all; cookieLangId=" + options[:lang] + "; cookies=true;"
|
360
430
|
|
361
431
|
uri = URI.parse(url)
|
362
432
|
|
363
|
-
http = Net::HTTP.new
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
433
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
434
|
+
|
435
|
+
begin
|
436
|
+
|
437
|
+
http.start do
|
438
|
+
res = http.request req
|
439
|
+
response = res.body
|
440
|
+
end
|
441
|
+
rescue
|
442
|
+
raise Wowr::Exceptions::ServerDoesNotExist.new('Specified server at ' + url + ' does not exist.');
|
443
|
+
end
|
368
444
|
|
369
445
|
# tries = 0
|
370
446
|
# response = case res
|
@@ -408,17 +484,23 @@ module Wowr
|
|
408
484
|
end
|
409
485
|
|
410
486
|
|
411
|
-
def get_cache(url)
|
412
|
-
|
487
|
+
def get_cache(url, options = {})
|
488
|
+
|
489
|
+
path = @@cache_directory_path + options[:lang] + '/' + url_to_filename(url)
|
413
490
|
|
414
491
|
# file doesn't exist, make it
|
415
492
|
if !File.exists?(path)
|
493
|
+
if options[:debug]
|
494
|
+
puts 'Cache doesn\'t exist, making: ' + path
|
495
|
+
end
|
496
|
+
|
497
|
+
FileUtils.mkdir_p(localised_cache_path(options[:lang])) unless File.directory?(localised_cache_path(options[:lang]))
|
416
498
|
|
417
499
|
# TODO: Hacky
|
418
|
-
FileUtils.mkdir_p(@@cache_directory_path + 'us/') unless File.directory?(@@cache_directory_path + 'us/')
|
419
|
-
FileUtils.mkdir_p(@@cache_directory_path + 'eu/') unless File.directory?(@@cache_directory_path + 'eu/')
|
500
|
+
# FileUtils.mkdir_p(@@cache_directory_path + 'us/') unless File.directory?(@@cache_directory_path + 'us/')
|
501
|
+
# FileUtils.mkdir_p(@@cache_directory_path + 'eu/') unless File.directory?(@@cache_directory_path + 'eu/')
|
420
502
|
|
421
|
-
xml_content = http_request(url)
|
503
|
+
xml_content = http_request(url, options)
|
422
504
|
|
423
505
|
# write the cache
|
424
506
|
file = File.open(path, File::WRONLY|File::TRUNC|File::CREAT)
|
@@ -428,6 +510,10 @@ module Wowr
|
|
428
510
|
|
429
511
|
# file exists, return the contents
|
430
512
|
else
|
513
|
+
if options[:debug]
|
514
|
+
puts 'Cache already exists, read: ' + path
|
515
|
+
end
|
516
|
+
|
431
517
|
file = File.open(path, 'r')
|
432
518
|
xml_content = file.read
|
433
519
|
file.close
|
@@ -439,23 +525,33 @@ module Wowr
|
|
439
525
|
|
440
526
|
# :nodoc:
|
441
527
|
# remove http://
|
528
|
+
# Kind of assuming incoming URL is the same as the current locale
|
442
529
|
def url_to_filename(url)
|
443
|
-
|
444
|
-
path = 'us/' + url.gsub(@@eu_armory_url, '')
|
445
|
-
elsif (url.include?(@@eu_armory_url))
|
446
|
-
path = 'eu/' + url.gsub(@@eu_armory_url, '')
|
447
|
-
end
|
530
|
+
path = url[7..-1]
|
448
531
|
|
532
|
+
|
533
|
+
path = url.gsub(base_url, '')
|
534
|
+
# if (url.include?(@@armory_url))
|
535
|
+
# path = 'us/' + url.gsub(@@eu_armory_url, '')
|
536
|
+
# elsif (url.include?(@@eu_armory_url))
|
537
|
+
# path = 'eu/' + url.gsub(@@eu_armory_url, '')
|
538
|
+
# end
|
539
|
+
#
|
449
540
|
return path
|
450
541
|
end
|
451
542
|
|
452
543
|
|
544
|
+
def localised_cache_path(lang = @lang)
|
545
|
+
@@cache_directory_path + lang
|
546
|
+
end
|
547
|
+
|
548
|
+
|
453
549
|
# :nodoc:
|
454
550
|
def base_url(locale = @locale)
|
455
|
-
if locale == :
|
456
|
-
@@
|
551
|
+
if locale == :us
|
552
|
+
'http://www.' + @@armory_url_base
|
457
553
|
else
|
458
|
-
@@
|
554
|
+
'http://' + locale + '.' + @@armory_url_base
|
459
555
|
end
|
460
556
|
end
|
461
557
|
|
data/lib/wowr/classes.rb
CHANGED
@@ -176,7 +176,15 @@ module Wowr
|
|
176
176
|
@battle_group = elem[:battleGroup]
|
177
177
|
|
178
178
|
# format is February 11, 2008
|
179
|
-
|
179
|
+
# except when it's korean, and then it's 2008년 5월 11일 (일)
|
180
|
+
# tw is 2008年5月11日 (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
|
180
188
|
#@last_modified = elem[:lastModified]#.to_time
|
181
189
|
|
182
190
|
@arena_teams = []
|
data/lib/wowr/exceptions.rb
CHANGED
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.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Humphreys
|
@@ -57,7 +57,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
57
57
|
requirements: []
|
58
58
|
|
59
59
|
rubyforge_project: wowr
|
60
|
-
rubygems_version: 1.
|
60
|
+
rubygems_version: 1.1.1
|
61
61
|
signing_key:
|
62
62
|
specification_version: 2
|
63
63
|
summary: An API wrapper for the World of Warcraft Armory.
|