restiny 0.3.0 → 0.4.0
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/lib/restiny/constants.rb +4 -4
- data/lib/restiny/errors.rb +11 -12
- data/lib/restiny/manifest.rb +102 -85
- data/lib/restiny/version.rb +1 -1
- data/lib/restiny.rb +34 -97
- metadata +42 -16
- data/lib/restiny/character.rb +0 -17
- data/lib/restiny/user.rb +0 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 741ac894abe43506371ddd982baddc4fc151742a1b60a7d7c0fdf702d69c5a46
|
4
|
+
data.tar.gz: 2bde117539309611f7bb2f7f859903195352cad1ba1158546238876496d3efa3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c301404d8149756a2cfab53a871fdbb8e1f68dd3cecd0a9d52698c54d421d6547588ea9dd8bc0f34584b9f9471d59a46df8af3f3d8c7603a13205fee619a9202
|
7
|
+
data.tar.gz: dae32ebf9a7646304782d6f3ccaca965d704bd0d62f0a8429abd1820877570deeb4054cc4ccbd9f77f58800d366cda30589e1e6d912b6d6576e3cae6f682f026
|
data/lib/restiny/constants.rb
CHANGED
@@ -6,7 +6,7 @@ PLATFORM_PSN = 2
|
|
6
6
|
PLATFORM_STEAM = 3
|
7
7
|
PLATFORM_EPIC = 6
|
8
8
|
|
9
|
-
COMPONENT_TYPE_PROFILES =
|
10
|
-
COMPONENT_TYPE_PROFILE_INVENTORIES =
|
11
|
-
COMPONENT_TYPE_CHARACTERS =
|
12
|
-
COMPONENT_TYPE_CHARACTER_INVENTORIES =
|
9
|
+
COMPONENT_TYPE_PROFILES = "Profiles"
|
10
|
+
COMPONENT_TYPE_PROFILE_INVENTORIES = "ProfileInventories"
|
11
|
+
COMPONENT_TYPE_CHARACTERS = "Characters"
|
12
|
+
COMPONENT_TYPE_CHARACTER_INVENTORIES = "CharacterInventories"
|
data/lib/restiny/errors.rb
CHANGED
@@ -1,19 +1,18 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Restiny
|
4
|
-
class Error < StandardError
|
5
|
-
|
6
|
-
|
7
|
-
class RateLimitedError < RequestError
|
8
|
-
end
|
9
|
-
|
10
|
-
class ResponseError < Error; end
|
11
|
-
class NetworkError < Error
|
12
|
-
attr_accessor :status_code
|
13
|
-
|
14
|
-
def initialize(message, status_code = nil)
|
15
|
-
@status_code = status_code
|
4
|
+
class Error < StandardError
|
5
|
+
def initialize(message, details = nil)
|
6
|
+
@details = details
|
16
7
|
super(message)
|
17
8
|
end
|
18
9
|
end
|
10
|
+
|
11
|
+
class RequestError < Error; end
|
12
|
+
|
13
|
+
class InvalidParamsError < RequestError; end
|
14
|
+
|
15
|
+
class RateLimitedError < RequestError; end
|
16
|
+
|
17
|
+
class ResponseError < Error; end
|
19
18
|
end
|
data/lib/restiny/manifest.rb
CHANGED
@@ -1,68 +1,67 @@
|
|
1
1
|
# frozen_string/literal: true
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
2
|
+
require "down"
|
3
|
+
require "json"
|
4
|
+
require "sqlite3"
|
5
|
+
require "zip"
|
6
6
|
|
7
7
|
module Restiny
|
8
8
|
class Manifest
|
9
9
|
TABLES = {
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
'VendorGroup': { item: 'vendor_group', items: 'vendor_groups' }
|
10
|
+
Achievement: {item: "achievement", items: "achievements"},
|
11
|
+
Activity: {item: "activity", items: "activities"},
|
12
|
+
ActivityGraph: {item: "activity_graph", items: "activity_graphs"},
|
13
|
+
ActivityMode: {item: "activity_mode", items: "activity_modes"},
|
14
|
+
ActivityModifier: {item: "activity_modifier", items: "activity_modifiers"},
|
15
|
+
ActivityType: {item: "activity_type", items: "activity_types"},
|
16
|
+
Artifact: {item: "artifact", items: "artifacts"},
|
17
|
+
Bond: {item: "bond", items: "bonds"},
|
18
|
+
BreakerType: {item: "breaker_type", items: "breaker_types"},
|
19
|
+
Checklist: {item: "checklist", items: "checklists"},
|
20
|
+
Class: {item: "guardian_class", items: "guardian_classes"},
|
21
|
+
Collectible: {item: "collectible", items: "collectibles"},
|
22
|
+
DamageType: {item: "damage_type", items: "damage_types"},
|
23
|
+
Destination: {item: "destination", items: "destinations"},
|
24
|
+
EnergyType: {item: "energy_type", items: "energy_types"},
|
25
|
+
EquipmentSlot: {item: "equipment_slot", items: "equipment_slots"},
|
26
|
+
EventCard: {item: "event_card", items: "event_cards"},
|
27
|
+
Faction: {item: "faction", items: "factions"},
|
28
|
+
Gender: {item: "gender", items: "genders"},
|
29
|
+
HistoricalStats: {item: "historical_stat", items: "historical_stats"},
|
30
|
+
InventoryBucket: {item: "inventory_bucket", items: "inventory_buckets"},
|
31
|
+
InventoryItem: {item: "inventory_item", items: "inventory_items"},
|
32
|
+
ItemCategory: {item: "item_category", items: "item_categories"},
|
33
|
+
ItemTierType: {item: "item_tier_type", items: "item_tier_types"},
|
34
|
+
Location: {item: "location", items: "locations"},
|
35
|
+
Lore: {item: "lore", items: "lore_entries"},
|
36
|
+
MaterialRequirementSet: {item: "material_requirement_set", items: "material_requirement_sets"},
|
37
|
+
MedalTier: {item: "medal_tier", items: "medal_tiers"},
|
38
|
+
Metric: {item: "metric", items: "metrics"},
|
39
|
+
Milestone: {item: "milestone", items: "milestones"},
|
40
|
+
Objective: {item: "objective", items: "objectives"},
|
41
|
+
Place: {item: "place", items: "places"},
|
42
|
+
PlugSet: {item: "plug_set", items: "plug_sets"},
|
43
|
+
PowerCap: {item: "power_cap", items: "power_caps"},
|
44
|
+
PresentationNode: {item: "presentation_node", items: "presentation_nodes"},
|
45
|
+
Progression: {item: "progression", items: "progression_data"},
|
46
|
+
ProgressionLevelRequirement: {item: "progression_level_requirement", items: "progression_level_requirements"},
|
47
|
+
Race: {item: "race", items: "races"},
|
48
|
+
Record: {item: "record", items: "records"},
|
49
|
+
ReportReasonCategory: {item: "report_reason_category", items: "report_reason_categories"},
|
50
|
+
RewardSource: {item: "reward_source", items: "reward_sources"},
|
51
|
+
SackRewardItemList: {item: "sack_reward_item_list", items: "sack_reward_item_lists"},
|
52
|
+
SandboxPattern: {item: "sandbox_pattern", items: "sandbox_patterns"},
|
53
|
+
SandboxPerk: {item: "sandbox_perk", items: "sandbox_perks"},
|
54
|
+
Season: {item: "season", items: "seasons"},
|
55
|
+
SeasonPass: {item: "season_pass", items: "season_passes"},
|
56
|
+
SocketCategory: {item: "socket_category", items: "socket_categories"},
|
57
|
+
SocketType: {item: "socket_type", items: "socket_types"},
|
58
|
+
Stat: {item: "stat", items: "stats"},
|
59
|
+
StatGroup: {item: "stat_group", items: "stat_groups"},
|
60
|
+
TalentGrid: {item: "talent_grid", items: "talent_grids"},
|
61
|
+
Trait: {item: "trait", items: "traits"},
|
62
|
+
Unlock: {item: "unlock", items: "unlocks"},
|
63
|
+
Vendor: {item: "vendor", items: "vendors"},
|
64
|
+
VendorGroup: {item: "vendor_group", items: "vendor_groups"}
|
66
65
|
}
|
67
66
|
|
68
67
|
attr_reader :file_path
|
@@ -71,41 +70,25 @@ module Restiny
|
|
71
70
|
full_table_name = "Destiny#{table_name}Definition"
|
72
71
|
|
73
72
|
define_method method_names[:item] do |hash|
|
74
|
-
|
75
|
-
|
76
|
-
result = perform_query(query, [hash])
|
77
|
-
result = JSON.parse(result[0]['json']) unless result.nil?
|
73
|
+
fetch_item(full_table_name, hash)
|
78
74
|
end
|
79
75
|
|
80
|
-
define_method method_names[:items] do |
|
81
|
-
|
82
|
-
FROM #{full_table_name} "
|
83
|
-
|
84
|
-
query << "WHERE json_extract(json, '$.displayProperties.name') IS NOT NULL " if filter_empty
|
85
|
-
query << "ORDER BY json_extract(json, '$.index')"
|
86
|
-
|
87
|
-
bindings = []
|
88
|
-
|
89
|
-
if limit
|
90
|
-
query << " LIMIT ?"
|
91
|
-
bindings << limit
|
92
|
-
end
|
93
|
-
|
94
|
-
perform_query(query, bindings)
|
76
|
+
define_method method_names[:items] do |options = {}|
|
77
|
+
fetch_items(full_table_name, options)
|
95
78
|
end
|
96
79
|
end
|
97
80
|
|
98
81
|
def self.download(url)
|
99
82
|
zipped_file = Down.download(url)
|
100
|
-
manifest_path = zipped_file.path + ".db"
|
83
|
+
manifest_path = zipped_file.path + ".db"
|
101
84
|
|
102
85
|
Zip::File.open(zipped_file) { |file| file.first.extract(manifest_path) }
|
103
86
|
|
104
|
-
|
87
|
+
new(manifest_path)
|
105
88
|
rescue Down::ResponseError => error
|
106
89
|
raise Restiny::NetworkError.new("Unable to download the manifest file", error.response.code)
|
107
90
|
rescue Zip::Error => error
|
108
|
-
raise Restiny::Error.new("Unable to unzip the manifest file (#{
|
91
|
+
raise Restiny::Error.new("Unable to unzip the manifest file (#{error})")
|
109
92
|
end
|
110
93
|
|
111
94
|
def initialize(file_path)
|
@@ -119,10 +102,44 @@ module Restiny
|
|
119
102
|
|
120
103
|
private
|
121
104
|
|
122
|
-
def
|
123
|
-
|
105
|
+
def fetch_item(table_name, hash)
|
106
|
+
query = "SELECT json FROM #{table_name} WHERE json_extract(json, '$.hash')=?"
|
107
|
+
result = @database.execute(query, hash)
|
108
|
+
|
109
|
+
return nil if result.nil? || result.count < 1 || !result[0].include?("json")
|
110
|
+
|
111
|
+
JSON.parse(result[0]["json"])
|
112
|
+
rescue SQLite3::Exception => e
|
113
|
+
raise Restiny::RequestError.new("Error while fetching item (#{e})")
|
114
|
+
end
|
115
|
+
|
116
|
+
def fetch_items(table_name, options = {})
|
117
|
+
bindings = []
|
118
|
+
|
119
|
+
query = "SELECT json FROM #{table_name} "
|
120
|
+
query << "WHERE json_extract(json, '$.displayProperties.name') != '' " if options[:filter_empty]
|
121
|
+
query << "ORDER BY json_extract(json, '$.index')"
|
122
|
+
|
123
|
+
if options[:limit]
|
124
|
+
query << " LIMIT ?"
|
125
|
+
bindings << options[:limit]
|
126
|
+
end
|
127
|
+
|
128
|
+
result = []
|
129
|
+
|
130
|
+
@database.execute(query, bindings) do |row|
|
131
|
+
item = JSON.parse(row["json"])
|
132
|
+
|
133
|
+
if block_given?
|
134
|
+
yield item
|
135
|
+
else
|
136
|
+
result << item
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
result unless block_given?
|
124
141
|
rescue SQLite3::Exception => e
|
125
|
-
raise Restiny::RequestError.new("Error while
|
142
|
+
raise Restiny::RequestError.new("Error while fetching item (#{e})")
|
126
143
|
end
|
127
144
|
end
|
128
145
|
end
|
data/lib/restiny/version.rb
CHANGED
data/lib/restiny.rb
CHANGED
@@ -2,17 +2,14 @@
|
|
2
2
|
|
3
3
|
$LOAD_PATH.unshift(__dir__)
|
4
4
|
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
|
10
|
-
require
|
11
|
-
require
|
12
|
-
|
13
|
-
require 'faraday'
|
14
|
-
require 'faraday/follow_redirects'
|
15
|
-
require 'securerandom'
|
5
|
+
require "restiny/version"
|
6
|
+
require "restiny/constants"
|
7
|
+
require "restiny/errors"
|
8
|
+
require "restiny/manifest"
|
9
|
+
|
10
|
+
require "faraday"
|
11
|
+
require "faraday/follow_redirects"
|
12
|
+
require "securerandom"
|
16
13
|
|
17
14
|
module Restiny
|
18
15
|
extend self
|
@@ -30,7 +27,7 @@ module Restiny
|
|
30
27
|
@oauth_state = state || SecureRandom.hex(15)
|
31
28
|
|
32
29
|
params = {
|
33
|
-
response_type:
|
30
|
+
response_type: "code",
|
34
31
|
client_id: @oauth_client_id,
|
35
32
|
state: @oauth_state
|
36
33
|
}
|
@@ -45,24 +42,21 @@ module Restiny
|
|
45
42
|
|
46
43
|
params = {
|
47
44
|
code: code,
|
48
|
-
grant_type:
|
45
|
+
grant_type: "authorization_code",
|
49
46
|
client_id: @oauth_client_id
|
50
47
|
}
|
51
48
|
|
52
49
|
params[:redirect_url] = redirect_url unless redirect_url.nil?
|
53
50
|
|
54
|
-
post(
|
55
|
-
end
|
56
|
-
|
57
|
-
def request_refresh_token
|
51
|
+
post("/platform/app/oauth/token/", params, "Content-Type" => "application/x-www-form-urlencoded")
|
58
52
|
end
|
59
53
|
|
60
54
|
# Manifest methods
|
61
55
|
|
62
|
-
def download_manifest(locale =
|
56
|
+
def download_manifest(locale = "en")
|
63
57
|
response = get("/platform/Destiny2/Manifest/")
|
64
58
|
|
65
|
-
manifest_path = response.dig(
|
59
|
+
manifest_path = response.dig("Response", "mobileWorldContentPaths", locale)
|
66
60
|
raise Restiny::ResponseError.new("Unable to determine manifest URL") if manifest_path.nil?
|
67
61
|
|
68
62
|
Manifest.download(BUNGIE_URL + manifest_path)
|
@@ -72,39 +66,18 @@ module Restiny
|
|
72
66
|
|
73
67
|
def get_profile(membership_id, membership_type, components = [])
|
74
68
|
raise Restiny::InvalidParamsError.new("You must provide at least one component") if components.empty?
|
75
|
-
|
76
|
-
component_query = components.join(",")
|
77
|
-
response = get("/platform/Destiny2/#{membership_type}/Profile/#{membership_id}?components=#{component_query}")
|
78
|
-
|
79
|
-
{}.tap do |output|
|
80
|
-
components.each do |component|
|
81
|
-
case component.downcase
|
82
|
-
when 'characters'
|
83
|
-
output[:characters] = parse_profile_characters_response(response)
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
69
|
+
get("/platform/Destiny2/#{membership_type}/Profile/#{membership_id}?components=#{components.join(",")}")
|
87
70
|
end
|
88
71
|
|
89
72
|
# Account methods
|
90
73
|
|
91
74
|
def get_user_by_membership_id(membership_id, membership_type = PLATFORM_ALL)
|
92
75
|
raise Restiny::InvalidParamsError.new("You must provide a valid membership ID") if membership_id.nil?
|
93
|
-
|
94
|
-
response = get("/platform/User/GetMembershipsById/#{membership_id}/#{membership_type}/")
|
95
|
-
results = response.dig('Response')
|
96
|
-
|
97
|
-
return nil if results.nil?
|
98
|
-
|
99
|
-
Restiny::User.new(
|
100
|
-
display_name: results['bungieNetUser']['cachedBungieGlobalDisplayName'],
|
101
|
-
display_name_code: results['bungieNetUser']['cachedBungieGlobalDisplayNameCode'],
|
102
|
-
memberships: results['destinyMemberships']
|
103
|
-
)
|
76
|
+
get("/platform/User/GetMembershipsById/#{membership_id}/#{membership_type}/")
|
104
77
|
end
|
105
78
|
|
106
79
|
def get_user_by_bungie_name(full_display_name, membership_type = PLATFORM_ALL)
|
107
|
-
display_name, display_name_code = full_display_name.split(
|
80
|
+
display_name, display_name_code = full_display_name.split("#")
|
108
81
|
raise Restiny::InvalidParamsError.new("You must provide a valid Bungie name") if display_name.nil? || display_name_code.nil?
|
109
82
|
|
110
83
|
params = {
|
@@ -112,30 +85,11 @@ module Restiny
|
|
112
85
|
displayNameCode: display_name_code
|
113
86
|
}
|
114
87
|
|
115
|
-
|
116
|
-
result = response.dig('Response')
|
117
|
-
|
118
|
-
return nil if result.nil?
|
119
|
-
|
120
|
-
Restiny::User.new(
|
121
|
-
display_name: result[0]['bungieGlobalDisplayName'],
|
122
|
-
display_name_code: result[0]['bungieGlobalDisplayNameCode'],
|
123
|
-
memberships: result
|
124
|
-
)
|
88
|
+
post("/platform/Destiny2/SearchDestinyPlayerByBungieName/#{membership_type}/", params)
|
125
89
|
end
|
126
90
|
|
127
91
|
def search_users(name, page = 0)
|
128
|
-
|
129
|
-
search_results = response.dig('Response', 'searchResults')
|
130
|
-
return [] if search_results.nil?
|
131
|
-
|
132
|
-
search_results.map do |user|
|
133
|
-
Restiny::User.new(
|
134
|
-
display_name: user['bungieGlobalDisplayName'],
|
135
|
-
display_name_code: user['bungieGlobalDisplayNameCode'],
|
136
|
-
memberships: user['destinyMemberships']
|
137
|
-
)
|
138
|
-
end
|
92
|
+
post("/platform/User/Search/GlobalName/#{page}", displayNamePrefix: name)
|
139
93
|
end
|
140
94
|
|
141
95
|
private
|
@@ -154,45 +108,28 @@ module Restiny
|
|
154
108
|
headers[:authorization] = "Bearer #{@oauth_token}" if @oauth_token
|
155
109
|
|
156
110
|
response = case type
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
111
|
+
when :get
|
112
|
+
connection.get(url, params, headers)
|
113
|
+
when :post
|
114
|
+
connection.post(url, params, headers)
|
115
|
+
end
|
162
116
|
|
163
|
-
response.body
|
117
|
+
response.body&.dig("Response")
|
164
118
|
rescue Faraday::Error => error
|
165
|
-
message = if error.response_body && error.response_headers[
|
166
|
-
JSON.parse(error.response_body)
|
119
|
+
message = if error.response_body && error.response_headers["content-type"] =~ /application\/json;/i
|
120
|
+
error_response = JSON.parse(error.response_body)
|
121
|
+
"#{error_response["error_description"]} (#{error_response["error"]})"
|
167
122
|
else
|
168
123
|
error.message
|
169
124
|
end
|
170
125
|
|
171
126
|
case error
|
172
|
-
when Faraday::ClientError
|
173
|
-
raise Restiny::
|
127
|
+
when Faraday::ClientError
|
128
|
+
raise Restiny::RequestError.new(message, error.response_status)
|
129
|
+
when Faraday::ServerError
|
130
|
+
raise Restiny::ResponseError.new(message, error.response_status)
|
174
131
|
else
|
175
|
-
|
176
|
-
end
|
177
|
-
|
178
|
-
def parse_profile_characters_response(response)
|
179
|
-
characters = response.dig('Response', 'characters', 'data')
|
180
|
-
return [] if characters.nil?
|
181
|
-
|
182
|
-
result = []
|
183
|
-
|
184
|
-
[].tap do |result|
|
185
|
-
characters.each_value do |character|
|
186
|
-
result << Restiny::Character.new(
|
187
|
-
id: character['characterId'],
|
188
|
-
session_playtime: character['minutesPlayedThisSession'],
|
189
|
-
total_playtime: character['minutesPlayedTotal'],
|
190
|
-
light_level: character['light'],
|
191
|
-
stats: [],
|
192
|
-
emblem: [],
|
193
|
-
progression: character['progression']
|
194
|
-
)
|
195
|
-
end
|
132
|
+
raise Restiny::Error.new(message)
|
196
133
|
end
|
197
134
|
end
|
198
135
|
|
@@ -202,8 +139,8 @@ module Restiny
|
|
202
139
|
|
203
140
|
def default_headers
|
204
141
|
{
|
205
|
-
|
206
|
-
|
142
|
+
"User-Agent": "restiny v#{Restiny::VERSION}",
|
143
|
+
"X-API-KEY": @api_key
|
207
144
|
}
|
208
145
|
end
|
209
146
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: restiny
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Bogan
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-05-
|
11
|
+
date: 2023-05-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -86,42 +86,70 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
89
|
+
version: '13.0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
96
|
+
version: '13.0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: rspec
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: '3.
|
103
|
+
version: '3.12'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: '3.
|
110
|
+
version: '3.12'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rubocop-rspec
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '2.22'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '2.22'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: standard
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '1.28'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '1.28'
|
111
139
|
- !ruby/object:Gem::Dependency
|
112
140
|
name: vcr
|
113
141
|
requirement: !ruby/object:Gem::Requirement
|
114
142
|
requirements:
|
115
|
-
- - "
|
143
|
+
- - "~>"
|
116
144
|
- !ruby/object:Gem::Version
|
117
|
-
version: '
|
145
|
+
version: '6.1'
|
118
146
|
type: :development
|
119
147
|
prerelease: false
|
120
148
|
version_requirements: !ruby/object:Gem::Requirement
|
121
149
|
requirements:
|
122
|
-
- - "
|
150
|
+
- - "~>"
|
123
151
|
- !ruby/object:Gem::Version
|
124
|
-
version: '
|
152
|
+
version: '6.1'
|
125
153
|
description: A gem for interacting with Bungie's Destiny API.
|
126
154
|
email:
|
127
155
|
- d+restiny@waferbaby.com
|
@@ -130,18 +158,16 @@ extensions: []
|
|
130
158
|
extra_rdoc_files: []
|
131
159
|
files:
|
132
160
|
- lib/restiny.rb
|
133
|
-
- lib/restiny/character.rb
|
134
161
|
- lib/restiny/constants.rb
|
135
162
|
- lib/restiny/errors.rb
|
136
163
|
- lib/restiny/manifest.rb
|
137
164
|
- lib/restiny/membership.rb
|
138
|
-
- lib/restiny/user.rb
|
139
165
|
- lib/restiny/version.rb
|
140
166
|
homepage: http://github.com/waferbaby/restiny
|
141
167
|
licenses:
|
142
168
|
- MIT
|
143
169
|
metadata: {}
|
144
|
-
post_install_message:
|
170
|
+
post_install_message:
|
145
171
|
rdoc_options: []
|
146
172
|
require_paths:
|
147
173
|
- lib
|
@@ -156,8 +182,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
156
182
|
- !ruby/object:Gem::Version
|
157
183
|
version: '0'
|
158
184
|
requirements: []
|
159
|
-
rubygems_version: 3.
|
160
|
-
signing_key:
|
185
|
+
rubygems_version: 3.3.7
|
186
|
+
signing_key:
|
161
187
|
specification_version: 4
|
162
188
|
summary: A Destiny API gem
|
163
189
|
test_files: []
|
data/lib/restiny/character.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Restiny
|
4
|
-
class Character
|
5
|
-
attr_accessor :id, :playtime, :light_level, :stats, :emblem, :progression
|
6
|
-
|
7
|
-
def initialize(id:, session_playtime:, total_playtime:, light_level:, stats:, emblem:, progression:)
|
8
|
-
@id = id
|
9
|
-
@playtime = { session: session_playtime, total: total_playtime }
|
10
|
-
@light_level = light_level
|
11
|
-
@stats = stats
|
12
|
-
@emblem = emblem
|
13
|
-
@progression = progression
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
data/lib/restiny/user.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Restiny
|
4
|
-
class User
|
5
|
-
attr_reader :display_name, :display_name_code, :memberships
|
6
|
-
|
7
|
-
def initialize(display_name:, display_name_code:, memberships:)
|
8
|
-
@display_name = display_name
|
9
|
-
@display_name_code = display_name_code
|
10
|
-
|
11
|
-
self.memberships = memberships
|
12
|
-
end
|
13
|
-
|
14
|
-
def memberships=(raw_memberships)
|
15
|
-
@memberships = {}
|
16
|
-
|
17
|
-
raw_memberships.each do |ship|
|
18
|
-
platform = Restiny::Membership.platform(ship['membershipType'])
|
19
|
-
|
20
|
-
@memberships[platform] = Restiny::Membership.new(
|
21
|
-
id: ship['membershipId'],
|
22
|
-
type: ship['membershipType'],
|
23
|
-
cross_save_override: ship['crossSaveOverride'],
|
24
|
-
icon_path: ship['iconPath'],
|
25
|
-
is_public: ship['isPublic'],
|
26
|
-
types: ship['applicableMembershipTypes']
|
27
|
-
)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|