backpack_tf 0.8.4 → 1.0.0.rc1
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.
- checksums.yaml +4 -4
- data/.gitignore +1 -3
- data/.rspec +2 -0
- data/.travis.yml +3 -0
- data/Gemfile +5 -3
- data/Gemfile.lock +49 -0
- data/README.md +144 -0
- data/Rakefile +7 -0
- data/backpack_tf.gemspec +2 -2
- data/lib/backpack_tf/assets/{attribute_controlled_attached_particles.json → particle_effects.json} +0 -0
- data/lib/backpack_tf/client.rb +72 -95
- data/lib/backpack_tf/currency/interface.rb +9 -0
- data/lib/backpack_tf/currency/response.rb +24 -0
- data/lib/backpack_tf/currency.rb +24 -47
- data/lib/backpack_tf/helpers.rb +29 -0
- data/lib/backpack_tf/interface.rb +29 -0
- data/lib/backpack_tf/market_price/interface.rb +9 -0
- data/lib/backpack_tf/market_price/response.rb +15 -0
- data/lib/backpack_tf/market_price.rb +25 -0
- data/lib/backpack_tf/price/interface.rb +19 -0
- data/lib/backpack_tf/price/item.rb +85 -0
- data/lib/backpack_tf/price/item_price.rb +113 -0
- data/lib/backpack_tf/price/particle_effect.rb +27 -0
- data/lib/backpack_tf/price/response.rb +38 -0
- data/lib/backpack_tf/price.rb +9 -81
- data/lib/backpack_tf/price_history/interface.rb +22 -0
- data/lib/backpack_tf/price_history/response.rb +15 -0
- data/lib/backpack_tf/price_history.rb +25 -0
- data/lib/backpack_tf/response.rb +9 -56
- data/lib/backpack_tf/special_item/interface.rb +9 -0
- data/lib/backpack_tf/special_item/response.rb +16 -0
- data/lib/backpack_tf/special_item.rb +11 -21
- data/lib/backpack_tf/user/interface.rb +18 -0
- data/lib/backpack_tf/user/response.rb +16 -0
- data/lib/backpack_tf/user.rb +10 -19
- data/lib/backpack_tf/user_listing/interface.rb +18 -0
- data/lib/backpack_tf/user_listing/response.rb +15 -0
- data/lib/backpack_tf/user_listing.rb +31 -43
- data/lib/backpack_tf/version.rb +1 -1
- data/lib/backpack_tf.rb +8 -8
- data/spec/backpack_tf/client_spec.rb +151 -101
- data/spec/backpack_tf/currency/interface_spec.rb +8 -0
- data/spec/backpack_tf/currency/response_spec.rb +41 -0
- data/spec/backpack_tf/currency_spec.rb +34 -118
- data/spec/backpack_tf/helpers_spec.rb +85 -0
- data/spec/backpack_tf/interface_spec.rb +56 -0
- data/spec/backpack_tf/market_price/interface_spec.rb +8 -0
- data/spec/backpack_tf/market_price/response_spec.rb +22 -0
- data/spec/backpack_tf/market_price_spec.rb +22 -0
- data/spec/backpack_tf/price/interface_spec.rb +27 -0
- data/spec/backpack_tf/price/item_price_spec.rb +101 -0
- data/spec/backpack_tf/price/item_spec.rb +291 -0
- data/spec/backpack_tf/price/particle_effect_spec.rb +23 -0
- data/spec/backpack_tf/price/response_spec.rb +87 -0
- data/spec/backpack_tf/price_history/interface_spec.rb +38 -0
- data/spec/backpack_tf/price_history/response_spec.rb +22 -0
- data/spec/backpack_tf/price_history_spec.rb +24 -0
- data/spec/backpack_tf/response_spec.rb +22 -108
- data/spec/backpack_tf/special_item/interface_spec.rb +8 -0
- data/spec/backpack_tf/special_item/response_spec.rb +26 -0
- data/spec/backpack_tf/special_item_spec.rb +23 -100
- data/spec/backpack_tf/user/interface_spec.rb +20 -0
- data/spec/backpack_tf/user/response_spec.rb +27 -0
- data/spec/backpack_tf/user_listing/interface_spec.rb +20 -0
- data/spec/backpack_tf/user_listing/response_spec.rb +21 -0
- data/spec/backpack_tf/user_listing_spec.rb +53 -81
- data/spec/backpack_tf/user_spec.rb +16 -83
- data/spec/fixtures/item_price_typical.json +6 -0
- data/spec/fixtures/item_price_unusual.json +7 -0
- data/spec/fixtures/item_typical.json +1 -1
- data/spec/fixtures/item_unusual.json +311 -1
- data/spec/fixtures/item_with_dual_craftability_tradability.json +59 -0
- data/spec/fixtures/market_prices.json +1 -0
- data/spec/fixtures/price_history.json +1 -0
- data/spec/fixtures/prices.json +80 -1
- data/spec/fixtures/user_listing.json +1 -1
- data/spec/fixtures/user_listing_individual.json +51 -0
- data/spec/spec_helper.rb +12 -52
- metadata +61 -16
- data/TODO.md +0 -15
- data/lib/backpack_tf/item.rb +0 -84
- data/lib/backpack_tf/item_price.rb +0 -172
- data/readme.md +0 -96
- data/spec/backpack_tf/inherited_class_methods_spec.rb +0 -100
- data/spec/backpack_tf/item_price_spec.rb +0 -119
- data/spec/backpack_tf/item_spec.rb +0 -126
- data/spec/backpack_tf/price_spec.rb +0 -184
- data/spec/fixtures/item_without_defindex.json +0 -1
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'backpack_tf/market_price/interface'
|
2
|
+
require 'backpack_tf/market_price/response'
|
3
|
+
|
4
|
+
module BackpackTF
|
5
|
+
# Ruby representations of a JSON response to IGetMarketPrices
|
6
|
+
class MarketPrice
|
7
|
+
include Helpers
|
8
|
+
|
9
|
+
attr_reader :last_updated
|
10
|
+
attr_reader :quantity
|
11
|
+
attr_reader :value
|
12
|
+
|
13
|
+
# @param name [String] The name of the item.
|
14
|
+
# @param attr [Hash] Attributes for the item.
|
15
|
+
# @return [MarketPrice] A new MarketPrice object.
|
16
|
+
def initialize(name, attr)
|
17
|
+
attr = hash_keys_to_sym(attr)
|
18
|
+
|
19
|
+
@name = name.to_s
|
20
|
+
@last_updated = attr[:last_updated]
|
21
|
+
@quantity = attr[:quantity]
|
22
|
+
@value = attr[:value]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module BackpackTF
|
2
|
+
module Price
|
3
|
+
# Access the IGetPrices interface
|
4
|
+
class Interface < BackpackTF::Interface
|
5
|
+
class << self
|
6
|
+
attr_reader :raw, :since
|
7
|
+
end
|
8
|
+
|
9
|
+
@name = :IGetPrices
|
10
|
+
@version = 4
|
11
|
+
|
12
|
+
def self.defaults(options)
|
13
|
+
@raw = options[:raw] || nil
|
14
|
+
@since = options[:since] || nil
|
15
|
+
super(options)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module BackpackTF
|
2
|
+
module Price
|
3
|
+
# This lives inside the `@items` hash of BackpackTF::Price::Response
|
4
|
+
class Item
|
5
|
+
# @return [String] the name of item
|
6
|
+
attr_reader :item_name
|
7
|
+
# @return [Fixnum] an index number as per TF2's Item Schema
|
8
|
+
attr_reader :defindex
|
9
|
+
# @return [Hash<Fixnum, ItemPrice>] pricing information for a given item
|
10
|
+
attr_reader :prices
|
11
|
+
|
12
|
+
def initialize(item_name, attr)
|
13
|
+
@item_name = item_name
|
14
|
+
@defindex = process_defindex(attr['defindex'])
|
15
|
+
@prices = generate_prices_hash(attr)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def process_defindex(arr)
|
21
|
+
return nil if arr.length == 0
|
22
|
+
return arr[0] if arr.length == 1
|
23
|
+
arr
|
24
|
+
end
|
25
|
+
|
26
|
+
def generate_prices_hash(input_hash)
|
27
|
+
prices = input_hash['prices']
|
28
|
+
|
29
|
+
prices.each_with_object({}) do |(quality_idx), prices_acc|
|
30
|
+
tradables = prices[quality_idx]
|
31
|
+
|
32
|
+
tradables.each_key do |tradability|
|
33
|
+
craftables = tradables[tradability]
|
34
|
+
|
35
|
+
craftables.each_key do |craftability|
|
36
|
+
price_indices = craftables[craftability]
|
37
|
+
|
38
|
+
price_indices.each_key do |price_idx|
|
39
|
+
item_price_data = price_indices[price_idx]
|
40
|
+
key_str = keyname(quality_idx, tradability, craftability, price_idx)
|
41
|
+
|
42
|
+
if price_idx == '0'
|
43
|
+
build_item_price(prices_acc, key_str, item_price_data)
|
44
|
+
elsif quality_idx == '5'
|
45
|
+
build_unusual_item_price(prices_acc, key_str, item_price_data, price_idx)
|
46
|
+
else
|
47
|
+
build_crate_price(prices_acc, key_str, item_price_data, price_idx)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def quality_index_to_name(index)
|
56
|
+
ItemPrice.qualities[index.to_i]
|
57
|
+
end
|
58
|
+
|
59
|
+
def keyname(quality_idx, tradability, craftability, price_idx = '0')
|
60
|
+
quality = quality_index_to_name(quality_idx)
|
61
|
+
key_str = "#{quality}_#{tradability}_#{craftability}"
|
62
|
+
key_str << "_##{price_idx}" unless price_idx == '0'
|
63
|
+
key_str
|
64
|
+
end
|
65
|
+
|
66
|
+
def build_item_price(accumulation, key_str, attr)
|
67
|
+
item_price = ItemPrice.new(key_str, attr)
|
68
|
+
accumulation[key_str] = item_price
|
69
|
+
accumulation
|
70
|
+
end
|
71
|
+
|
72
|
+
def build_unusual_item_price(accumulation, key_str, attr, price_idx)
|
73
|
+
item_price = ItemPrice.new(key_str, attr, price_idx)
|
74
|
+
accumulation[item_price.effect] = item_price
|
75
|
+
accumulation
|
76
|
+
end
|
77
|
+
|
78
|
+
def build_crate_price(accumulation, key_str, attr, price_idx)
|
79
|
+
item_price = ItemPrice.new(key_str, attr, price_idx)
|
80
|
+
accumulation[key_str] = item_price
|
81
|
+
accumulation
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
module BackpackTF
|
2
|
+
module Price
|
3
|
+
# Price for an individual item.
|
4
|
+
# This lives inside the `@prices` hash of a BackpackTF::Item object.
|
5
|
+
class ItemPrice
|
6
|
+
KEYNAME_DELIMITER = '_'.freeze
|
7
|
+
|
8
|
+
class << self
|
9
|
+
# @return [Array<Symbol>] maps quality integers to quality names
|
10
|
+
# see: https://wiki.teamfortress.com/wiki/WebAPI/GetSchema#Result_Data
|
11
|
+
attr_reader :qualities
|
12
|
+
# @return [Array<Symbol>] possible values for tradable
|
13
|
+
attr_reader :tradabilities
|
14
|
+
# @return [Array<Symbol>] possible values for craftable
|
15
|
+
attr_reader :craftabilities
|
16
|
+
end
|
17
|
+
|
18
|
+
@qualities = [
|
19
|
+
:Normal,
|
20
|
+
:Genuine,
|
21
|
+
nil,
|
22
|
+
:Vintage,
|
23
|
+
nil,
|
24
|
+
:Unusual,
|
25
|
+
:Unique,
|
26
|
+
:Community,
|
27
|
+
:Valve,
|
28
|
+
:"Self-Made",
|
29
|
+
nil,
|
30
|
+
:Strange,
|
31
|
+
nil,
|
32
|
+
:Haunted,
|
33
|
+
:"Collector's"
|
34
|
+
]
|
35
|
+
@tradabilities = [:Tradable, :'Non-Tradable']
|
36
|
+
@craftabilities = [:Craftable, :'Non-Craftable']
|
37
|
+
|
38
|
+
def self.quality_name_to_index(quality)
|
39
|
+
qualities.index(quality.to_sym) unless quality.nil?
|
40
|
+
end
|
41
|
+
|
42
|
+
# @return [String] item quality
|
43
|
+
attr_reader :quality
|
44
|
+
# @return [Symbol] either :Tradable or :'Non-Tradable'
|
45
|
+
attr_reader :tradability
|
46
|
+
# @return [Symbol] either :Craftable or :'Non-Craftable'
|
47
|
+
attr_reader :craftability
|
48
|
+
# @return [NilClass or Fixnum] May signify crate series or unusual effect
|
49
|
+
attr_reader :priceindex
|
50
|
+
# @return [Symbol] The currency of the item's price
|
51
|
+
attr_reader :currency
|
52
|
+
# @return [Float] The value of the item in said currency
|
53
|
+
attr_reader :value
|
54
|
+
# @return [Float] The item's upper value in said currency.
|
55
|
+
# Only set if the item has a price range
|
56
|
+
attr_reader :value_high
|
57
|
+
# @return [Float] The item's value in the lowest currency w/o rounding.
|
58
|
+
# If raw is set to 2, this is the lower value if a high value exists.
|
59
|
+
# Otherwise, this is the average between the high and low value.
|
60
|
+
# Requires raw to be enabled.
|
61
|
+
attr_reader :value_raw
|
62
|
+
# @return [Float] The item's value in the lowest currency w/o rounding.
|
63
|
+
# Requires for 'raw' to be enabled & set to 2.
|
64
|
+
attr_reader :value_high_raw
|
65
|
+
# @return [Fixnum] A timestamp of when the price was last updated
|
66
|
+
attr_reader :last_update
|
67
|
+
# @return [Fixnum] A relative difference between the former price & the
|
68
|
+
# current price. If 0, assume new price.
|
69
|
+
attr_reader :difference
|
70
|
+
# @return [String] Which particle effect, if any
|
71
|
+
attr_reader :effect
|
72
|
+
|
73
|
+
# @param key [Array], describes the quality, tradability & craftability
|
74
|
+
# of an item. For example: ['Unique', 'Tradable', 'Craftable']
|
75
|
+
# It is directly related to the path you would take to find
|
76
|
+
# the price from the `@prices` attribute of that item.
|
77
|
+
# @param attr [Hash], collection of attributes for the price
|
78
|
+
# @param priceindex [nil, Fixnum, Array], not needed unless the item is
|
79
|
+
# Unusual, a Crate, a Strangifier, a Chemistry set or has dual qualities
|
80
|
+
def initialize(key, attr, priceindex = nil)
|
81
|
+
key = split_key(key)
|
82
|
+
|
83
|
+
@quality = key[0].to_sym
|
84
|
+
@tradability = key[1].to_sym
|
85
|
+
@craftability = key[2].to_sym
|
86
|
+
@currency = currency_or_nil(attr)
|
87
|
+
@value = attr['value']
|
88
|
+
@value_high = attr['value_high']
|
89
|
+
@value_raw = attr['value_raw']
|
90
|
+
@value_high_raw = attr['value_high_raw']
|
91
|
+
@last_update = attr['last_update']
|
92
|
+
@difference = attr['difference']
|
93
|
+
@priceindex = priceindex
|
94
|
+
@effect = pick_particle_effect(priceindex)
|
95
|
+
end
|
96
|
+
|
97
|
+
private
|
98
|
+
|
99
|
+
def split_key(key)
|
100
|
+
key.split(KEYNAME_DELIMITER)
|
101
|
+
end
|
102
|
+
|
103
|
+
def currency_or_nil(attr)
|
104
|
+
curr = attr.fetch('currency', nil)
|
105
|
+
curr.to_sym unless curr.nil?
|
106
|
+
end
|
107
|
+
|
108
|
+
def pick_particle_effect(priceindex)
|
109
|
+
ParticleEffect.list[priceindex.to_i]
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module BackpackTF
|
2
|
+
module Price
|
3
|
+
# For ItemPrice objects with attached particle effects
|
4
|
+
class ParticleEffect
|
5
|
+
class << self
|
6
|
+
# @return [Hash] possible particle effects for an item
|
7
|
+
attr_reader :list
|
8
|
+
end
|
9
|
+
|
10
|
+
@key = 'attribute_controlled_attached_particles'
|
11
|
+
@file = './lib/backpack_tf/assets/particle_effects.json'
|
12
|
+
|
13
|
+
def self.read_stored_effects_info
|
14
|
+
file = File.open(@file).read
|
15
|
+
effects = JSON.parse(file)[@key]
|
16
|
+
|
17
|
+
effects.each_with_object({}) do |effect, hash|
|
18
|
+
id = effect['id']
|
19
|
+
name = effect['name']
|
20
|
+
hash[id] = name
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
@list = read_stored_effects_info
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module BackpackTF
|
2
|
+
module Price
|
3
|
+
# Process reponses from IGetPrices
|
4
|
+
class Response < BackpackTF::Response
|
5
|
+
@response = nil
|
6
|
+
@items = nil
|
7
|
+
|
8
|
+
def self.raw_usd_value
|
9
|
+
@response['raw_usd_value']
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.usd_currency
|
13
|
+
@response['usd_currency']
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.usd_currency_index
|
17
|
+
@response['usd_currency_index']
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.items
|
21
|
+
@items ||= generate_items
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.generate_items
|
25
|
+
@response['items'].each_with_object({}) do |(name), items|
|
26
|
+
defindex = @response['items'][name]['defindex'][0]
|
27
|
+
|
28
|
+
if defindex.nil? || defindex < 0
|
29
|
+
# ignore this item
|
30
|
+
else
|
31
|
+
items[name] = Item.new(name, @response['items'][name])
|
32
|
+
end
|
33
|
+
items
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/backpack_tf/price.rb
CHANGED
@@ -1,84 +1,12 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
INTERFACE = :IGetPrices
|
8
|
-
@interface = INTERFACE
|
9
|
-
@response = nil
|
10
|
-
@items = nil
|
11
|
-
|
12
|
-
############################
|
13
|
-
# CLASS METHODS
|
14
|
-
############################
|
15
|
-
|
16
|
-
def self.response
|
17
|
-
@response = superclass.responses[to_sym]
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.items opt = nil
|
21
|
-
if @items.nil?
|
22
|
-
@items = generate_items
|
23
|
-
else
|
24
|
-
@items
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def self.generate_items
|
29
|
-
@response[:items].inject({}) do |items, (name)|
|
30
|
-
defindex = @response[:items][name]['defindex'][0]
|
31
|
-
|
32
|
-
if defindex.nil? || defindex < 0
|
33
|
-
items
|
34
|
-
else
|
35
|
-
items[name] = Item.new(name, @response[:items][name])
|
36
|
-
items
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def self.find_item_by_name item_name, opt = nil
|
42
|
-
|
43
|
-
items if @items.nil?
|
44
|
-
|
45
|
-
if @items[item_name].nil?
|
46
|
-
raise KeyError, "item with the name #{item_name} was not found"
|
47
|
-
else
|
48
|
-
if opt.nil?
|
49
|
-
@items[item_name]
|
50
|
-
elsif @items[item_name].respond_to? opt
|
51
|
-
@items[item_name].public_send(opt)
|
52
|
-
else
|
53
|
-
raise KeyError, "the item, #{item_name} does not have that attribute"
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
def self.random_item opt = nil
|
59
|
-
|
60
|
-
items if @items.nil?
|
61
|
-
|
62
|
-
case opt
|
63
|
-
when :prices, :price
|
64
|
-
@items[@items.keys.sample].prices
|
65
|
-
else
|
66
|
-
@items.keys.sample
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
############################
|
71
|
-
# INSTANCE METHODS
|
72
|
-
############################
|
73
|
-
|
74
|
-
def initialize
|
75
|
-
msg = "This class is meant to receive the JSON response from the #{self.class.interface} interface."
|
76
|
-
msg << "It holds a Hash array of prices of items, but not is meant to be instantiated."
|
77
|
-
msg << "See the Item class if you are interested in an item."
|
78
|
-
msg << "However, information on items should be stored in the @items property of #{self.class}."
|
79
|
-
raise RuntimeError, msg
|
80
|
-
end
|
1
|
+
require 'backpack_tf/price/interface'
|
2
|
+
require 'backpack_tf/price/response'
|
3
|
+
require 'backpack_tf/price/item'
|
4
|
+
require 'backpack_tf/price/item_price'
|
5
|
+
require 'backpack_tf/price/particle_effect'
|
81
6
|
|
7
|
+
module BackpackTF
|
8
|
+
# Ruby representations of a JSON response to IGetPrices
|
9
|
+
module Price
|
10
|
+
include Helpers
|
82
11
|
end
|
83
|
-
|
84
12
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module BackpackTF
|
2
|
+
class PriceHistory
|
3
|
+
# Access the IGetPriceHistory interface
|
4
|
+
class Interface < BackpackTF::Interface
|
5
|
+
class << self
|
6
|
+
attr_reader :item, :quality, :tradable, :craftable, :priceindex
|
7
|
+
end
|
8
|
+
|
9
|
+
@name = :IGetPriceHistory
|
10
|
+
@version = 1
|
11
|
+
|
12
|
+
def self.defaults(options)
|
13
|
+
@item = options[:item] || nil
|
14
|
+
@quality = options[:quality] || nil
|
15
|
+
@tradable = options[:tradable] || nil
|
16
|
+
@craftable = options[:craftable] || nil
|
17
|
+
@priceindex = options[:priceindex] || nil
|
18
|
+
super(options)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module BackpackTF
|
2
|
+
class PriceHistory
|
3
|
+
# Process reponses from IGetPriceHistory
|
4
|
+
class Response < BackpackTF::Response
|
5
|
+
@response = nil
|
6
|
+
@history = []
|
7
|
+
|
8
|
+
def self.history
|
9
|
+
@history = @response['history'].map do |attr|
|
10
|
+
BackpackTF::PriceHistory.new(attr)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'backpack_tf/price_history/interface'
|
2
|
+
require 'backpack_tf/price_history/response'
|
3
|
+
|
4
|
+
module BackpackTF
|
5
|
+
# Ruby representations of a JSON response to IGetPriceHistory
|
6
|
+
class PriceHistory
|
7
|
+
include Helpers
|
8
|
+
|
9
|
+
attr_reader :value
|
10
|
+
attr_reader :value_high
|
11
|
+
attr_reader :currency
|
12
|
+
attr_reader :timestamp
|
13
|
+
|
14
|
+
# @param attr [Hash] Attributes for the price history object
|
15
|
+
# @return [PriceHistory] A new PriceHistory object.
|
16
|
+
def initialize(attr)
|
17
|
+
attr = hash_keys_to_sym(attr)
|
18
|
+
|
19
|
+
@value = attr[:value]
|
20
|
+
@value_high = attr[:value_high]
|
21
|
+
@currency = attr[:currency]
|
22
|
+
@timestamp = attr[:timestamp]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/backpack_tf/response.rb
CHANGED
@@ -1,67 +1,20 @@
|
|
1
1
|
module BackpackTF
|
2
|
+
# Base class for processing a response from a BackpackTF API
|
2
3
|
class Response
|
3
|
-
|
4
|
-
|
5
|
-
# CLASS METHODS
|
6
|
-
############################
|
7
|
-
|
8
|
-
@responses = {}
|
9
|
-
|
10
|
-
def self.interface; @interface; end
|
11
|
-
|
12
|
-
def self.to_sym
|
13
|
-
self.name.to_sym
|
14
|
-
end
|
15
|
-
|
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
|
21
|
-
|
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
|
29
|
-
|
30
|
-
end
|
31
|
-
|
32
|
-
@responses
|
4
|
+
class << self
|
5
|
+
attr_accessor :response
|
33
6
|
end
|
34
7
|
|
35
|
-
def self.
|
8
|
+
def self.success
|
9
|
+
@response['success']
|
36
10
|
end
|
37
11
|
|
38
|
-
|
39
|
-
|
40
|
-
# otherwise, leaves it as is
|
41
|
-
def self.hash_keys_to_sym hash
|
42
|
-
hash.each_pair.inject({}) do |new_hash, (key, val)|
|
43
|
-
unless key.class == String
|
44
|
-
new_hash[key] = val
|
45
|
-
else
|
46
|
-
new_hash[key.to_sym] = val
|
47
|
-
end
|
48
|
-
new_hash
|
49
|
-
end
|
12
|
+
def self.message
|
13
|
+
@response['message']
|
50
14
|
end
|
51
15
|
|
52
|
-
|
53
|
-
|
54
|
-
############################
|
55
|
-
private
|
56
|
-
def check_attr_keys attr
|
57
|
-
raise TypeError, 'pass in a Hash object' unless attr.class == Hash
|
58
|
-
|
59
|
-
unless attr.keys.all? { |k| k.class == String }
|
60
|
-
raise TypeError, 'all keys must be String object'
|
61
|
-
end
|
62
|
-
|
63
|
-
self.class.hash_keys_to_sym(attr)
|
16
|
+
def self.current_time
|
17
|
+
@response['current_time']
|
64
18
|
end
|
65
|
-
|
66
19
|
end
|
67
20
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module BackpackTF
|
2
|
+
class SpecialItem
|
3
|
+
# Process reponses from IGetSpecialItems
|
4
|
+
class Response < BackpackTF::Response
|
5
|
+
@response = nil
|
6
|
+
@items = {}
|
7
|
+
|
8
|
+
def self.items
|
9
|
+
@items = @response['items'].each_with_object({}) do |item, hash|
|
10
|
+
name = item['name']
|
11
|
+
hash[name] = BackpackTF::SpecialItem.new(name, item)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -1,23 +1,10 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
INTERFACE = :IGetSpecialItems
|
4
|
-
@interface = INTERFACE
|
5
|
-
@response = nil
|
6
|
-
@@items = {}
|
7
|
-
|
8
|
-
def self.response
|
9
|
-
@response = superclass.responses[to_sym]
|
10
|
-
end
|
1
|
+
require 'backpack_tf/special_item/interface'
|
2
|
+
require 'backpack_tf/special_item/response'
|
11
3
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
name = item['name']
|
17
|
-
hash[name] = new(name, item)
|
18
|
-
hash
|
19
|
-
end
|
20
|
-
end
|
4
|
+
module BackpackTF
|
5
|
+
# Ruby representations of a JSON response to IGetSpecialItems
|
6
|
+
class SpecialItem
|
7
|
+
include Helpers
|
21
8
|
|
22
9
|
attr_reader :name
|
23
10
|
attr_reader :item_name
|
@@ -35,8 +22,11 @@ module BackpackTF
|
|
35
22
|
attr_reader :image_url_large_orig
|
36
23
|
attr_reader :appid
|
37
24
|
|
38
|
-
|
39
|
-
|
25
|
+
# @param name [String] Name of the SpecialItem.
|
26
|
+
# @param attr [Hash] Attributes.
|
27
|
+
# @return [SpecialItem] A new SpecialItem object.
|
28
|
+
def initialize(name, attr)
|
29
|
+
attr = hash_keys_to_sym(attr)
|
40
30
|
|
41
31
|
@name = name
|
42
32
|
@item_name = attr[:item_name]
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module BackpackTF
|
2
|
+
class User
|
3
|
+
# Access the IGetUsers interface
|
4
|
+
class Interface < BackpackTF::Interface
|
5
|
+
class << self
|
6
|
+
attr_reader :steamids
|
7
|
+
end
|
8
|
+
|
9
|
+
@name = :IGetUsers
|
10
|
+
@version = 3
|
11
|
+
|
12
|
+
def self.defaults(options = {})
|
13
|
+
@steamids = options[:steamids] || nil
|
14
|
+
super(options)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module BackpackTF
|
2
|
+
class User
|
3
|
+
# Process reponses from IGetUsers
|
4
|
+
class Response < BackpackTF::Response
|
5
|
+
@response = nil
|
6
|
+
@players = {}
|
7
|
+
|
8
|
+
def self.players
|
9
|
+
hash = response['players'].each_with_object({}) do |(id, attr), h|
|
10
|
+
h[id] = BackpackTF::User.new(attr)
|
11
|
+
end
|
12
|
+
@players = hash
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|