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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9ad23e571d4f6b91fc296e0578074983f8d6883518ffe94743a6003bbf20dfd0
4
- data.tar.gz: 6aba22d2cfb3a8bc2f8c93d0a11ccfef63a55eaa8aaec008a3b769710d4b3ff5
3
+ metadata.gz: 741ac894abe43506371ddd982baddc4fc151742a1b60a7d7c0fdf702d69c5a46
4
+ data.tar.gz: 2bde117539309611f7bb2f7f859903195352cad1ba1158546238876496d3efa3
5
5
  SHA512:
6
- metadata.gz: e600c2e4a0552420404dd6aa11692613e65cd6ee7efddc7a5200f8750569e39f259d5156b25fb8baca7175f7575b870794827213548e74877c7faeea23c18e75
7
- data.tar.gz: 2e319308c54b1e793862400bc5ff362d0570924edf372d1f07a1f06766210e031dda2c79b7db8d171588d8dc8b849c482f6bb4d0ca86902e7d739bd6c831a410
6
+ metadata.gz: c301404d8149756a2cfab53a871fdbb8e1f68dd3cecd0a9d52698c54d421d6547588ea9dd8bc0f34584b9f9471d59a46df8af3f3d8c7603a13205fee619a9202
7
+ data.tar.gz: dae32ebf9a7646304782d6f3ccaca965d704bd0d62f0a8429abd1820877570deeb4054cc4ccbd9f77f58800d366cda30589e1e6d912b6d6576e3cae6f682f026
@@ -6,7 +6,7 @@ PLATFORM_PSN = 2
6
6
  PLATFORM_STEAM = 3
7
7
  PLATFORM_EPIC = 6
8
8
 
9
- COMPONENT_TYPE_PROFILES = 'Profiles'.freeze
10
- COMPONENT_TYPE_PROFILE_INVENTORIES = 'ProfileInventories'.freeze
11
- COMPONENT_TYPE_CHARACTERS = 'Characters'.freeze
12
- COMPONENT_TYPE_CHARACTER_INVENTORIES = 'CharacterInventories'.freeze
9
+ COMPONENT_TYPE_PROFILES = "Profiles"
10
+ COMPONENT_TYPE_PROFILE_INVENTORIES = "ProfileInventories"
11
+ COMPONENT_TYPE_CHARACTERS = "Characters"
12
+ COMPONENT_TYPE_CHARACTER_INVENTORIES = "CharacterInventories"
@@ -1,19 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Restiny
4
- class Error < StandardError; end
5
- class RequestError < Error; end
6
- class InvalidParamsError < RequestError; end
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
@@ -1,68 +1,67 @@
1
1
  # frozen_string/literal: true
2
- require 'down'
3
- require 'json'
4
- require 'sqlite3'
5
- require 'zip'
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
- 'Achievement': { item: 'achievement', items: 'achievements' },
11
- 'Activity': { item: 'activity', items: 'activities' },
12
- 'ActivityGraph': { item: 'activity_graph', items: 'activity_graphs' },
13
- 'ActivityMode': { item: 'activity_modes', 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: 'class', items: '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
- 'TraitCategory': { item: 'trait_category', items: 'trait_categories' },
62
- 'Trait': { item: 'trait', items: 'traits' },
63
- 'Unlock': { item: 'unlock', items: 'unlocks' },
64
- 'Vendor': { item: 'vendor', items: 'vendors' },
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
- query = "SELECT json FROM #{full_table_name} WHERE json_extract(json, '$.hash')=?"
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 |limit: nil, filter_empty: false, &block|
81
- query = "SELECT json_extract(json, '$.hash') AS hash, json_extract(json, '$.displayProperties.name') AS name
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
- self.new(manifest_path)
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 (#{e})")
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 perform_query(query, bindings, &block)
123
- @database.execute(query, bindings)
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 querying the manifest (#{e})")
142
+ raise Restiny::RequestError.new("Error while fetching item (#{e})")
126
143
  end
127
144
  end
128
145
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Restiny
4
- VERSION = '0.3.0'
4
+ VERSION = "0.4.0"
5
5
  end
data/lib/restiny.rb CHANGED
@@ -2,17 +2,14 @@
2
2
 
3
3
  $LOAD_PATH.unshift(__dir__)
4
4
 
5
- require 'restiny/version'
6
- require 'restiny/constants'
7
- require 'restiny/errors'
8
- require 'restiny/manifest'
9
- require 'restiny/user'
10
- require 'restiny/membership'
11
- require 'restiny/character'
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: 'code',
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: 'authorization_code',
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('/platform/app/oauth/token/', params, "Content-Type" => "application/x-www-form-urlencoded")
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 = 'en')
56
+ def download_manifest(locale = "en")
63
57
  response = get("/platform/Destiny2/Manifest/")
64
58
 
65
- manifest_path = response.dig('Response', 'mobileWorldContentPaths', locale)
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
- response = post("/platform/Destiny2/SearchDestinyPlayerByBungieName/#{membership_type}/", params)
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
- response = post("/platform/User/Search/GlobalName/#{page}", displayNamePrefix: name)
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
- when :get
158
- connection.get(url, params, headers)
159
- when :post
160
- connection.post(url, params, headers)
161
- end
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['content-type'] =~ /application\/json;/i
166
- JSON.parse(error.response_body)['Message']
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, Faraday::ServerError, Faraday::ConnectionFailed
173
- raise Restiny::NetworkError.new(message, error.response_status)
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
- end
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
- 'User-Agent': "restiny v#{Restiny::VERSION}",
206
- 'X-API-KEY': @api_key
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.3.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-15 00:00:00.000000000 Z
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: 12.3.3
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: 12.3.3
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.10'
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.10'
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: '0'
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: '0'
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.1.6
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: []
@@ -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