restiny 0.3.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/restiny/constants.rb +39 -10
- 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 -17
- data/lib/restiny/character.rb +0 -17
- data/lib/restiny/membership.rb +0 -29
- 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: b64ce91b4d100a18724e027008c5f22feaea7749e99ed3903f881cdf57dd514e
|
4
|
+
data.tar.gz: 4494857bb6bcc684b92fa8215eebbaad2f1406d4236cb8be4e22f956eb98d8e6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: af7e65d052b3860b97fee42d8c38430e61aed8ab2e6e0435ff25ab74aa27433aebbf6e5267bd13b800d53559e9a6d99a3cc2e9e08972d1fbb8c5097d10bdc484
|
7
|
+
data.tar.gz: 96d3dff6141def2d34948409525a9d66a80c3c4ed394c922fe44eb20b9026b59486eea93dec3962d94438fcb7ff641821ce091aeeebf3ef1bb9617569856de44
|
data/lib/restiny/constants.rb
CHANGED
@@ -1,12 +1,41 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
3
|
+
module Restiny
|
4
|
+
module Platform
|
5
|
+
ALL = -1
|
6
|
+
XBOX = 1
|
7
|
+
PSN = 2
|
8
|
+
STEAM = 3
|
9
|
+
EPIC = 6
|
10
|
+
end
|
11
|
+
|
12
|
+
module ComponentType
|
13
|
+
PROFILES = "Profiles"
|
14
|
+
PROFILE_INVENTORIES = "ProfileInventories"
|
15
|
+
CHARACTERS = "Characters"
|
16
|
+
CHARACTER_INVENTORIES = "CharacterInventories"
|
17
|
+
end
|
18
|
+
|
19
|
+
module ItemLocation
|
20
|
+
UNKNOWN = 0
|
21
|
+
INVENTORY = 1
|
22
|
+
VAULT = 2
|
23
|
+
VENDOR = 3
|
24
|
+
POSTMASTER = 4
|
25
|
+
end
|
26
|
+
|
27
|
+
module TierType
|
28
|
+
UNKNOWN = 0
|
29
|
+
CURRENCY = 1
|
30
|
+
BASIC = 2
|
31
|
+
COMMON = 3
|
32
|
+
RARE = 4
|
33
|
+
SUPERIOR = 5
|
34
|
+
EXOTIC = 6
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
COMPONENT_TYPE_PROFILES = "Profiles"
|
39
|
+
COMPONENT_TYPE_PROFILE_INVENTORIES = "ProfileInventories"
|
40
|
+
COMPONENT_TYPE_CHARACTERS = "Characters"
|
41
|
+
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.5.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-26 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,15 @@ 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
|
-
- lib/restiny/membership.rb
|
138
|
-
- lib/restiny/user.rb
|
139
164
|
- lib/restiny/version.rb
|
140
165
|
homepage: http://github.com/waferbaby/restiny
|
141
166
|
licenses:
|
142
167
|
- MIT
|
143
168
|
metadata: {}
|
144
|
-
post_install_message:
|
169
|
+
post_install_message:
|
145
170
|
rdoc_options: []
|
146
171
|
require_paths:
|
147
172
|
- lib
|
@@ -156,8 +181,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
156
181
|
- !ruby/object:Gem::Version
|
157
182
|
version: '0'
|
158
183
|
requirements: []
|
159
|
-
rubygems_version: 3.
|
160
|
-
signing_key:
|
184
|
+
rubygems_version: 3.3.7
|
185
|
+
signing_key:
|
161
186
|
specification_version: 4
|
162
187
|
summary: A Destiny API gem
|
163
188
|
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/membership.rb
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Restiny
|
4
|
-
class Membership
|
5
|
-
attr_reader :id, :type, :cross_save_override, :icon_path, :is_public, :types
|
6
|
-
|
7
|
-
def self.platform(type)
|
8
|
-
case type
|
9
|
-
when PLATFORM_XBOX
|
10
|
-
:xbox
|
11
|
-
when PLATFORM_PSN
|
12
|
-
:playstation
|
13
|
-
when PLATFORM_STEAM
|
14
|
-
:steam
|
15
|
-
when PLATFORM_EPIC
|
16
|
-
:epic
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def initialize(id:, type:, cross_save_override:, icon_path:, is_public:, types:)
|
21
|
-
@id = id
|
22
|
-
@type = type
|
23
|
-
@cross_save_override = cross_save_override
|
24
|
-
@icon_path = icon_path
|
25
|
-
@is_public = is_public
|
26
|
-
@types = types
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
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
|