steam-trade 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c75d03399a096ddb7e68a6448c37ab5265f307d8
4
+ data.tar.gz: 032e2ec9c6d382c5cea3b394026f714c1ef3ad93
5
+ SHA512:
6
+ metadata.gz: c7e7a5f5fe23cccc2ec4caf4bb1dad525bbbed6f52aff2f082c0eba1d6ce2cf0027d88dd47493a7ba688fd739759f9182cdcd3a1652a9f96d275004b1b0c741d
7
+ data.tar.gz: 222366d1f7da9df8d3730602edd6b807c103dbaeb98b20314309a9dc4f23445588d6f815b983aabd89f46f4d00219f29a536fcbc8fe15fcb55db03234ff439b5
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+ *gem
10
+ git.txt
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in steam-trade.gemspec
6
+ gemspec
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2018 Adam Boulila
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,51 @@
1
+ # steam-trade
2
+
3
+ This gem simplifes/allows sending steam trade offers programmatically
4
+
5
+ ## Installation
6
+ in your commandline :
7
+
8
+ `gem install steam-trade`
9
+
10
+ ## Usage
11
+ First you need to require the gem:
12
+ ```ruby
13
+ require 'steam-trade'
14
+ ```
15
+
16
+ then you need to login and optionally set your shared_secret and identity_secret:
17
+ - `shared_secret` is used to generate steam authentication codes so you won't have to write them manually each time you login.
18
+ - `identity_secret` is used to confirm trade offers automatically.
19
+ ```ruby
20
+ require 'steam-trade'
21
+
22
+ account = Handler.new('username','password','shared_secret') # share secret is optional
23
+ #username and password are required, shared_secret is optional
24
+
25
+
26
+ account.mobile_info('identity_secret')
27
+ #identity_secret is requred
28
+
29
+ ```
30
+
31
+ then you can send your offer
32
+ - `Myarray` is an array which contains hashes of selected items to send in the offer. (currently you must get this alone)
33
+ - `Theirarray` is an array which contains hashes of selected items to receive in the offer. (currently you must get this alone)
34
+ - `trade_offer_link` is the trade link of you partner `ex: https://steamcommunity.com/tradeoffer/new/?partner=410155236&token=H-yK-GFt`
35
+ - `message` is the comment you want to include in the trade offer
36
+
37
+ - `Myarray`, `Theirarray`, `trade_offer_link` are required, `message` is optional
38
+ ```ruby
39
+ require 'steam-trade'
40
+
41
+ account = Handler.new('username','password','shared_secret')
42
+ account.mobile_info('identity_secret')
43
+
44
+
45
+ account.send_offer(Myarray,Theirarray,trade_offer_link,message)
46
+ ```
47
+
48
+
49
+ ## License
50
+
51
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+ task :default => :spec
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+
3
+
4
+
5
+ # You can add fixtures and/or initialization code here to make experimenting
6
+ # with your gem easier. You can also use a different console, if you like.
7
+
8
+ # (If you use this, don't forget to add pry to your Gemfile!)
9
+ # require "pry"
10
+ # Pry.start
11
+
12
+ require "irb"
13
+ IRB.start(__FILE__)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,106 @@
1
+ require 'Guard.rb'
2
+
3
+
4
+ module ConfirmationCommands
5
+ include GuardCommands
6
+
7
+
8
+
9
+
10
+ def send_trade_allow_request(trade_id) ###FIRST
11
+ confirmations = get_confirmations() ###second
12
+ confirmationhash = select_trade_offer_confirmation(trade_id, confirmations) #seventh
13
+ send_confirmation(confirmationhash) #tenth
14
+ end
15
+
16
+ private
17
+ def get_confirmations() ##SECOND
18
+ confirmations = []
19
+ confirmations_page = fetch_confirmations_page()
20
+ Nokogiri::HTML(confirmations_page).css('#mobileconf_list').css('.mobileconf_list_entry').each { |trade|
21
+ add = {
22
+ 'id' => trade['id'].sub('conf', ''),
23
+ 'data_confid' => trade['data-confid'],
24
+ 'data_key' => trade['data-key']
25
+ }
26
+ confirmations << add
27
+ }
28
+ return confirmations
29
+ end
30
+
31
+ def create_confirmation_params(tag_string) #FOURTH FINISHED
32
+ timestamp = Time.new.to_i
33
+ confirmation_key = generate_confirmation_key(tag_string,timestamp) # FIFTH other FILE FINISHED
34
+ android_id = generate_device_id() # SIXTH other FILE FINISHED
35
+ res = {
36
+ 'p' => android_id,
37
+ 'a' => @steamid,
38
+ 'k' => confirmation_key,
39
+ 't' => timestamp,
40
+ 'm' => 'android',
41
+ 'tag' => tag_string
42
+ }
43
+ return res
44
+ end
45
+
46
+ def fetch_confirmations_page() ## THIRD FINISHED
47
+ tag = 'conf'
48
+ params = create_confirmation_params(tag) ## FOURTH FIISHED
49
+ headers = {'X-Requested-With' => 'com.valvesoftware.android.steam.community'}
50
+ #@session.pre_connect_hooks << lambda do |agent, request|
51
+ # request['X-Requested-With'] = 'com.valvesoftware.android.steam.community'
52
+ #end
53
+ no = nil
54
+ response = @session.get('https://steamcommunity.com/mobileconf/conf', params, no, headers)
55
+ html = response.content
56
+ if html.include?('Steam Guard Mobile Authenticator is providing incorrect Steam Guard codes.')
57
+ puts "invalid steammguard"
58
+ exit
59
+ end
60
+ return html
61
+ end
62
+
63
+
64
+
65
+
66
+ def select_trade_offer_confirmation(trade_id, confirmations) ## seventh
67
+ confirmations.each { |confirmhash|
68
+ confirmation_details_page = fetch_confirmation_details_page(confirmhash) ## eighteth
69
+ confirm_id = get_confirmation_trade_offer_id(confirmation_details_page) ## nineth
70
+ if confirm_id == trade_id
71
+ return confirmhash
72
+ end
73
+ }
74
+ puts "did not find a confirmation"
75
+ exit
76
+ end
77
+
78
+ def fetch_confirmation_details_page(hash) ##eigth
79
+ var = hash['id']
80
+ tag = 'details' + var
81
+ params = create_confirmation_params(tag) ## EXISTS
82
+ response = @session.get("https://steamcommunity.com/mobileconf/details/#{var}", params)
83
+ return JSON.parse(response.content)["html"]
84
+ end
85
+
86
+ def get_confirmation_trade_offer_id(html) ## nineth
87
+ full_offer_id = Nokogiri::HTML(html).css('.tradeoffer')[0]['id']
88
+ return full_offer_id.split('_', 2)[1]
89
+ end
90
+
91
+ def send_confirmation(confirmationhash) ## tenth
92
+ tag = 'allow'
93
+ params = create_confirmation_params(tag) ## EXISTS
94
+ params['op'] = tag
95
+ params['cid'] = confirmationhash["data_confid"]
96
+ params['ck'] = confirmationhash["data_key"]
97
+ headers = {'X-Requested-With' => 'XMLHttpRequest'}
98
+ #@session.pre_connect_hooks << lambda do |agent, request|
99
+ # request['X-Requested-With'] = 'XMLHttpRequest'
100
+ #end
101
+ no = nil
102
+ page = @session.get('https://steamcommunity.com/mobileconf/ajaxop', params,no ,headers)
103
+ return JSON.parse(page.content)
104
+ end
105
+
106
+ end
@@ -0,0 +1,44 @@
1
+ module GuardCommands
2
+
3
+
4
+
5
+
6
+
7
+ def fa()
8
+ timestamp = Time.new.to_i
9
+ math = timestamp / 30
10
+ math = math.to_i
11
+ time_buffer =[math].pack('Q>')
12
+
13
+ hmac = OpenSSL::HMAC.digest('sha1', Base64.decode64(@secret), time_buffer)
14
+
15
+ start = hmac[19].ord & 0xf
16
+ last = start + 4
17
+ pre = hmac[start..last]
18
+ fullcode = pre.unpack('I>')[0] & 0x7fffffff
19
+
20
+ chars = '23456789BCDFGHJKMNPQRTVWXY'
21
+ code= ''
22
+ for looper in 0..4 do
23
+ copy = fullcode #divmod
24
+ i = copy % chars.length #divmod
25
+ fullcode = copy / chars.length #divmod
26
+ code = code + chars[i]
27
+ end
28
+ return code
29
+
30
+ end
31
+
32
+ def generate_confirmation_key(tag_string, time_stamp)
33
+ buffer = [time_stamp].pack('Q>') + tag_string.encode('ascii')
34
+ return Base64.encode64(OpenSSL::HMAC.digest('sha1', Base64.decode64(@identity_secret), buffer))
35
+ end
36
+
37
+
38
+ def generate_device_id()
39
+ hexed = Digest::SHA1.hexdigest(@steamid.to_s)
40
+ res = 'android:' + [hexed[0..7],hexed[8..11],hexed[12..15],hexed[16..19],hexed[20..31]].join('-')
41
+ return res
42
+ end
43
+
44
+ end
@@ -0,0 +1,99 @@
1
+ module LoginCommands
2
+
3
+ ########################################################################################
4
+ def login
5
+ data = pass_stamp()
6
+ encrypted_password = data["password"]
7
+ timestamp = data["timestamp"]
8
+ repeater = 0
9
+ until repeater == true
10
+ if @secret != nil
11
+ guardcode = fa()
12
+ else
13
+ puts "please write your 2FA code"
14
+ guardcode = gets.chomp
15
+ end
16
+
17
+
18
+ send = {
19
+ 'password' => encrypted_password,
20
+ 'username' => @username,
21
+ 'twofactorcode' =>guardcode, #update
22
+ 'emailauth' => '',
23
+ 'loginfriendlyname' => '',
24
+ 'captchagid' => '-1',
25
+ 'captcha_text' => '',
26
+ 'emailsteamid' => '',
27
+ 'rsatimestamp' => timestamp,
28
+ 'remember_login' => 'false'
29
+ }
30
+
31
+ login = @session.post('https://store.steampowered.com/login/dologin', send )
32
+ response = JSON::parse(login.body)
33
+
34
+ if response["success"] == true
35
+ repeater = true
36
+ puts response
37
+ elsif repeater == 3
38
+ puts "Could not login"
39
+ puts "exiting"
40
+ exit
41
+ else
42
+ puts "re-trying to login"
43
+ puts "sleeping for 6 seconds"
44
+ sleep(6)
45
+ repeater = repeater + 1
46
+ end
47
+
48
+
49
+ end
50
+ if @steamid != nil && @steamid != response["transfer_parameters"]["steamid"]
51
+ puts "the steamid you provided does not belong to the account you entered"
52
+ puts "steamid will be overwritten"
53
+ @steamid = response["transfer_parameters"]["steamid"]
54
+
55
+ else
56
+ @steamid = response["transfer_parameters"]["steamid"]
57
+ end
58
+
59
+
60
+ response["transfer_urls"].each { |url|
61
+ @session.post(url, response["transfer_parameters"])
62
+ }
63
+
64
+
65
+
66
+ steampowered_sessionid = ''
67
+ @session.cookies.each { |c|
68
+ if c.name == "sessionid"
69
+ steampowered_sessionid = c.value
70
+ end
71
+ }
72
+
73
+ cookie = Mechanize::Cookie.new :domain => 'steamcommunity.com', :name =>'sessionid', :value =>steampowered_sessionid, :path => '/'
74
+ @session.cookie_jar << cookie
75
+ puts "logged-in with steamid: #{@steamid}"
76
+ end
77
+ ########################################################################################
78
+
79
+
80
+ ########################################################################################
81
+ private
82
+ def pass_stamp()
83
+ response = @session.post('https://store.steampowered.com/login/getrsakey/', {'username' => @username})
84
+
85
+ data = JSON::parse(response.body)
86
+ mod = data["publickey_mod"].hex
87
+ exp = data["publickey_exp"].hex
88
+ timestamp = data["timestamp"]
89
+
90
+ key = OpenSSL::PKey::RSA.new
91
+ key.e = OpenSSL::BN.new(exp)
92
+ key.n = OpenSSL::BN.new(mod)
93
+ ep = Base64.encode64(key.public_encrypt(@password.force_encoding("utf-8"))).gsub("\n", '')
94
+ return {'password' => ep, 'timestamp' => timestamp }
95
+ end
96
+ ########################################################################################
97
+
98
+
99
+ end
@@ -0,0 +1,50 @@
1
+ module Abilites
2
+ ########################################################################################
3
+ def copy_session
4
+ return @session
5
+ end
6
+ ########################################################################################
7
+ def overwrite_session(new_session)
8
+ if new_session.class == Mechanize
9
+ @session = new_session
10
+ end
11
+ end
12
+ ########################################################################################
13
+ def sessionid_cookie()
14
+ value = nil
15
+ begin
16
+ value = @session.cookie_jar.jar["steamcommunity.com"]["/"]["sessionid"].value
17
+ rescue
18
+ value = nil
19
+ end
20
+ if value == nil
21
+ begin
22
+ @session.cookie_jar.jar["store.steampowered.com"]["/"]["sessionid"].value
23
+ rescue
24
+ value = nil
25
+ end
26
+ end
27
+
28
+ if value == nil
29
+ @session.cookies.each { |c|
30
+ if c.name == "sessionid"
31
+ value = c.value
32
+ end
33
+ }
34
+ end
35
+ return value
36
+ end
37
+
38
+
39
+
40
+ private
41
+ def partner_id_to_steam_id(account_id)
42
+ unknown_constant = 17825793 # or 0x1100001 idk wtf is this but ....
43
+ first_bytes = [account_id.to_i].pack('i>')
44
+ last_bytes = [unknown_constant].pack('i>')
45
+ collect = last_bytes + first_bytes
46
+ return collect.unpack('Q>')[0].to_s
47
+ end
48
+
49
+
50
+ end
@@ -0,0 +1,73 @@
1
+ module TradeCommands
2
+
3
+
4
+ def clean_items(items)
5
+ items.each { |t|
6
+ t["amount"] = t["amount"].to_i
7
+ t.delete_if {|k,v| k != 'appid' && k != 'contextid' && k != 'assetid' && k != "amount"}
8
+ }
9
+ return items
10
+ end
11
+
12
+
13
+ def send_offer(mine, they, link, message = '')
14
+ partner_raw = link.split('partner=',2)[1].split('&',2)[0]
15
+
16
+
17
+ token = link.split('token=', 2)[1]
18
+
19
+
20
+ theirs = clean_items(they)
21
+
22
+
23
+ me = clean_items(mine)
24
+
25
+ partner_steamid = partner_id_to_steam_id(partner_raw)
26
+
27
+
28
+ sessionid = sessionid_cookie()
29
+
30
+ params = {
31
+ 'sessionid' => sessionid,
32
+ 'serverid' => 1,
33
+ 'partner' => partner_steamid,
34
+ 'tradeoffermessage' => message,
35
+ 'json_tradeoffer' => {
36
+ "newversion" => true,
37
+ "version" => 4,
38
+ "me" => {
39
+ "assets" => mine, #create this array
40
+ "currency" => [],
41
+ "ready" => false
42
+ },
43
+ "them" => {
44
+ "assets" => theirs, #create this array
45
+ "currency" => [],
46
+ "ready" => false
47
+ }
48
+ }.to_json, ###ADDED TO JSON FIX
49
+ 'captcha' => '',
50
+ 'trade_offer_create_params' => {'trade_offer_access_token' => token}.to_json ## ADDED TO JSON FIX
51
+ }
52
+
53
+ send = @session.post(
54
+ 'https://steamcommunity.com/tradeoffer/new/send',
55
+ params,
56
+ {'Referer' => 'https://steamcommunity.com/tradeoffer/new', 'Origin' => 'https://steamcommunity.com'}
57
+ )
58
+ response = JSON.parse(send.body)
59
+ puts "trade offer sent" + response["tradeofferid"])
60
+ if response["needs_mobile_confirmation"] == true
61
+ if @identity_secret != nil && @steamid != nil
62
+ responsehash = response.merge(send_trade_allow_request(response["tradeofferid"]))
63
+ puts "offer confirmed" + response["tradeofferid"])
64
+ else
65
+ puts "cannot confirm trade automatically, informations missing"
66
+ puts "Please confirm the trade offer manually #{response["tradeofferid"]} "
67
+ end
68
+ end
69
+
70
+ end
71
+
72
+
73
+ end
@@ -0,0 +1,42 @@
1
+ require 'mechanize'
2
+ require 'json'
3
+ require 'openssl'
4
+ require 'base64'
5
+
6
+ require 'LoginExecutor.rb'
7
+ require 'Misc.rb'
8
+ require 'Trade.rb'
9
+ require 'Confirmation.rb'
10
+ require 'Trade.rb'
11
+
12
+ class Handler
13
+ include LoginCommands
14
+ include TradeCommands
15
+ include ConfirmationCommands
16
+ include GuardCommands
17
+ include Abilites
18
+
19
+ def initialize(username,password,secret = nil)
20
+ @username = username
21
+ @password = password
22
+ @secret = secret
23
+
24
+ @steamid = nil # will be initialized once you login and can be initialized with mobile_info
25
+ @identity_secret = nil # can and should be initialized using mobile_info
26
+ @confirmator = nil # will be initialized once steamid and identity secret are set
27
+
28
+ @session = Mechanize.new { |agent|
29
+ agent.user_agent_alias = 'Windows Mozilla'
30
+ agent.follow_meta_refresh = true
31
+ }
32
+ login
33
+ end
34
+
35
+ def mobile_info(identity_secret, steamid = nil)
36
+ @identity_secret = identity_secret
37
+ if @steamid == nil && steamid != nil
38
+ @steamid = steamid
39
+ end
40
+ end
41
+
42
+ end
@@ -0,0 +1,30 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "steam-trade"
8
+ spec.version = '0.0.2'
9
+ spec.date = '2018-04-21'
10
+ spec.authors = ["OmG3r"]
11
+ spec.email = ["adam.boulila@live.fr"]
12
+ spec.files = Dir['lib/ *.rb'] + Dir['bin/*']
13
+ spec.summary = %q{Manage steam trading offers. }
14
+ spec.description = %q{Send steam trading offers, generate steam 2FA codes, confirm steam trade offers}
15
+ spec.homepage = "https://github.com/OmG3r/steam-trade/"
16
+ spec.license = "MIT"
17
+
18
+
19
+
20
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
21
+ f.match(%r{^(test|spec|features)/})
22
+ end
23
+ spec.bindir = "exe"
24
+ spec.executables = []
25
+ spec.require_paths = ["lib"]
26
+
27
+ spec.add_development_dependency "bundler", "~> 1.16"
28
+ spec.add_development_dependency "rake", "~> 10.0"
29
+ spec.add_runtime_dependency "mechanize", '~> 2.7', '>= 2.7.0'
30
+ end
metadata ADDED
@@ -0,0 +1,107 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: steam-trade
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - OmG3r
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-04-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.16'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.16'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: mechanize
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.7'
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: 2.7.0
51
+ type: :runtime
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: '2.7'
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 2.7.0
61
+ description: Send steam trading offers, generate steam 2FA codes, confirm steam trade
62
+ offers
63
+ email:
64
+ - adam.boulila@live.fr
65
+ executables: []
66
+ extensions: []
67
+ extra_rdoc_files: []
68
+ files:
69
+ - ".gitignore"
70
+ - Gemfile
71
+ - LICENSE.txt
72
+ - README.md
73
+ - Rakefile
74
+ - bin/console
75
+ - bin/setup
76
+ - lib/Confirmation.rb
77
+ - lib/Guard.rb
78
+ - lib/LoginExecutor.rb
79
+ - lib/Misc.rb
80
+ - lib/Trade.rb
81
+ - lib/steam-trade.rb
82
+ - steam-trade.gemspec
83
+ homepage: https://github.com/OmG3r/steam-trade/
84
+ licenses:
85
+ - MIT
86
+ metadata: {}
87
+ post_install_message:
88
+ rdoc_options: []
89
+ require_paths:
90
+ - lib
91
+ required_ruby_version: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ required_rubygems_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ requirements: []
102
+ rubyforge_project:
103
+ rubygems_version: 2.5.2
104
+ signing_key:
105
+ specification_version: 4
106
+ summary: Manage steam trading offers.
107
+ test_files: []