backpack_tf 0.2.1 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/backpack_tf.gemspec +6 -3
- data/lib/backpack_tf/client.rb +35 -16
- data/lib/backpack_tf/currencies.rb +11 -4
- data/lib/backpack_tf/finder.rb +87 -0
- data/lib/backpack_tf/item.rb +84 -3
- data/lib/backpack_tf/item_price.rb +62 -43
- data/lib/backpack_tf/prices.rb +25 -46
- data/lib/backpack_tf/response.rb +35 -30
- data/lib/backpack_tf/version.rb +3 -0
- data/lib/backpack_tf.rb +2 -1
- data/spec/backpack_tf/client_spec.rb +107 -56
- data/spec/backpack_tf/currencies_spec.rb +80 -26
- data/spec/backpack_tf/finder_spec.rb +30 -0
- data/spec/backpack_tf/item_price_spec.rb +55 -0
- data/spec/backpack_tf/item_spec.rb +160 -11
- data/spec/backpack_tf/prices_spec.rb +103 -32
- data/spec/backpack_tf/response_spec.rb +95 -20
- data/spec/fixtures/currencies_updated.json +1 -0
- data/spec/fixtures/{item.json → item_typical.json} +0 -0
- data/spec/fixtures/item_unusual.json +1 -0
- data/spec/fixtures/item_with_unconventional_structure.json +1 -0
- data/spec/fixtures/item_without_defindex.json +1 -0
- data/spec/spec_helper.rb +2 -1
- metadata +14 -8
- data/Gemfile.lock +0 -41
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c0bb160d7663670acc3d14ca49f79e5fc97f8387
|
4
|
+
data.tar.gz: d928ca0ec022d0e73cebb5bd174dac654621623e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e10182770c9739e8ff40067e3da906923be2b2684a664e8e8d56fe9885e5dd1dda9c22b83fe95e22ee31bae202944e38a9ac81c9aa0b6beb6ba234c1ce9273e
|
7
|
+
data.tar.gz: e0f8b763197c2f372385f090d4d9caa2d61688da1c37efeab0ae2ce37e5cffe1cc14d0a78d6b5ec23cb6918eae3cc4b39b44f35b48655ceedd47997ff2e1af1d
|
data/.gitignore
CHANGED
data/backpack_tf.gemspec
CHANGED
@@ -1,16 +1,19 @@
|
|
1
|
+
require_relative './lib/backpack_tf/version.rb'
|
2
|
+
|
1
3
|
Gem::Specification.new do |s|
|
2
4
|
s.name = 'backpack_tf'
|
3
|
-
s.
|
4
|
-
s.date = '2015-05-01'
|
5
|
+
s.date = '2015-05-07'
|
5
6
|
s.summary = 'a wrapper for the backpack.tf API'
|
6
7
|
s.author = 'Rafael Espinoza'
|
7
8
|
s.email = 'rafael@rafaelespinoza.com'
|
8
9
|
s.homepage = 'https://github.com/NerdDiffer/backpack_tf'
|
9
10
|
s.license = 'MIT'
|
10
|
-
s.description =
|
11
|
+
s.description = 'API client, accessor methods for backpack.tf'
|
11
12
|
|
12
13
|
s.require_paths = ['lib']
|
13
14
|
s.files = `git ls-files`.split("\n")
|
15
|
+
s.version = BackpackTF::VERSION
|
16
|
+
s.required_ruby_version = '>=1.9.3'
|
14
17
|
|
15
18
|
s.add_runtime_dependency 'httparty', '~>0.13', '>=0.13.3'
|
16
19
|
|
data/lib/backpack_tf/client.rb
CHANGED
@@ -34,21 +34,24 @@ module BackpackTF
|
|
34
34
|
|
35
35
|
def self.build_url_via action, query_options = {}
|
36
36
|
case action
|
37
|
-
when :get_prices
|
37
|
+
when :get_prices, :prices
|
38
38
|
version = 4
|
39
39
|
interface_url = "/#{Prices.interface}/v#{version}/?"
|
40
|
-
when :get_currencies
|
40
|
+
when :get_currencies, :currencies
|
41
41
|
version = 1
|
42
42
|
interface_url = "/#{Currencies.interface}/v#{version}/?"
|
43
|
-
when :get_special_items
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
43
|
+
when :get_special_items, :special_items
|
44
|
+
raise RuntimeError, "Unfortunately, this interface is not yet supported."
|
45
|
+
#version = 1
|
46
|
+
#interface_url = "/IGetSpecialItems/v#{version}/?"
|
47
|
+
when :get_users, :users
|
48
|
+
raise RuntimeError, "Unfortunately, this interface is not yet supported."
|
49
|
+
#version = 3
|
50
|
+
#interface_url = "/IGetUsers/v#{version}/?"
|
51
|
+
when :get_user_listings, :user_listings
|
52
|
+
raise RuntimeError, "Unfortunately, this interface is not yet supported."
|
53
|
+
#version = 1
|
54
|
+
#interface_url = "/IGetUserListings/v#{version}/?"
|
52
55
|
else
|
53
56
|
raise ArgumentError, 'pass in valid action as a Symbol object'
|
54
57
|
end
|
@@ -75,15 +78,32 @@ module BackpackTF
|
|
75
78
|
@db = nil
|
76
79
|
end
|
77
80
|
|
81
|
+
def fetch interface, query_options = {}
|
82
|
+
get_data(interface, query_options)['response']
|
83
|
+
end
|
84
|
+
|
85
|
+
def update class_to_update, data_to_update
|
86
|
+
send_update_to_master_hash(class_to_update, data_to_update)
|
87
|
+
refresh_class_hash(class_to_update)
|
88
|
+
end
|
89
|
+
|
90
|
+
private
|
91
|
+
|
92
|
+
def send_update_to_master_hash class_to_update, data_to_update
|
93
|
+
Response.responses( { class_to_update.to_sym => data_to_update } )
|
94
|
+
end
|
95
|
+
|
96
|
+
def refresh_class_hash class_to_update
|
97
|
+
class_to_update.response
|
98
|
+
end
|
99
|
+
|
78
100
|
def get_data action, query_options = {}
|
79
101
|
handle_timeouts do
|
80
102
|
url = self.class.build_url_via(action, query_options)
|
81
|
-
self.class.get(url)
|
103
|
+
self.class.get(url)
|
82
104
|
end
|
83
105
|
end
|
84
|
-
|
85
|
-
private
|
86
|
-
|
106
|
+
|
87
107
|
# HTTParty raises an errors after time limit defined by ::default_timeout
|
88
108
|
# * if it cannot connect to server, then it raises Net::OpenTimeout
|
89
109
|
# * if it cannot read response from server, then it raises Net::ReadTimeout
|
@@ -95,7 +115,6 @@ module BackpackTF
|
|
95
115
|
{}
|
96
116
|
end
|
97
117
|
end
|
98
|
-
|
99
118
|
|
100
119
|
end
|
101
120
|
|
@@ -2,18 +2,25 @@ module BackpackTF
|
|
2
2
|
|
3
3
|
# ruby representations of a JSON response to
|
4
4
|
# `IGetCurrencies`['response']
|
5
|
-
class Currencies
|
5
|
+
class Currencies < Response
|
6
6
|
|
7
7
|
###########################
|
8
8
|
# Class Methods
|
9
9
|
###########################
|
10
10
|
|
11
|
-
|
11
|
+
INTERFACE = :IGetCurrencies
|
12
|
+
@interface = INTERFACE
|
13
|
+
@response = nil
|
14
|
+
@@currencies = nil
|
12
15
|
|
13
|
-
|
16
|
+
def self.response
|
17
|
+
@response = superclass.responses[to_sym]
|
18
|
+
end
|
14
19
|
|
15
20
|
def self.currencies
|
16
|
-
|
21
|
+
return @response if @response.nil?
|
22
|
+
@@currencies = response[:currencies]
|
23
|
+
hash_keys_to_sym(@@currencies)
|
17
24
|
end
|
18
25
|
|
19
26
|
###########################
|
@@ -0,0 +1,87 @@
|
|
1
|
+
module BackpackTF
|
2
|
+
module Finder
|
3
|
+
|
4
|
+
def self.included(other)
|
5
|
+
other.extend(ClassMethods)
|
6
|
+
super
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
# returns JSON data for the item
|
11
|
+
# does not return data for items with a special particle effect
|
12
|
+
def get_item_price quality, item_name
|
13
|
+
item = find_item_by_name(item_name)
|
14
|
+
ind = @@qualities.find_index(quality)
|
15
|
+
|
16
|
+
prefix = item['prices'][ind.to_s]['Tradable']
|
17
|
+
if prefix.nil?
|
18
|
+
raise(ArgumentError, "The item, #{quality} #{item_name}, is not Tradable")
|
19
|
+
end
|
20
|
+
prefix = prefix['Craftable']
|
21
|
+
if prefix.nil?
|
22
|
+
raise(ArgumentError, "The item, #{quality} #{item_name}, is not Craftable")
|
23
|
+
end
|
24
|
+
|
25
|
+
# oddly, there are cases (such as the "Lugermorph"), where the
|
26
|
+
# type of the object at this point in the JSON data (saved to the `prefix` variable)
|
27
|
+
# is a Hash object rather than an Array object.
|
28
|
+
# That makes the PriceIndex key a String, "0", rather than a Fixnum, 0.
|
29
|
+
if prefix[0].nil?
|
30
|
+
prefix[0.to_s]
|
31
|
+
else
|
32
|
+
prefix[0]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def defindex_to_item_name defindex
|
37
|
+
items = get_items_hash
|
38
|
+
keys = items.keys#.shuffle
|
39
|
+
|
40
|
+
i = 0
|
41
|
+
while i < keys.length
|
42
|
+
current_defindex = items[keys[i]]['defindex']
|
43
|
+
if(current_defindex[0] == defindex)
|
44
|
+
return keys[i]
|
45
|
+
end
|
46
|
+
i += 1
|
47
|
+
end
|
48
|
+
raise KeyError, "item with a defindex of #{defindex} was not found"
|
49
|
+
end
|
50
|
+
|
51
|
+
def get_name_of_random_item
|
52
|
+
items = get_items_hash
|
53
|
+
items.keys.sample
|
54
|
+
end
|
55
|
+
|
56
|
+
# returns JSON representation of pricing for the item
|
57
|
+
def find_item_by_name item_name
|
58
|
+
items = get_items_hash
|
59
|
+
if items[item_name].nil?
|
60
|
+
raise KeyError, "item with the name #{item_name} was not found"
|
61
|
+
else
|
62
|
+
items[item_name]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# @param [String] item_name, the item name (according to item_name of item's schema)
|
67
|
+
# @param [Symbol] type, checking to see if item is of this type
|
68
|
+
# @return [Boolean] `true` if the item is the type
|
69
|
+
def is_item_of_type? item_name, type = :weapon
|
70
|
+
item = find_item_by_name(item_name)
|
71
|
+
defindex = item['defindex'][0]
|
72
|
+
tf2_item = Trade.tf2_item_schema.items[defindex]
|
73
|
+
|
74
|
+
case type
|
75
|
+
when :cosmetic
|
76
|
+
tf2_item[:item_class] == 'tf_wearable'
|
77
|
+
else
|
78
|
+
tf2_item[:item_slot] == 'primary' ||
|
79
|
+
tf2_item[:item_slot] == 'secondary' ||
|
80
|
+
tf2_item[:item_slot] == 'melee'
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
end
|
data/lib/backpack_tf/item.rb
CHANGED
@@ -2,6 +2,35 @@ module BackpackTF
|
|
2
2
|
|
3
3
|
class Item
|
4
4
|
|
5
|
+
include BackpackTF::Finder
|
6
|
+
|
7
|
+
###########################
|
8
|
+
# Class Methods
|
9
|
+
###########################
|
10
|
+
|
11
|
+
#def self.generate_price_keys item_hash
|
12
|
+
# raise TypeError unless item_hash.class == Hash
|
13
|
+
# prices = item_hash['prices']
|
14
|
+
|
15
|
+
# prices.each_pair.inject([]) do |gen_keys, (key, val)|
|
16
|
+
# quality = BackpackTF::ItemPrice.qualities[key.to_i]
|
17
|
+
# new_key = [quality.to_s]
|
18
|
+
|
19
|
+
# tradability = val.keys.first
|
20
|
+
# new_key << tradability
|
21
|
+
|
22
|
+
# craftability = prices[key][tradability].keys.first
|
23
|
+
# new_key << craftability
|
24
|
+
|
25
|
+
# gen_keys << new_key.join('_')
|
26
|
+
# end
|
27
|
+
|
28
|
+
#end
|
29
|
+
|
30
|
+
###########################
|
31
|
+
# Instance Methods
|
32
|
+
###########################
|
33
|
+
|
5
34
|
# @return [String] the name of item
|
6
35
|
attr_reader :item_name
|
7
36
|
# @return [Fixnum] the index on which you can link this item to Team Fortress 2's Item Schema
|
@@ -10,9 +39,61 @@ module BackpackTF
|
|
10
39
|
attr_reader :prices
|
11
40
|
|
12
41
|
def initialize item_name, attr
|
13
|
-
@item_name
|
14
|
-
|
15
|
-
|
42
|
+
@item_name = item_name
|
43
|
+
|
44
|
+
unless attr.class == Hash
|
45
|
+
attr = JSON.parse(attr)
|
46
|
+
end
|
47
|
+
|
48
|
+
@defindex = attr['defindex'][0]
|
49
|
+
@prices = gen_prices_hash(attr)
|
50
|
+
end
|
51
|
+
|
52
|
+
def gen_prices_hash input_hash
|
53
|
+
|
54
|
+
raise TypeError, 'expecting a Hash object' unless input_hash.class == Hash
|
55
|
+
unless input_hash.has_key? 'prices'
|
56
|
+
msg = "input_hash must be at the one level above the point where 'prices' is a key in the JSON hash"
|
57
|
+
raise KeyError, msg
|
58
|
+
end
|
59
|
+
|
60
|
+
prices = input_hash['prices']
|
61
|
+
|
62
|
+
prices.inject({}) do |hash, (key, val)|
|
63
|
+
quality = BackpackTF::ItemPrice.qualities[key.to_i]
|
64
|
+
new_key = [quality.to_s]
|
65
|
+
|
66
|
+
tradability = val.keys.first
|
67
|
+
new_key << tradability
|
68
|
+
|
69
|
+
craftability = prices[key][tradability].keys.first
|
70
|
+
new_key << craftability
|
71
|
+
|
72
|
+
new_key = new_key.join('_')
|
73
|
+
|
74
|
+
prefix = prices[key][tradability][craftability]
|
75
|
+
|
76
|
+
if prefix.class == Array
|
77
|
+
item_prices = prefix.first
|
78
|
+
item_price_obj = ItemPrice.new(new_key, item_prices)
|
79
|
+
hash[new_key] = item_price_obj
|
80
|
+
elsif prefix.class == Hash
|
81
|
+
if prefix.keys.length <= 1
|
82
|
+
item_prices = prefix.values[0]
|
83
|
+
item_price_obj = ItemPrice.new(new_key, item_prices)
|
84
|
+
hash[new_key] = item_price_obj
|
85
|
+
else
|
86
|
+
prefix.keys.each do |prefix_key|
|
87
|
+
temp_key = "#{new_key}_Effect ##{prefix_key.to_i}"
|
88
|
+
item_prices = prefix[prefix_key]
|
89
|
+
item_price_obj = ItemPrice.new(temp_key, item_prices, prefix_key)
|
90
|
+
hash[new_key] = item_price_obj
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
hash
|
96
|
+
end
|
16
97
|
end
|
17
98
|
|
18
99
|
end
|
@@ -2,62 +2,81 @@ module BackpackTF
|
|
2
2
|
|
3
3
|
class ItemPrice
|
4
4
|
|
5
|
-
|
6
|
-
:currency, :value, :value_high, :value_raw, :value_high_raw,
|
7
|
-
:last_update, :difference
|
5
|
+
include BackpackTF::Finder
|
8
6
|
|
9
|
-
|
7
|
+
# @return [String] the quality of the item being priced, converted to String
|
8
|
+
attr_reader :quality
|
9
|
+
# @return [Symbol] either :Tradable or :'Non-Tradable'
|
10
|
+
attr_reader :tradability
|
11
|
+
# @return [Symbol] either :Craftable or :'Non-Craftable'
|
12
|
+
attr_reader :craftability
|
13
|
+
# @return [NilClass or Fixnum] Primarily used to signify crate series or unusual effect. Otherwise, this is 0
|
14
|
+
attr_reader :priceindex
|
15
|
+
# @return [Symbol] The currency that the item's price is based on
|
16
|
+
attr_reader :currency
|
17
|
+
# @return [Float] The value of the item in said currency
|
18
|
+
attr_reader :value
|
19
|
+
# @return [Float] The item's upper value measured in said currency. only set if the item has a price range
|
20
|
+
attr_reader :value_high
|
21
|
+
# @return [Float] The item's value in the lowest currency without rounding. If raw is set to 2, this is the lower value if a high value exists. Otherwise, this is the average between the high and low value. Requires raw to be enabled.
|
22
|
+
attr_reader :value_raw
|
23
|
+
# @return [Float] The item's value in the lowest currency without rounding. Reques raw to be enabled and set to 2
|
24
|
+
attr_reader :value_high_raw
|
25
|
+
# @return [Fixnum] A timestamp of when the price was last updated
|
26
|
+
attr_reader :last_update
|
27
|
+
# @return [Fixnum] A relative difference between the former price and the current price. If 0, assume new price.
|
28
|
+
attr_reader :difference
|
29
|
+
|
30
|
+
def initialize key, attr, priceindex = nil
|
31
|
+
attr = JSON.parse(attr) unless attr.class == Hash
|
32
|
+
unless self.class.required_keys.all? {|k| attr.keys.member? k }
|
33
|
+
raise KeyError, "The passed-in hash is required to have at least these 4 keys: #{self.class.required_keys.join(', ')}"
|
34
|
+
end
|
35
|
+
|
36
|
+
key_split = key.split('_')
|
37
|
+
|
38
|
+
@priceindex = priceindex
|
39
|
+
|
40
|
+
@quality = key_split[0].to_sym
|
41
|
+
@tradability = key_split[1].to_sym
|
42
|
+
@craftability = key_split[2].to_sym
|
43
|
+
@currency = attr['currency'].to_sym
|
44
|
+
@value = attr['value']
|
45
|
+
@value_high = attr['value_high']
|
46
|
+
@value_raw = attr['value_raw']
|
47
|
+
@value_high_raw = attr['value_high_raw']
|
48
|
+
@last_update = attr['last_update']
|
49
|
+
@difference = attr['difference']
|
10
50
|
end
|
11
51
|
|
52
|
+
@@required_keys = %w(currency value last_update difference)
|
53
|
+
def self.required_keys; @@required_keys; end
|
54
|
+
|
12
55
|
# mapping official API quality integers to quality names
|
13
56
|
# https://wiki.teamfortress.com/wiki/WebAPI/GetSchema#Result_Data
|
14
57
|
@@qualities = [
|
15
|
-
|
16
|
-
|
58
|
+
:Normal,
|
59
|
+
:Genuine,
|
17
60
|
nil,
|
18
|
-
|
61
|
+
:Vintage,
|
19
62
|
nil,
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
63
|
+
:Unusual,
|
64
|
+
:Unique,
|
65
|
+
:Community,
|
66
|
+
:Valve,
|
67
|
+
:"Self-Made",
|
25
68
|
nil,
|
26
|
-
|
69
|
+
:Strange,
|
27
70
|
nil,
|
28
|
-
|
29
|
-
"Collector's"
|
71
|
+
:Haunted,
|
72
|
+
:"Collector's"
|
30
73
|
]
|
31
74
|
|
32
|
-
|
33
|
-
@@craftabilities = [:Craftable, :Uncraftable]
|
34
|
-
|
35
|
-
# returns JSON data for the item
|
36
|
-
# does not return data for items with a special particle effect
|
37
|
-
def self.get_item_price quality, item_name
|
38
|
-
item = find_item_by_name(item_name)
|
39
|
-
ind = @@qualities.find_index(quality)
|
40
|
-
|
41
|
-
prefix = item['prices'][ind.to_s]['Tradable']
|
42
|
-
if prefix.nil?
|
43
|
-
raise(ArgumentError, "The item, #{quality} #{item_name}, is not Tradable")
|
44
|
-
end
|
45
|
-
prefix = prefix['Craftable']
|
46
|
-
if prefix.nil?
|
47
|
-
raise(ArgumentError, "The item, #{quality} #{item_name}, is not Craftable")
|
48
|
-
end
|
49
|
-
|
50
|
-
# oddly, there are cases (such as the "Lugermorph"), where the
|
51
|
-
# type of the object at this point in the JSON data (saved to the `prefix` variable)
|
52
|
-
# is a Hash object rather than an Array object.
|
53
|
-
# That makes the PriceIndex key a String, "0", rather than a Fixnum, 0.
|
54
|
-
if prefix[0].nil?
|
55
|
-
prefix[0.to_s]
|
56
|
-
else
|
57
|
-
prefix[0]
|
58
|
-
end
|
59
|
-
end
|
75
|
+
def self.qualities; @@qualities; end
|
60
76
|
|
77
|
+
@@tradabilities = [:Tradable, :'Non-Tradable']
|
78
|
+
@@craftabilities = [:Craftable, :'Non-Craftable']
|
79
|
+
|
61
80
|
end
|
62
81
|
|
63
82
|
end
|
data/lib/backpack_tf/prices.rb
CHANGED
@@ -2,66 +2,45 @@ module BackpackTF
|
|
2
2
|
|
3
3
|
# ruby representations of a JSON response to
|
4
4
|
# `IGetPrices`['response']
|
5
|
-
class Prices
|
5
|
+
class Prices < Response
|
6
6
|
|
7
|
-
include BackpackTF::
|
7
|
+
include BackpackTF::Finder
|
8
8
|
|
9
|
-
|
9
|
+
INTERFACE = :IGetPrices
|
10
|
+
@interface = INTERFACE
|
11
|
+
@response = nil
|
12
|
+
@@items = nil
|
10
13
|
|
11
|
-
def self.
|
12
|
-
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.defindex_to_item_name defindex
|
16
|
-
items = get_items_hash
|
17
|
-
keys = items.keys#.shuffle
|
18
|
-
|
19
|
-
i = 0
|
20
|
-
while i < keys.length
|
21
|
-
current_defindex = items[keys[i]]['defindex']
|
22
|
-
if(current_defindex[0] == defindex)
|
23
|
-
return keys[i]
|
24
|
-
end
|
25
|
-
i += 1
|
26
|
-
end
|
27
|
-
raise KeyError, "item with a defindex of #{defindex} was not found"
|
14
|
+
def self.response
|
15
|
+
@response = superclass.responses[to_sym]
|
28
16
|
end
|
29
17
|
|
30
|
-
def self.
|
31
|
-
items
|
32
|
-
|
33
|
-
end
|
34
|
-
|
35
|
-
# returns JSON representation of pricing for the item
|
36
|
-
def self.find_item_by_name item_name
|
37
|
-
items = get_items_hash
|
38
|
-
if items[item_name].nil?
|
39
|
-
raise KeyError, "item with the name #{item_name} was not found"
|
18
|
+
def self.items
|
19
|
+
if @@items.nil?
|
20
|
+
gen_items
|
40
21
|
else
|
41
|
-
items
|
22
|
+
@@items
|
42
23
|
end
|
43
24
|
end
|
44
25
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
def self.is_item_of_type? item_name, type = :weapon
|
49
|
-
item = find_item_by_name(item_name)
|
50
|
-
defindex = item['defindex'][0]
|
51
|
-
tf2_item = Trade.tf2_item_schema.items[defindex]
|
26
|
+
def self.gen_items
|
27
|
+
@@items = @response[:items].inject({}) do |items, (name)|
|
28
|
+
defindex = @response[:items][name]['defindex'][0]
|
52
29
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
tf2_item[:item_slot] == 'melee'
|
30
|
+
if defindex.nil? || defindex < 0
|
31
|
+
items
|
32
|
+
else
|
33
|
+
items[name] = Item.new(name, @response[:items][name])
|
34
|
+
items
|
35
|
+
end
|
60
36
|
end
|
61
37
|
end
|
62
38
|
|
63
39
|
def initialize
|
64
|
-
msg = "This class is meant to receive the JSON response from the #{self.class.interface} interface.
|
40
|
+
msg = "This class is meant to receive the JSON response from the #{self.class.interface} interface."
|
41
|
+
msg << "It holds a Hash array of prices of items, but not is meant to be instantiated."
|
42
|
+
msg << "See the Item class if you are interested in an item."
|
43
|
+
msg << "However, information on items should be stored in the @items property of #{self.class}."
|
65
44
|
raise RuntimeError, msg
|
66
45
|
end
|
67
46
|
|
data/lib/backpack_tf/response.rb
CHANGED
@@ -1,43 +1,48 @@
|
|
1
1
|
module BackpackTF
|
2
|
-
|
2
|
+
class Response
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
############################
|
5
|
+
# CLASS METHODS
|
6
|
+
############################
|
7
|
+
|
8
|
+
def self.interface; @interface; end
|
9
|
+
|
10
|
+
def self.to_sym
|
11
|
+
self.name.to_sym
|
8
12
|
end
|
9
13
|
|
10
|
-
|
14
|
+
@responses = {}
|
11
15
|
|
12
|
-
|
13
|
-
|
16
|
+
def self.responses key_val = nil
|
17
|
+
unless key_val.nil?
|
18
|
+
key_val = { key_val => nil } unless key_val.class == Hash
|
19
|
+
key = key_val.keys.first
|
20
|
+
val = key_val.values.first
|
14
21
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
@response ||= fetch
|
23
|
-
end
|
22
|
+
if val.nil?
|
23
|
+
@responses[key]
|
24
|
+
elsif key == :reset && val == :confirm
|
25
|
+
@responses = {}
|
26
|
+
else
|
27
|
+
@responses[key] = hash_keys_to_sym(val)
|
28
|
+
end
|
24
29
|
|
25
|
-
def fetch client_stuff
|
26
|
-
@response = hash_keys_to_sym(client_stuff)
|
27
30
|
end
|
28
31
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
32
|
+
@responses
|
33
|
+
end
|
34
|
+
|
35
|
+
# checks the data type of the keys of a Hash object
|
36
|
+
# if the key is a String, then changes it to a Symbol
|
37
|
+
# otherwise, leaves it as is
|
38
|
+
def self.hash_keys_to_sym hash
|
39
|
+
hash.each_pair.inject({}) do |new_hash, (key, val)|
|
40
|
+
unless key.class == String
|
41
|
+
new_hash[key] = val
|
42
|
+
else
|
43
|
+
new_hash[key.to_sym] = val
|
40
44
|
end
|
45
|
+
new_hash
|
41
46
|
end
|
42
47
|
end
|
43
48
|
|
data/lib/backpack_tf.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'httparty'
|
2
|
-
require 'byebug'
|
3
2
|
|
4
3
|
# namespace for classes & modules inside of the wrapper for the BackpackTF API
|
5
4
|
module BackpackTF
|
@@ -7,7 +6,9 @@ module BackpackTF
|
|
7
6
|
end
|
8
7
|
|
9
8
|
# IMPORTANT! require the Response module before any other class or module
|
9
|
+
require 'backpack_tf/version'
|
10
10
|
require 'backpack_tf/response'
|
11
|
+
require 'backpack_tf/finder'
|
11
12
|
require 'backpack_tf/client'
|
12
13
|
require 'backpack_tf/currencies'
|
13
14
|
require 'backpack_tf/item'
|