bungie_client 1.0.1 → 1.0.2
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 +12 -14
- data/.travis.yml +5 -0
- data/CODE_OF_CONDUCT.md +0 -0
- data/Gemfile +3 -3
- data/LICENSE.txt +0 -0
- data/README.md +0 -0
- data/Rakefile +0 -0
- data/bin/console +0 -0
- data/bin/setup +0 -0
- data/bungie_client.gemspec +0 -0
- data/examples/auth_usage.rb +10 -10
- data/examples/client_usage.rb +16 -16
- data/examples/wrapper_usage.rb +12 -12
- data/lib/bungie_client.rb +0 -0
- data/lib/bungie_client/auth.rb +140 -140
- data/lib/bungie_client/client.rb +141 -141
- data/lib/bungie_client/service.rb +9 -9
- data/lib/bungie_client/services.yml +0 -0
- data/lib/bungie_client/version.rb +3 -3
- data/lib/bungie_client/wrappers/default.rb +84 -84
- data/lib/bungie_client/wrappers/user.rb +52 -52
- data/lib/underscore.rb +9 -9
- data/services_parser.rb +32 -32
- metadata +4 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: cddee81d61dac5e86b582bab7bbd51f62708dbb0
|
|
4
|
+
data.tar.gz: 9f45808e1cf534ce4a27f5c62b6e141ba06c0a19
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e99ca598bee30c274abd51bafccdfbe8edca7822721b94121dc3b787da3336a344383b8f873ce71fdb17c7f28f3a94d20efacb069966237221f75d95e1acaac0
|
|
7
|
+
data.tar.gz: 6e1730095098b89cfbcbef0aa56a5514933d5c7d779663c26773ee7a6aaea21c262c540ceeaae7bd2e359acc721634d05c0f6c87c08b04b41535b5dc239153e1
|
data/.gitignore
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
/.bundle/
|
|
2
|
-
/.yardoc
|
|
3
|
-
/
|
|
4
|
-
/
|
|
5
|
-
/
|
|
6
|
-
/
|
|
7
|
-
/
|
|
8
|
-
/
|
|
9
|
-
|
|
10
|
-
.rspec
|
|
11
|
-
.
|
|
12
|
-
.
|
|
13
|
-
*.gem
|
|
14
|
-
Gemfile.lock
|
|
1
|
+
/.bundle/
|
|
2
|
+
/.yardoc
|
|
3
|
+
/_yardoc/
|
|
4
|
+
/coverage/
|
|
5
|
+
/doc/
|
|
6
|
+
/pkg/
|
|
7
|
+
/spec/reports/
|
|
8
|
+
/tmp/
|
|
9
|
+
*.gem
|
|
10
|
+
.rspec
|
|
11
|
+
.idea
|
|
12
|
+
Gemfile.lock
|
data/.travis.yml
ADDED
data/CODE_OF_CONDUCT.md
CHANGED
|
File without changes
|
data/Gemfile
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
source 'https://rubygems.org'
|
|
2
|
-
|
|
3
|
-
gemspec
|
|
1
|
+
source 'https://rubygems.org'
|
|
2
|
+
|
|
3
|
+
gemspec
|
data/LICENSE.txt
CHANGED
|
File without changes
|
data/README.md
CHANGED
|
File without changes
|
data/Rakefile
CHANGED
|
File without changes
|
data/bin/console
CHANGED
|
File without changes
|
data/bin/setup
CHANGED
|
File without changes
|
data/bungie_client.gemspec
CHANGED
|
File without changes
|
data/examples/auth_usage.rb
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
|
2
|
-
|
|
3
|
-
require 'bungie_client'
|
|
4
|
-
|
|
5
|
-
# Get bungie cookies
|
|
6
|
-
jar = BungieClient::Auth.auth 'example@mail.com', 'example', 'psn'
|
|
7
|
-
p (jar.nil?) ? 0 : jar.cookies.length
|
|
8
|
-
|
|
9
|
-
# Check cookies and authentication
|
|
10
|
-
p BungieClient::Auth.auth_possible? (jar || [])
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
|
2
|
+
|
|
3
|
+
require 'bungie_client'
|
|
4
|
+
|
|
5
|
+
# Get bungie cookies
|
|
6
|
+
jar = BungieClient::Auth.auth 'example@mail.com', 'example', 'psn'
|
|
7
|
+
p (jar.nil?) ? 0 : jar.cookies.length
|
|
8
|
+
|
|
9
|
+
# Check cookies and authentication
|
|
10
|
+
p BungieClient::Auth.auth_possible? (jar || [])
|
data/examples/client_usage.rb
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
|
2
|
-
|
|
3
|
-
require 'bungie_client'
|
|
4
|
-
|
|
5
|
-
# init client
|
|
6
|
-
client = BungieClient::Client.new(
|
|
7
|
-
:api_key => 'YOUR_API_KEY'
|
|
8
|
-
)
|
|
9
|
-
|
|
10
|
-
# search account
|
|
11
|
-
s = client.get_response "Destiny/SearchDestinyPlayer/2/RuBAN-GT"
|
|
12
|
-
|
|
13
|
-
p s = s.first if !s.nil? && s.length == 1
|
|
14
|
-
|
|
15
|
-
# get profile with characters
|
|
16
|
-
p client.get_response "Destiny/#{s['membershipType']}/Account/#{s['membershipId']}" unless s.nil?
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
|
2
|
+
|
|
3
|
+
require 'bungie_client'
|
|
4
|
+
|
|
5
|
+
# init client
|
|
6
|
+
client = BungieClient::Client.new(
|
|
7
|
+
:api_key => 'YOUR_API_KEY'
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
# search account
|
|
11
|
+
s = client.get_response "Destiny/SearchDestinyPlayer/2/RuBAN-GT"
|
|
12
|
+
|
|
13
|
+
p s = s.first if !s.nil? && s.length == 1
|
|
14
|
+
|
|
15
|
+
# get profile with characters
|
|
16
|
+
p client.get_response "Destiny/#{s['membershipType']}/Account/#{s['membershipId']}" unless s.nil?
|
data/examples/wrapper_usage.rb
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
|
2
|
-
|
|
3
|
-
require 'bungie_client'
|
|
4
|
-
|
|
5
|
-
# init client
|
|
6
|
-
@user = BungieClient::Wrappers::User.new(
|
|
7
|
-
:api_key => 'YOUR_API_KEY',
|
|
8
|
-
:display_name => 'RuBAN-GT',
|
|
9
|
-
:membership_type => '2'
|
|
10
|
-
)
|
|
11
|
-
|
|
12
|
-
p @user.get_bungie_account.keys
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
|
2
|
+
|
|
3
|
+
require 'bungie_client'
|
|
4
|
+
|
|
5
|
+
# init client
|
|
6
|
+
@user = BungieClient::Wrappers::User.new(
|
|
7
|
+
:api_key => 'YOUR_API_KEY',
|
|
8
|
+
:display_name => 'RuBAN-GT',
|
|
9
|
+
:membership_type => '2'
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
p @user.get_bungie_account.keys
|
data/lib/bungie_client.rb
CHANGED
|
File without changes
|
data/lib/bungie_client/auth.rb
CHANGED
|
@@ -1,140 +1,140 @@
|
|
|
1
|
-
# Module Auth with two methods: authentication in bungie.net by PSN or Xbox Live and checking this authentication with cookies that was returned early.
|
|
2
|
-
module BungieClient::Auth
|
|
3
|
-
class << self
|
|
4
|
-
# Check cookies for private requests
|
|
5
|
-
#
|
|
6
|
-
# @param [Array] cookies with [HTTP::Cookie]
|
|
7
|
-
# @param [Boolean] raise cookie errors
|
|
8
|
-
#
|
|
9
|
-
# @return [Boolean]
|
|
10
|
-
def valid_cookies?(cookies, raise = false)
|
|
11
|
-
if cookies.is_a? Mechanize::CookieJar
|
|
12
|
-
cookies = cookies.cookies
|
|
13
|
-
elsif !(cookies.is_a?(Array) && cookies.all? { |c| c.is_a? HTTP::Cookie })
|
|
14
|
-
raise "Wrong cookie option: It must be Array with HTTP::Cookie elements or CookieJar." if raise
|
|
15
|
-
|
|
16
|
-
return false
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
needed = %w(bungled bungleatk bungles)
|
|
20
|
-
cookies.each do |cookie|
|
|
21
|
-
if needed.include?(cookie.name) && cookie.expired? == false
|
|
22
|
-
needed.delete cookie.name
|
|
23
|
-
|
|
24
|
-
return true if needed.length == 0
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
(raise) ? raise("Your argument doesn't have all needed cookies for private requests #{needed.join ','}.") : false
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
# Full authentication of user
|
|
32
|
-
#
|
|
33
|
-
# @param [String] username user email for auth
|
|
34
|
-
# @param [String] password user password for auth
|
|
35
|
-
# @param [String] type can be psn or live
|
|
36
|
-
#
|
|
37
|
-
# @return [Mechanize::CookieJar|nil]
|
|
38
|
-
def auth(username, password, type = 'psn')
|
|
39
|
-
# client init
|
|
40
|
-
agent = Mechanize.new do |config|
|
|
41
|
-
config.open_timeout = 60
|
|
42
|
-
config.read_timeout = 60
|
|
43
|
-
config.idle_timeout = 120
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
# getting index page
|
|
47
|
-
agent.get 'https://www.bungie.net/' do |page|
|
|
48
|
-
result = nil
|
|
49
|
-
link = page.link_with :text => search_query(type)
|
|
50
|
-
|
|
51
|
-
unless link.nil?
|
|
52
|
-
# call auth page
|
|
53
|
-
login = agent.click link
|
|
54
|
-
|
|
55
|
-
# sending form for sony or ms
|
|
56
|
-
if type == 'psn'
|
|
57
|
-
form = login.forms.first
|
|
58
|
-
unless form.nil?
|
|
59
|
-
name = form.field_with(:type => 'email')
|
|
60
|
-
pass = form.field_with(:type => 'password')
|
|
61
|
-
|
|
62
|
-
if !name.nil? && !pass.nil?
|
|
63
|
-
name.value = username
|
|
64
|
-
pass.value = password
|
|
65
|
-
|
|
66
|
-
result = form.click_button
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
else
|
|
70
|
-
# ms wanted enabled js, but we can send form without it
|
|
71
|
-
ppft = login.body.match(/name\="PPFT"(.*)value\="(.*?)"/)
|
|
72
|
-
url = login.body.match(/urlPost\:'(.*?)'/)
|
|
73
|
-
|
|
74
|
-
if !ppft.nil? && !url.nil?
|
|
75
|
-
result = agent.post url.to_a.last,
|
|
76
|
-
'login' => username,
|
|
77
|
-
'passwd' => password,
|
|
78
|
-
'KMSI' => 1,
|
|
79
|
-
'PPFT' => ppft.to_a.last
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
# if result not nil and after authentication we returned to bungie, all ok
|
|
85
|
-
if !result.nil? && result.uri.to_s.include?('?code')
|
|
86
|
-
needed = %w(bungled bungleatk bungledid bungles)
|
|
87
|
-
output = Mechanize::CookieJar.new
|
|
88
|
-
|
|
89
|
-
agent.cookies.each do |cookie|
|
|
90
|
-
output.add cookie if needed.include? cookie.name
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
return output
|
|
94
|
-
end
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
nil
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
# Try authenticate with cookies
|
|
101
|
-
#
|
|
102
|
-
# @param [Array|CookieJar] cookies array with [HTTP::Cookie] or [CookieJar]
|
|
103
|
-
#
|
|
104
|
-
# @return [Boolean]
|
|
105
|
-
def auth_possible?(cookies)
|
|
106
|
-
agent = Mechanize.new
|
|
107
|
-
|
|
108
|
-
valid_cookies? cookies, true
|
|
109
|
-
|
|
110
|
-
if cookies.is_a? Array
|
|
111
|
-
cookies.each do |cookie|
|
|
112
|
-
agent.cookie_jar.add cookie
|
|
113
|
-
end
|
|
114
|
-
else
|
|
115
|
-
agent.cookie_jar = cookies
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
result = nil
|
|
119
|
-
agent.get 'https://www.bungie.net/' do |page|
|
|
120
|
-
link = page.link_with :text => search_query('psn')
|
|
121
|
-
|
|
122
|
-
result = agent.click link unless link.nil?
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
!result.nil? && result.uri.host == "www.bungie.net"
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
protected
|
|
129
|
-
|
|
130
|
-
def search_query(type)
|
|
131
|
-
if type == 'psn'
|
|
132
|
-
'PlayStation Network'
|
|
133
|
-
elsif type == 'live'
|
|
134
|
-
'Xbox Live'
|
|
135
|
-
else
|
|
136
|
-
raise 'Wrong account type!'
|
|
137
|
-
end
|
|
138
|
-
end
|
|
139
|
-
end
|
|
140
|
-
end
|
|
1
|
+
# Module Auth with two methods: authentication in bungie.net by PSN or Xbox Live and checking this authentication with cookies that was returned early.
|
|
2
|
+
module BungieClient::Auth
|
|
3
|
+
class << self
|
|
4
|
+
# Check cookies for private requests
|
|
5
|
+
#
|
|
6
|
+
# @param [Array] cookies with [HTTP::Cookie]
|
|
7
|
+
# @param [Boolean] raise cookie errors
|
|
8
|
+
#
|
|
9
|
+
# @return [Boolean]
|
|
10
|
+
def valid_cookies?(cookies, raise = false)
|
|
11
|
+
if cookies.is_a? Mechanize::CookieJar
|
|
12
|
+
cookies = cookies.cookies
|
|
13
|
+
elsif !(cookies.is_a?(Array) && cookies.all? { |c| c.is_a? HTTP::Cookie })
|
|
14
|
+
raise "Wrong cookie option: It must be Array with HTTP::Cookie elements or CookieJar." if raise
|
|
15
|
+
|
|
16
|
+
return false
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
needed = %w(bungled bungleatk bungles)
|
|
20
|
+
cookies.each do |cookie|
|
|
21
|
+
if needed.include?(cookie.name) && cookie.expired? == false
|
|
22
|
+
needed.delete cookie.name
|
|
23
|
+
|
|
24
|
+
return true if needed.length == 0
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
(raise) ? raise("Your argument doesn't have all needed cookies for private requests #{needed.join ','}.") : false
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Full authentication of user
|
|
32
|
+
#
|
|
33
|
+
# @param [String] username user email for auth
|
|
34
|
+
# @param [String] password user password for auth
|
|
35
|
+
# @param [String] type can be psn or live
|
|
36
|
+
#
|
|
37
|
+
# @return [Mechanize::CookieJar|nil]
|
|
38
|
+
def auth(username, password, type = 'psn')
|
|
39
|
+
# client init
|
|
40
|
+
agent = Mechanize.new do |config|
|
|
41
|
+
config.open_timeout = 60
|
|
42
|
+
config.read_timeout = 60
|
|
43
|
+
config.idle_timeout = 120
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# getting index page
|
|
47
|
+
agent.get 'https://www.bungie.net/' do |page|
|
|
48
|
+
result = nil
|
|
49
|
+
link = page.link_with :text => search_query(type)
|
|
50
|
+
|
|
51
|
+
unless link.nil?
|
|
52
|
+
# call auth page
|
|
53
|
+
login = agent.click link
|
|
54
|
+
|
|
55
|
+
# sending form for sony or ms
|
|
56
|
+
if type == 'psn'
|
|
57
|
+
form = login.forms.first
|
|
58
|
+
unless form.nil?
|
|
59
|
+
name = form.field_with(:type => 'email')
|
|
60
|
+
pass = form.field_with(:type => 'password')
|
|
61
|
+
|
|
62
|
+
if !name.nil? && !pass.nil?
|
|
63
|
+
name.value = username
|
|
64
|
+
pass.value = password
|
|
65
|
+
|
|
66
|
+
result = form.click_button
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
else
|
|
70
|
+
# ms wanted enabled js, but we can send form without it
|
|
71
|
+
ppft = login.body.match(/name\="PPFT"(.*)value\="(.*?)"/)
|
|
72
|
+
url = login.body.match(/urlPost\:'(.*?)'/)
|
|
73
|
+
|
|
74
|
+
if !ppft.nil? && !url.nil?
|
|
75
|
+
result = agent.post url.to_a.last,
|
|
76
|
+
'login' => username,
|
|
77
|
+
'passwd' => password,
|
|
78
|
+
'KMSI' => 1,
|
|
79
|
+
'PPFT' => ppft.to_a.last
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# if result not nil and after authentication we returned to bungie, all ok
|
|
85
|
+
if !result.nil? && result.uri.to_s.include?('?code')
|
|
86
|
+
needed = %w(bungled bungleatk bungledid bungles)
|
|
87
|
+
output = Mechanize::CookieJar.new
|
|
88
|
+
|
|
89
|
+
agent.cookies.each do |cookie|
|
|
90
|
+
output.add cookie if needed.include? cookie.name
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
return output
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
nil
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Try authenticate with cookies
|
|
101
|
+
#
|
|
102
|
+
# @param [Array|CookieJar] cookies array with [HTTP::Cookie] or [CookieJar]
|
|
103
|
+
#
|
|
104
|
+
# @return [Boolean]
|
|
105
|
+
def auth_possible?(cookies)
|
|
106
|
+
agent = Mechanize.new
|
|
107
|
+
|
|
108
|
+
valid_cookies? cookies, true
|
|
109
|
+
|
|
110
|
+
if cookies.is_a? Array
|
|
111
|
+
cookies.each do |cookie|
|
|
112
|
+
agent.cookie_jar.add cookie
|
|
113
|
+
end
|
|
114
|
+
else
|
|
115
|
+
agent.cookie_jar = cookies
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
result = nil
|
|
119
|
+
agent.get 'https://www.bungie.net/' do |page|
|
|
120
|
+
link = page.link_with :text => search_query('psn')
|
|
121
|
+
|
|
122
|
+
result = agent.click link unless link.nil?
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
!result.nil? && result.uri.host == "www.bungie.net"
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
protected
|
|
129
|
+
|
|
130
|
+
def search_query(type)
|
|
131
|
+
if type == 'psn'
|
|
132
|
+
'PlayStation Network'
|
|
133
|
+
elsif type == 'live'
|
|
134
|
+
'Xbox Live'
|
|
135
|
+
else
|
|
136
|
+
raise 'Wrong account type!'
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
data/lib/bungie_client/client.rb
CHANGED
|
@@ -1,141 +1,141 @@
|
|
|
1
|
-
# Class Client for GET/POST requests to Bungie.
|
|
2
|
-
# For specific HTTP operations you can use @agent [Mechanzie].
|
|
3
|
-
class BungieClient::Client
|
|
4
|
-
BUNGIE_URI = 'https://www.bungie.net/Platform'
|
|
5
|
-
|
|
6
|
-
# Form uri for requests
|
|
7
|
-
#
|
|
8
|
-
# @param [String] uri
|
|
9
|
-
# @return [String]
|
|
10
|
-
def self.request_uri(uri)
|
|
11
|
-
"#{BUNGIE_URI}/#{uri.sub(/^\//, '').sub(/\/$/, '')}/"
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
# Format answer from bungie
|
|
15
|
-
#
|
|
16
|
-
# @param [String] response
|
|
17
|
-
#
|
|
18
|
-
# @return [Hashie::Mash]
|
|
19
|
-
def self.parse_response(response)
|
|
20
|
-
if !response.nil? && response != ''
|
|
21
|
-
response = JSON.parse response
|
|
22
|
-
|
|
23
|
-
if response.is_a?(Hash) && !response['Response'].nil? && response['ErrorCode'] == 1
|
|
24
|
-
response = Hashie::Mash.new response
|
|
25
|
-
|
|
26
|
-
return response['Response']
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
Hashie::Mash.new
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
attr_reader :api_key
|
|
34
|
-
attr_reader :username
|
|
35
|
-
attr_reader :password
|
|
36
|
-
attr_reader :type
|
|
37
|
-
attr_reader :agent
|
|
38
|
-
|
|
39
|
-
# Init client
|
|
40
|
-
#
|
|
41
|
-
# @see https://www.bungie.net/en/user/api
|
|
42
|
-
#
|
|
43
|
-
# Initialize client for bungie api throw hash:
|
|
44
|
-
#
|
|
45
|
-
# @param [Hash] options
|
|
46
|
-
# @option options [String] :api_key
|
|
47
|
-
# @option options [Array|CookieJar] :cookies with [HTTP::Cookie] or [CookieJar]
|
|
48
|
-
# @option options [String] :username username for authentication, necessary if set :authenticate
|
|
49
|
-
# @option options [String] :password password of user, necessary if set :authenticate
|
|
50
|
-
# @option options [String] :type of account, it can be 'psn' or 'live'
|
|
51
|
-
def initialize(options)
|
|
52
|
-
# checking options and @api_key
|
|
53
|
-
raise 'Wrong options: It must be Hash.' unless options.is_a? Hash
|
|
54
|
-
|
|
55
|
-
if options[:api_key].nil?
|
|
56
|
-
raise "The API-key required for every request to bungie."
|
|
57
|
-
else
|
|
58
|
-
@api_key = options[:api_key].to_s
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
# init @agent
|
|
62
|
-
@agent = Mechanize.new do |config|
|
|
63
|
-
config.read_timeout = 5
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
# merge cookies with options
|
|
67
|
-
if BungieClient::Auth.valid_cookies? options[:cookies], true
|
|
68
|
-
cookies = (options[:cookies].is_a? CookieJar) ? options[:cookies].cookies : options[:cookies]
|
|
69
|
-
|
|
70
|
-
cookies.each do |cookie|
|
|
71
|
-
@agent.cookie_jar.add cookie
|
|
72
|
-
end
|
|
73
|
-
end unless options[:cookies].nil?
|
|
74
|
-
|
|
75
|
-
# make authentication and save new cookies in client
|
|
76
|
-
unless options[:username].nil? || options[:password].nil?
|
|
77
|
-
jar = BungieClient::Auth.auth options[:username].to_s, options[:password].to_s, (options[:type].to_s || 'psn')
|
|
78
|
-
|
|
79
|
-
if jar.nil?
|
|
80
|
-
raise "Wrong authentication. Check your account data."
|
|
81
|
-
else
|
|
82
|
-
jar.cookies.each do |cookie|
|
|
83
|
-
@agent.cookie_jar.add cookie
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
# Get response from bungie services
|
|
90
|
-
#
|
|
91
|
-
# @see http://destinydevs.github.io/BungieNetPlatform/docs/Endpoints
|
|
92
|
-
#
|
|
93
|
-
# @param [String] uri
|
|
94
|
-
# @param [Hash|Array] parameters for http-query
|
|
95
|
-
#
|
|
96
|
-
# @return [String|nil]
|
|
97
|
-
def get(uri, parameters = {})
|
|
98
|
-
@agent.get(self.class.request_uri(uri), parameters, nil, headers).body rescue nil
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
# Get Response field after sending GET request to bungie
|
|
102
|
-
#
|
|
103
|
-
# @param [String] uri
|
|
104
|
-
# @param [Hash|Array] parameters for http-query
|
|
105
|
-
#
|
|
106
|
-
# @return [Hashie::Mash]
|
|
107
|
-
def get_response(uri, parameters = {})
|
|
108
|
-
self.class.parse_response get(uri, parameters)
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
# Post data to bungie services
|
|
112
|
-
#
|
|
113
|
-
# @param [String] uri
|
|
114
|
-
# @param [Hash] query
|
|
115
|
-
#
|
|
116
|
-
# @return [String|nil]
|
|
117
|
-
def post(uri, query = {})
|
|
118
|
-
@agent.post(self.class.request_uri(uri), query, headers).body rescue nil
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
# Get Response field after post request to bungie
|
|
122
|
-
#
|
|
123
|
-
# @param [String] uri
|
|
124
|
-
# @param [Hash] query for post
|
|
125
|
-
#
|
|
126
|
-
# @return [Hashie::Mash]
|
|
127
|
-
def post_response(uri, query = {})
|
|
128
|
-
self.class.parse_response post(uri, query)
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
protected
|
|
132
|
-
|
|
133
|
-
# Headers for requests
|
|
134
|
-
def headers
|
|
135
|
-
{
|
|
136
|
-
'Accept' => 'json',
|
|
137
|
-
'Content-Type' => 'json',
|
|
138
|
-
'X-API-Key' => @api_key
|
|
139
|
-
}
|
|
140
|
-
end
|
|
141
|
-
end
|
|
1
|
+
# Class Client for GET/POST requests to Bungie.
|
|
2
|
+
# For specific HTTP operations you can use @agent [Mechanzie].
|
|
3
|
+
class BungieClient::Client
|
|
4
|
+
BUNGIE_URI = 'https://www.bungie.net/Platform'
|
|
5
|
+
|
|
6
|
+
# Form uri for requests
|
|
7
|
+
#
|
|
8
|
+
# @param [String] uri
|
|
9
|
+
# @return [String]
|
|
10
|
+
def self.request_uri(uri)
|
|
11
|
+
"#{BUNGIE_URI}/#{uri.sub(/^\//, '').sub(/\/$/, '')}/"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# Format answer from bungie
|
|
15
|
+
#
|
|
16
|
+
# @param [String] response
|
|
17
|
+
#
|
|
18
|
+
# @return [Hashie::Mash]
|
|
19
|
+
def self.parse_response(response)
|
|
20
|
+
if !response.nil? && response != ''
|
|
21
|
+
response = JSON.parse response
|
|
22
|
+
|
|
23
|
+
if response.is_a?(Hash) && !response['Response'].nil? && response['ErrorCode'] == 1
|
|
24
|
+
response = Hashie::Mash.new response
|
|
25
|
+
|
|
26
|
+
return response['Response']
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
Hashie::Mash.new
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
attr_reader :api_key
|
|
34
|
+
attr_reader :username
|
|
35
|
+
attr_reader :password
|
|
36
|
+
attr_reader :type
|
|
37
|
+
attr_reader :agent
|
|
38
|
+
|
|
39
|
+
# Init client
|
|
40
|
+
#
|
|
41
|
+
# @see https://www.bungie.net/en/user/api
|
|
42
|
+
#
|
|
43
|
+
# Initialize client for bungie api throw hash:
|
|
44
|
+
#
|
|
45
|
+
# @param [Hash] options
|
|
46
|
+
# @option options [String] :api_key
|
|
47
|
+
# @option options [Array|CookieJar] :cookies with [HTTP::Cookie] or [CookieJar]
|
|
48
|
+
# @option options [String] :username username for authentication, necessary if set :authenticate
|
|
49
|
+
# @option options [String] :password password of user, necessary if set :authenticate
|
|
50
|
+
# @option options [String] :type of account, it can be 'psn' or 'live'
|
|
51
|
+
def initialize(options)
|
|
52
|
+
# checking options and @api_key
|
|
53
|
+
raise 'Wrong options: It must be Hash.' unless options.is_a? Hash
|
|
54
|
+
|
|
55
|
+
if options[:api_key].nil?
|
|
56
|
+
raise "The API-key required for every request to bungie."
|
|
57
|
+
else
|
|
58
|
+
@api_key = options[:api_key].to_s
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# init @agent
|
|
62
|
+
@agent = Mechanize.new do |config|
|
|
63
|
+
config.read_timeout = 5
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# merge cookies with options
|
|
67
|
+
if BungieClient::Auth.valid_cookies? options[:cookies], true
|
|
68
|
+
cookies = (options[:cookies].is_a? CookieJar) ? options[:cookies].cookies : options[:cookies]
|
|
69
|
+
|
|
70
|
+
cookies.each do |cookie|
|
|
71
|
+
@agent.cookie_jar.add cookie
|
|
72
|
+
end
|
|
73
|
+
end unless options[:cookies].nil?
|
|
74
|
+
|
|
75
|
+
# make authentication and save new cookies in client
|
|
76
|
+
unless options[:username].nil? || options[:password].nil?
|
|
77
|
+
jar = BungieClient::Auth.auth options[:username].to_s, options[:password].to_s, (options[:type].to_s || 'psn')
|
|
78
|
+
|
|
79
|
+
if jar.nil?
|
|
80
|
+
raise "Wrong authentication. Check your account data."
|
|
81
|
+
else
|
|
82
|
+
jar.cookies.each do |cookie|
|
|
83
|
+
@agent.cookie_jar.add cookie
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Get response from bungie services
|
|
90
|
+
#
|
|
91
|
+
# @see http://destinydevs.github.io/BungieNetPlatform/docs/Endpoints
|
|
92
|
+
#
|
|
93
|
+
# @param [String] uri
|
|
94
|
+
# @param [Hash|Array] parameters for http-query
|
|
95
|
+
#
|
|
96
|
+
# @return [String|nil]
|
|
97
|
+
def get(uri, parameters = {})
|
|
98
|
+
@agent.get(self.class.request_uri(uri), parameters, nil, headers).body rescue nil
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Get Response field after sending GET request to bungie
|
|
102
|
+
#
|
|
103
|
+
# @param [String] uri
|
|
104
|
+
# @param [Hash|Array] parameters for http-query
|
|
105
|
+
#
|
|
106
|
+
# @return [Hashie::Mash]
|
|
107
|
+
def get_response(uri, parameters = {})
|
|
108
|
+
self.class.parse_response get(uri, parameters)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Post data to bungie services
|
|
112
|
+
#
|
|
113
|
+
# @param [String] uri
|
|
114
|
+
# @param [Hash] query
|
|
115
|
+
#
|
|
116
|
+
# @return [String|nil]
|
|
117
|
+
def post(uri, query = {})
|
|
118
|
+
@agent.post(self.class.request_uri(uri), query, headers).body rescue nil
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# Get Response field after post request to bungie
|
|
122
|
+
#
|
|
123
|
+
# @param [String] uri
|
|
124
|
+
# @param [Hash] query for post
|
|
125
|
+
#
|
|
126
|
+
# @return [Hashie::Mash]
|
|
127
|
+
def post_response(uri, query = {})
|
|
128
|
+
self.class.parse_response post(uri, query)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
protected
|
|
132
|
+
|
|
133
|
+
# Headers for requests
|
|
134
|
+
def headers
|
|
135
|
+
{
|
|
136
|
+
'Accept' => 'json',
|
|
137
|
+
'Content-Type' => 'json',
|
|
138
|
+
'X-API-Key' => @api_key
|
|
139
|
+
}
|
|
140
|
+
end
|
|
141
|
+
end
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
# Simple class for service structure
|
|
2
|
-
class BungieClient::Service
|
|
3
|
-
attr_reader :method_type, :name, :endpoint
|
|
4
|
-
|
|
5
|
-
def initialize(options)
|
|
6
|
-
@method_type = ((%w(get post).include? options[:method]) ? options[:method] : 'get')
|
|
7
|
-
@name = options[:name].to_s
|
|
8
|
-
@endpoint = options[:endpoint].to_s
|
|
9
|
-
end
|
|
1
|
+
# Simple class for service structure
|
|
2
|
+
class BungieClient::Service
|
|
3
|
+
attr_reader :method_type, :name, :endpoint
|
|
4
|
+
|
|
5
|
+
def initialize(options)
|
|
6
|
+
@method_type = ((%w(get post).include? options[:method]) ? options[:method] : 'get')
|
|
7
|
+
@name = options[:name].to_s
|
|
8
|
+
@endpoint = options[:endpoint].to_s
|
|
9
|
+
end
|
|
10
10
|
end
|
|
File without changes
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module BungieClient
|
|
2
|
-
VERSION = '1.0.
|
|
3
|
-
end
|
|
1
|
+
module BungieClient
|
|
2
|
+
VERSION = '1.0.2'
|
|
3
|
+
end
|
|
@@ -1,84 +1,84 @@
|
|
|
1
|
-
# Wrapper class for simple api requests
|
|
2
|
-
module BungieClient::Wrappers
|
|
3
|
-
class Default
|
|
4
|
-
# Get list of services
|
|
5
|
-
#
|
|
6
|
-
# @see http://destinydevs.github.io/BungieNetPlatform/docs/Endpoints
|
|
7
|
-
#
|
|
8
|
-
# @return [Hash]
|
|
9
|
-
def self.services
|
|
10
|
-
return @services unless @services.nil?
|
|
11
|
-
|
|
12
|
-
@services = YAML.load_file "#{File.dirname(__FILE__)}/../services.yml" || {}
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
# Initialize wrapper with client
|
|
16
|
-
#
|
|
17
|
-
# This initializer create wrapper object with client.
|
|
18
|
-
# If you `options` contain `:client` key, it will be taken as client object [BungieClient::Client]. Otherwise it will be passed in client initializer.
|
|
19
|
-
#
|
|
20
|
-
# @see BungieClient::Client
|
|
21
|
-
#
|
|
22
|
-
# @param [Hash] options
|
|
23
|
-
def initialize(options)
|
|
24
|
-
if options[:client].nil?
|
|
25
|
-
@options = options
|
|
26
|
-
elsif options[:client].is_a? BungieClient::Client
|
|
27
|
-
@client = options[:client]
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
# Get wrapper client
|
|
32
|
-
#
|
|
33
|
-
# @return [BungieClient::Client]
|
|
34
|
-
def client
|
|
35
|
-
return @client unless @client.nil?
|
|
36
|
-
|
|
37
|
-
@client = BungieClient::Client.new @options
|
|
38
|
-
@options = nil
|
|
39
|
-
|
|
40
|
-
@client
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
# Change all url parameters to hash value
|
|
44
|
-
#
|
|
45
|
-
# @param [String] url
|
|
46
|
-
# @param [Hash] params
|
|
47
|
-
#
|
|
48
|
-
# @return [String]
|
|
49
|
-
def fill_url(url, params)
|
|
50
|
-
params.each do |key, value|
|
|
51
|
-
url = url.gsub "{#{key}}", value.to_s
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
url
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
# Call needed service from services list
|
|
58
|
-
#
|
|
59
|
-
# @param [String] service name in snake case
|
|
60
|
-
# @param [Hash] params service parameters
|
|
61
|
-
# @param [Hash] options for client request (get/post)
|
|
62
|
-
#
|
|
63
|
-
# @return [Hashie::Mash]
|
|
64
|
-
def call_service(service, params = {}, options = {})
|
|
65
|
-
# try to
|
|
66
|
-
service = self.class.services[service]
|
|
67
|
-
|
|
68
|
-
raise NoMethodError if service.nil?
|
|
69
|
-
|
|
70
|
-
# init service
|
|
71
|
-
service = BungieClient::Service.new service
|
|
72
|
-
|
|
73
|
-
# change url
|
|
74
|
-
url = self.fill_url service.endpoint, params
|
|
75
|
-
|
|
76
|
-
# send request
|
|
77
|
-
client.send "#{service.method_type}_response", url, options
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
def method_missing(*args)
|
|
81
|
-
call_service args[0].to_s, args[1], args[2]
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
end
|
|
1
|
+
# Wrapper class for simple api requests
|
|
2
|
+
module BungieClient::Wrappers
|
|
3
|
+
class Default
|
|
4
|
+
# Get list of services
|
|
5
|
+
#
|
|
6
|
+
# @see http://destinydevs.github.io/BungieNetPlatform/docs/Endpoints
|
|
7
|
+
#
|
|
8
|
+
# @return [Hash]
|
|
9
|
+
def self.services
|
|
10
|
+
return @services unless @services.nil?
|
|
11
|
+
|
|
12
|
+
@services = YAML.load_file "#{File.dirname(__FILE__)}/../services.yml" || {}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Initialize wrapper with client
|
|
16
|
+
#
|
|
17
|
+
# This initializer create wrapper object with client.
|
|
18
|
+
# If you `options` contain `:client` key, it will be taken as client object [BungieClient::Client]. Otherwise it will be passed in client initializer.
|
|
19
|
+
#
|
|
20
|
+
# @see BungieClient::Client
|
|
21
|
+
#
|
|
22
|
+
# @param [Hash] options
|
|
23
|
+
def initialize(options)
|
|
24
|
+
if options[:client].nil?
|
|
25
|
+
@options = options
|
|
26
|
+
elsif options[:client].is_a? BungieClient::Client
|
|
27
|
+
@client = options[:client]
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Get wrapper client
|
|
32
|
+
#
|
|
33
|
+
# @return [BungieClient::Client]
|
|
34
|
+
def client
|
|
35
|
+
return @client unless @client.nil?
|
|
36
|
+
|
|
37
|
+
@client = BungieClient::Client.new @options
|
|
38
|
+
@options = nil
|
|
39
|
+
|
|
40
|
+
@client
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Change all url parameters to hash value
|
|
44
|
+
#
|
|
45
|
+
# @param [String] url
|
|
46
|
+
# @param [Hash] params
|
|
47
|
+
#
|
|
48
|
+
# @return [String]
|
|
49
|
+
def fill_url(url, params)
|
|
50
|
+
params.each do |key, value|
|
|
51
|
+
url = url.gsub "{#{key}}", value.to_s
|
|
52
|
+
end unless params.nil?
|
|
53
|
+
|
|
54
|
+
url
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Call needed service from services list
|
|
58
|
+
#
|
|
59
|
+
# @param [String] service name in snake case
|
|
60
|
+
# @param [Hash] params service parameters
|
|
61
|
+
# @param [Hash] options for client request (get/post)
|
|
62
|
+
#
|
|
63
|
+
# @return [Hashie::Mash]
|
|
64
|
+
def call_service(service, params = {}, options = {})
|
|
65
|
+
# try to find service
|
|
66
|
+
service = self.class.services[service]
|
|
67
|
+
|
|
68
|
+
raise NoMethodError if service.nil?
|
|
69
|
+
|
|
70
|
+
# init service
|
|
71
|
+
service = BungieClient::Service.new service
|
|
72
|
+
|
|
73
|
+
# change url
|
|
74
|
+
url = self.fill_url service.endpoint, params
|
|
75
|
+
|
|
76
|
+
# send request
|
|
77
|
+
client.send "#{service.method_type}_response", url, options
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def method_missing(*args)
|
|
81
|
+
call_service args[0].to_s, args[1], args[2]
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
module BungieClient::Wrappers
|
|
2
|
-
class User < Default
|
|
3
|
-
attr_reader :membership_type, :display_name
|
|
4
|
-
|
|
5
|
-
# Initialize wrapper with user's preset
|
|
6
|
-
#
|
|
7
|
-
# @note maybe add the `destiny_membership_id` as an alternative to `display_name`
|
|
8
|
-
#
|
|
9
|
-
# @option options [Integer] :membership_type Platform type number (xbox - 1, playstation - 2, all - 256)
|
|
10
|
-
# @option options [String] :display_name Simple user name
|
|
11
|
-
def initialize(options)
|
|
12
|
-
super
|
|
13
|
-
|
|
14
|
-
# set membershipType
|
|
15
|
-
if %w(1 2 256).include? options[:membership_type].to_s
|
|
16
|
-
@membership_type = options[:membership_type].to_s
|
|
17
|
-
else
|
|
18
|
-
@membership_type = '256'
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
# set displayName
|
|
22
|
-
if options[:display_name].is_a? String
|
|
23
|
-
@display_name = options[:display_name]
|
|
24
|
-
else
|
|
25
|
-
raise 'You must set user display name'
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
# Get DestinyMembershipId of selected user
|
|
30
|
-
def destiny_membership_id
|
|
31
|
-
return @destiny_membership_id unless @destiny_membership_id.nil?
|
|
32
|
-
|
|
33
|
-
@destiny_membership_id = call_service(
|
|
34
|
-
'get_membership_id_by_display_name',
|
|
35
|
-
{
|
|
36
|
-
:displayName => @display_name,
|
|
37
|
-
:membershipType => @membership_type
|
|
38
|
-
}
|
|
39
|
-
)
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
def fill_url(url, params)
|
|
43
|
-
params = {} unless params.is_a? Hash
|
|
44
|
-
|
|
45
|
-
params[:displayName] = @display_name
|
|
46
|
-
params[:membershipType] = @membership_type
|
|
47
|
-
params[:destinyMembershipId] = destiny_membership_id if url.include? '{destinyMembershipId}'
|
|
48
|
-
params[:membershipId] = destiny_membership_id if url.include? '{membershipId}'
|
|
49
|
-
|
|
50
|
-
super
|
|
51
|
-
end
|
|
52
|
-
end
|
|
1
|
+
module BungieClient::Wrappers
|
|
2
|
+
class User < Default
|
|
3
|
+
attr_reader :membership_type, :display_name
|
|
4
|
+
|
|
5
|
+
# Initialize wrapper with user's preset
|
|
6
|
+
#
|
|
7
|
+
# @note maybe add the `destiny_membership_id` as an alternative to `display_name`
|
|
8
|
+
#
|
|
9
|
+
# @option options [Integer] :membership_type Platform type number (xbox - 1, playstation - 2, all - 256)
|
|
10
|
+
# @option options [String] :display_name Simple user name
|
|
11
|
+
def initialize(options)
|
|
12
|
+
super
|
|
13
|
+
|
|
14
|
+
# set membershipType
|
|
15
|
+
if %w(1 2 256).include? options[:membership_type].to_s
|
|
16
|
+
@membership_type = options[:membership_type].to_s
|
|
17
|
+
else
|
|
18
|
+
@membership_type = '256'
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# set displayName
|
|
22
|
+
if options[:display_name].is_a? String
|
|
23
|
+
@display_name = options[:display_name]
|
|
24
|
+
else
|
|
25
|
+
raise 'You must set user display name'
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Get DestinyMembershipId of selected user
|
|
30
|
+
def destiny_membership_id
|
|
31
|
+
return @destiny_membership_id unless @destiny_membership_id.nil?
|
|
32
|
+
|
|
33
|
+
@destiny_membership_id = call_service(
|
|
34
|
+
'get_membership_id_by_display_name',
|
|
35
|
+
{
|
|
36
|
+
:displayName => @display_name,
|
|
37
|
+
:membershipType => @membership_type
|
|
38
|
+
}
|
|
39
|
+
)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def fill_url(url, params)
|
|
43
|
+
params = {} unless params.is_a? Hash
|
|
44
|
+
|
|
45
|
+
params[:displayName] = @display_name
|
|
46
|
+
params[:membershipType] = @membership_type
|
|
47
|
+
params[:destinyMembershipId] = destiny_membership_id if url.include? '{destinyMembershipId}'
|
|
48
|
+
params[:membershipId] = destiny_membership_id if url.include? '{membershipId}'
|
|
49
|
+
|
|
50
|
+
super
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
53
|
end
|
data/lib/underscore.rb
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
class String
|
|
2
|
-
# Transform string to snake case
|
|
3
|
-
def underscore
|
|
4
|
-
self.gsub(/::/, '/').
|
|
5
|
-
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
|
6
|
-
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
|
7
|
-
tr("- ", "_").
|
|
8
|
-
downcase
|
|
9
|
-
end
|
|
1
|
+
class String
|
|
2
|
+
# Transform string to snake case
|
|
3
|
+
def underscore
|
|
4
|
+
self.gsub(/::/, '/').
|
|
5
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
|
6
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
|
7
|
+
tr("- ", "_").
|
|
8
|
+
downcase
|
|
9
|
+
end
|
|
10
10
|
end
|
data/services_parser.rb
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
# This script can parse the list of bungie services from *destinydevs.github.io* for client.
|
|
2
|
-
|
|
3
|
-
require 'yaml'
|
|
4
|
-
require 'hashie'
|
|
5
|
-
require 'mechanize'
|
|
6
|
-
require 'underscore'
|
|
7
|
-
|
|
8
|
-
# preset
|
|
9
|
-
client = Mechanize.new
|
|
10
|
-
url = 'http://destinydevs.github.io/BungieNetPlatform/docs/Endpoints'
|
|
11
|
-
services = {}
|
|
12
|
-
|
|
13
|
-
# get services
|
|
14
|
-
client.get url do |page|
|
|
15
|
-
trs = page.parser.search '.container .table tbody tr'
|
|
16
|
-
|
|
17
|
-
trs.each do |tr|
|
|
18
|
-
tds = tr.search 'td'
|
|
19
|
-
|
|
20
|
-
next if tds.nil? || tds[1].nil?
|
|
21
|
-
|
|
22
|
-
services[tds[1].text.underscore] = {
|
|
23
|
-
:name => tds[1].text,
|
|
24
|
-
:method => (tds[0]&.text.downcase || 'get'),
|
|
25
|
-
:endpoint => (tds[2]&.text || '')
|
|
26
|
-
}
|
|
27
|
-
end unless trs.nil?
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
# save yaml
|
|
31
|
-
File.open "#{File.dirname(__FILE__)}/lib/bungie_client/services.yml", 'w' do |f|
|
|
32
|
-
f.write services.to_yaml
|
|
1
|
+
# This script can parse the list of bungie services from *destinydevs.github.io* for client.
|
|
2
|
+
|
|
3
|
+
require 'yaml'
|
|
4
|
+
require 'hashie'
|
|
5
|
+
require 'mechanize'
|
|
6
|
+
require 'underscore'
|
|
7
|
+
|
|
8
|
+
# preset
|
|
9
|
+
client = Mechanize.new
|
|
10
|
+
url = 'http://destinydevs.github.io/BungieNetPlatform/docs/Endpoints'
|
|
11
|
+
services = {}
|
|
12
|
+
|
|
13
|
+
# get services
|
|
14
|
+
client.get url do |page|
|
|
15
|
+
trs = page.parser.search '.container .table tbody tr'
|
|
16
|
+
|
|
17
|
+
trs.each do |tr|
|
|
18
|
+
tds = tr.search 'td'
|
|
19
|
+
|
|
20
|
+
next if tds.nil? || tds[1].nil?
|
|
21
|
+
|
|
22
|
+
services[tds[1].text.underscore] = {
|
|
23
|
+
:name => tds[1].text,
|
|
24
|
+
:method => (tds[0]&.text.downcase || 'get'),
|
|
25
|
+
:endpoint => (tds[2]&.text || '')
|
|
26
|
+
}
|
|
27
|
+
end unless trs.nil?
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# save yaml
|
|
31
|
+
File.open "#{File.dirname(__FILE__)}/lib/bungie_client/services.yml", 'w' do |f|
|
|
32
|
+
f.write services.to_yaml
|
|
33
33
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: bungie_client
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0.
|
|
4
|
+
version: 1.0.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Dmitry Ruban
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2017-01-21 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -96,7 +96,7 @@ extensions: []
|
|
|
96
96
|
extra_rdoc_files: []
|
|
97
97
|
files:
|
|
98
98
|
- ".gitignore"
|
|
99
|
-
- ".
|
|
99
|
+
- ".idea/vcs.xml"
|
|
100
100
|
- ".travis.yml"
|
|
101
101
|
- CODE_OF_CONDUCT.md
|
|
102
102
|
- Gemfile
|
|
@@ -139,7 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
139
139
|
version: '0'
|
|
140
140
|
requirements: []
|
|
141
141
|
rubyforge_project:
|
|
142
|
-
rubygems_version: 2.5.
|
|
142
|
+
rubygems_version: 2.5.2
|
|
143
143
|
signing_key:
|
|
144
144
|
specification_version: 4
|
|
145
145
|
summary: This gem makes possible to use Bungie API (and Destiny API too) with authentication
|