restiny 0.2.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 525f30b84be418f2709f43396452fe3fb5f1b7fc307f5096a6698da8a1a61d3b
4
- data.tar.gz: 3e008a19f1766d4d0a89a840e7439acae17d714bd5ec22cfd637af8aa9790f46
3
+ metadata.gz: 741ac894abe43506371ddd982baddc4fc151742a1b60a7d7c0fdf702d69c5a46
4
+ data.tar.gz: 2bde117539309611f7bb2f7f859903195352cad1ba1158546238876496d3efa3
5
5
  SHA512:
6
- metadata.gz: 4a741c23f022a5a9faa659aa26a8de4b39233caceaf1b11713209b605012d0cf721b2c2f06c4bbb865fe5f28f166d0b88a1446a06052aad88b35810ebc293a33
7
- data.tar.gz: 530fd77d6b734bf749e9ce55b950dae7da4acc8f4719c95d57bf8f3dbb6403f0b804b7960b09cc434814b6f77e1c649ca651b86e649dd3b69081cea56d3e0359
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,94 +1,94 @@
1
1
  # frozen_string/literal: true
2
-
3
- require 'down'
4
- require 'json'
5
- require 'sqlite3'
6
- require 'zip'
2
+ require "down"
3
+ require "json"
4
+ require "sqlite3"
5
+ require "zip"
7
6
 
8
7
  module Restiny
9
8
  class Manifest
10
9
  TABLES = {
11
- 'DestinyAchievementDefinition': { item: 'achievement', items: 'achievements' },
12
- 'DestinyActivityDefinition': { item: 'activity', items: 'activities' },
13
- 'DestinyActivityGraphDefinition': { item: 'activity_graph', items: 'activity_graphs' },
14
- 'DestinyActivityModeDefinition': { item: 'activity_modes', items: 'activity_modes' },
15
- 'DestinyActivityModifierDefinition': { item: 'activity_modifier', items: 'activity_modifiers' },
16
- 'DestinyActivityTypeDefinition': { item: 'activity_type', items: 'activity_types' },
17
- 'DestinyArtifactDefinition': { item: 'artifact', items: 'artifacts' },
18
- 'DestinyBondDefinition': { item: 'bond', items: 'bonds' },
19
- 'DestinyBreakerTypeDefinition': { item: 'breaker_type', items: 'breaker_types' },
20
- 'DestinyChecklistDefinition': { item: 'checklist', items: 'checklists' },
21
- 'DestinyClassDefinition': { item: 'class', items: 'classes' },
22
- 'DestinyCollectibleDefinition': { item: 'collectible', items: 'collectibles' },
23
- 'DestinyDamageTypeDefinition': { item: 'damage_type', items: 'damage_types' },
24
- 'DestinyDestinationDefinition': { item: 'destination', items: 'destinations' },
25
- 'DestinyEnergyTypeDefinition': { item: 'energy_type', items: 'energy_types' },
26
- 'DestinyEquipmentSlotDefinition': { item: 'equipment_slot', items: 'equipment_slots' },
27
- 'DestinyEventCardDefinition': { item: 'event_card', items: 'event_cards' },
28
- 'DestinyFactionDefinition': { item: 'faction', items: 'factions' },
29
- 'DestinyGenderDefinition': { item: 'gender', items: 'genders' },
30
- 'DestinyHistoricalStatsDefinition': { item: 'historical_stat', items: 'historical_stats' },
31
- 'DestinyInventoryBucketDefinition': { item: 'inventory_bucket', items: 'inventory_buckets' },
32
- 'DestinyInventoryItemDefinition': { item: 'inventory_item', items: 'inventory_items' },
33
- 'DestinyItemCategoryDefinition': { item: 'item_category', items: 'item_categories' },
34
- 'DestinyItemTierTypeDefinition': { item: 'item_tier_type', items: 'item_tier_types' },
35
- 'DestinyLocationDefinition': { item: 'location', items: 'locations' },
36
- 'DestinyLoreDefinition': { item: 'lore', items: 'lore_entries' },
37
- 'DestinyMaterialRequirementSetDefinition': { item: 'material_requirement_set', items: 'material_requirement_sets' },
38
- 'DestinyMedalTierDefinition': { item: 'medal_tier', items: 'medal_tiers' },
39
- 'DestinyMetricDefinition': { item: 'metric', items: 'metrics' },
40
- 'DestinyMilestoneDefinition': { item: 'milestone', items: 'milestones' },
41
- 'DestinyObjectiveDefinition': { item: 'objective', items: 'objectives' },
42
- 'DestinyPlaceDefinition': { item: 'place', items: 'places' },
43
- 'DestinyPlugSetDefinition': { item: 'plug_set', items: 'plug_sets' },
44
- 'DestinyPowerCapDefinition': { item: 'power_cap', items: 'power_caps' },
45
- 'DestinyPresentationNodeDefinition': { item: 'presentation_node', items: 'presentation_nodes' },
46
- 'DestinyProgressionDefinition': { item: 'progression', items: 'progression_data' },
47
- 'DestinyProgressionLevelRequirementDefinition': { item: 'progression_level_requirement', items: 'progression_level_requirements' },
48
- 'DestinyRaceDefinition': { item: 'race', items: 'races' },
49
- 'DestinyRecordDefinition': { item: 'record', items: 'records' },
50
- 'DestinyReportReasonCategoryDefinition': { item: 'report_reason_category', items: 'report_reason_categories' },
51
- 'DestinyRewardSourceDefinition': { item: 'reward_source', items: 'reward_sources' },
52
- 'DestinySackRewardItemListDefinition': { item: 'sack_reward_item_list', items: 'sack_reward_item_lists' },
53
- 'DestinySandboxPatternDefinition': { item: 'sandbox_pattern', items: 'sandbox_patterns' },
54
- 'DestinySandboxPerkDefinition': { item: 'sandbox_perk', items: 'sandbox_perks' },
55
- 'DestinySeasonDefinition': { item: 'season', items: 'seasons' },
56
- 'DestinySeasonPassDefinition': { item: 'season_pass', items: 'season_passes' },
57
- 'DestinySocketCategoryDefinition': { item: 'socket_category', items: 'socket_categories' },
58
- 'DestinySocketTypeDefinition': { item: 'socket_type', items: 'socket_types' },
59
- 'DestinyStatDefinition': { item: 'stat', items: 'stats' },
60
- 'DestinyStatGroupDefinition': { item: 'stat_group', items: 'stat_groups' },
61
- 'DestinyTalentGridDefinition': { item: 'talent_grid', items: 'talent_grids' },
62
- 'DestinyTraitCategoryDefinition': { item: 'trait_category', items: 'trait_categories' },
63
- 'DestinyTraitDefinition': { item: 'trait', items: 'traits' },
64
- 'DestinyUnlockDefinition': { item: 'unlock', items: 'unlocks' },
65
- 'DestinyVendorDefinition': { item: 'vendor', items: 'vendors' },
66
- 'DestinyVendorGroupDefinition': { 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"}
67
65
  }
68
66
 
69
67
  attr_reader :file_path
70
68
 
71
69
  TABLES.each do |table_name, method_names|
72
- define_method method_names[:item] do |id|
73
- query_table(table_name, id: id)[0]
70
+ full_table_name = "Destiny#{table_name}Definition"
71
+
72
+ define_method method_names[:item] do |hash|
73
+ fetch_item(full_table_name, hash)
74
74
  end
75
75
 
76
- define_method method_names[:items] do |limit: nil|
77
- query_table(table_name, limit: limit)
76
+ define_method method_names[:items] do |options = {}|
77
+ fetch_items(full_table_name, options)
78
78
  end
79
79
  end
80
80
 
81
81
  def self.download(url)
82
82
  zipped_file = Down.download(url)
83
- manifest_path = zipped_file.path + ".db"
83
+ manifest_path = zipped_file.path + ".db"
84
84
 
85
85
  Zip::File.open(zipped_file) { |file| file.first.extract(manifest_path) }
86
86
 
87
- self.new(manifest_path)
87
+ new(manifest_path)
88
88
  rescue Down::ResponseError => error
89
89
  raise Restiny::NetworkError.new("Unable to download the manifest file", error.response.code)
90
90
  rescue Zip::Error => error
91
- raise Restiny::Error.new("Unable to unzip the manifest file (#{e})")
91
+ raise Restiny::Error.new("Unable to unzip the manifest file (#{error})")
92
92
  end
93
93
 
94
94
  def initialize(file_path)
@@ -102,42 +102,44 @@ module Restiny
102
102
 
103
103
  private
104
104
 
105
- def self.clean_row_keys(row_hash)
106
- OpenStruct.new.tap do |output|
107
- row_hash.each_pair do |key, value|
108
- key = key.gsub(/(\B[A-Z])/, '_\1') if key =~ /\B[A-Z]/
109
- output[key.downcase] = if value.is_a?(Hash)
110
- clean_row_keys(value)
111
- elsif value.is_a?(Array)
112
- value.map { |item| item.is_a?(Hash) ? clean_row_keys(item) : value }
113
- else
114
- value
115
- end
116
- end
117
- end
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})")
118
114
  end
119
115
 
120
- def query_table(table_name, id: nil, limit: nil)
121
- query = "SELECT json FROM #{table_name}"
116
+ def fetch_items(table_name, options = {})
122
117
  bindings = []
123
118
 
124
- if id
125
- query << " WHERE id=?"
126
- bindings << id
127
- end
128
-
129
- query << " ORDER BY json_extract(json, '$.index')" unless id
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')"
130
122
 
131
- if limit
123
+ if options[:limit]
132
124
  query << " LIMIT ?"
133
- bindings << limit
125
+ bindings << options[:limit]
134
126
  end
135
127
 
136
- @database.execute(query, bindings).map do |row|
137
- Manifest::clean_row_keys(JSON.parse(row['json'])) unless row['json'].nil?
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
138
  end
139
+
140
+ result unless block_given?
139
141
  rescue SQLite3::Exception => e
140
- raise Restiny::Error.new("Error while querying the manifest (#{e})")
142
+ raise Restiny::RequestError.new("Error while fetching item (#{e})")
141
143
  end
142
144
  end
143
145
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Restiny
4
- VERSION = '0.2.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.2.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-10 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