restiny 2.0.1 → 3.1.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: 2d5b81f9aadd44def19fb9af625b26692992457edaf57eeba97b46896f26e032
4
- data.tar.gz: f058584408a167934ae67f9e8c160f75e542f80558446ee312fa2ce34b763ace
3
+ metadata.gz: b1d08e2f02105ea2a6330679fe9cae0534bbb4a7d3c0fb7803d43fc70ae4ebdd
4
+ data.tar.gz: 80ab03d4fdbbf65ae276265f89e7c00d9a4f55870fdc0398893e45d429f44179
5
5
  SHA512:
6
- metadata.gz: 5b737a79ec4728c34106b701db09f654c9d642cfd62b3ff311501a70afcf954f07ad92f0d1282c9a59686bffef568ef2b1fb5466e97cd267b389c1634c28b742
7
- data.tar.gz: 99c7c3c4519a6a539a11a2970f18a38443ee4a9587b6df980cb74b03e425f1ce134e48c075af0d5b8d29339e086310eda6c44ac352e0b4daf80997923fded98b
6
+ metadata.gz: 4abf818ba76d6f6fefbf2070a1d56162462ac2d5a22dae7725383c34ae884d901be3539b78342510beaa93ddc9c3a554e90fcee473825bdcad144ab9a88af8c5
7
+ data.tar.gz: 78f09f843a2e5c00067b95e1e5aad5a938d181c56081b744e1ae0638605af65548de6d4b117d3667e326bc9ed2ef61aaa80b673990f15cc490045aa2aa9f95ca
@@ -9,20 +9,6 @@ module Restiny
9
9
  EPIC = 6
10
10
  end
11
11
 
12
- module ComponentType
13
- CHARACTERS = "Characters"
14
- CHARACTER_EQUIPMENT = "CharacterEquipment"
15
- CHARACTER_INVENTORIES = "CharacterInventories"
16
- CHARACTER_LOADOUTS = "CharacterLoadouts"
17
- PROFILES = "Profiles"
18
- PROFILE_INVENTORIES = "ProfileInventories"
19
- ITEM_INSTANCES = "ItemInstances"
20
- ITEM_SOCKETS = "ItemSockets"
21
- ITEM_COMMON_DATA = "ItemCommonData"
22
- ITEM_PLUG_STATES = "ItemPlugStates"
23
- ITEM_REUSABLE_PLUGS = "ItemReusablePlugs"
24
- end
25
-
26
12
  module ItemLocation
27
13
  UNKNOWN = 0
28
14
  INVENTORY = 1
@@ -41,7 +27,7 @@ module Restiny
41
27
  EXOTIC = 6
42
28
  end
43
29
 
44
- module Class
30
+ module GuardianClass
45
31
  TITAN = 0
46
32
  HUNTER = 1
47
33
  WARLOCK = 2
@@ -68,4 +54,18 @@ module Restiny
68
54
  HEAVY = 3
69
55
  UNKNOWN = 4
70
56
  end
57
+
58
+ module ComponentType
59
+ CHARACTERS = "Characters"
60
+ CHARACTER_EQUIPMENT = "CharacterEquipment"
61
+ CHARACTER_INVENTORIES = "CharacterInventories"
62
+ CHARACTER_LOADOUTS = "CharacterLoadouts"
63
+ PROFILES = "Profiles"
64
+ PROFILE_INVENTORIES = "ProfileInventories"
65
+ ITEM_INSTANCES = "ItemInstances"
66
+ ITEM_SOCKETS = "ItemSockets"
67
+ ITEM_COMMON_DATA = "ItemCommonData"
68
+ ITEM_PLUG_STATES = "ItemPlugStates"
69
+ ITEM_REUSABLE_PLUGS = "ItemReusablePlugs"
70
+ end
71
71
  end
@@ -8,6 +8,9 @@ module Restiny
8
8
  end
9
9
  end
10
10
 
11
+ class NetworkError < Error
12
+ end
13
+
11
14
  class RequestError < Error
12
15
  end
13
16
 
@@ -1,8 +1,6 @@
1
1
  # frozen_string/literal: true
2
- require "down"
3
- require "json"
2
+
4
3
  require "sqlite3"
5
- require "zip"
6
4
 
7
5
  module Restiny
8
6
  class Manifest
@@ -72,7 +70,7 @@ module Restiny
72
70
  VendorGroup: %w[vendor_group vendor_groups]
73
71
  }
74
72
 
75
- attr_reader :file_path
73
+ attr_reader :file_path, :version
76
74
 
77
75
  ENTITIES.each do |entity, method_names|
78
76
  full_table_name = "Destiny#{entity}Definition"
@@ -87,26 +85,14 @@ module Restiny
87
85
  end
88
86
  end
89
87
 
90
- def self.download_by_url(url)
91
- zipped_file = Down.download(url)
92
- manifest_path = zipped_file.path + ".db"
93
-
94
- Zip::File.open(zipped_file) { |file| file.first.extract(manifest_path) }
95
-
96
- new(manifest_path)
97
- rescue Down::ResponseError => error
98
- raise Restiny::NetworkError.new("Unable to download the manifest file", error.response.code)
99
- rescue Zip::Error => error
100
- raise Restiny::Error.new("Unable to unzip the manifest file (#{error})")
101
- end
102
-
103
- def initialize(file_path)
88
+ def initialize(file_path, version)
104
89
  if file_path.empty? || !File.exist?(file_path) || !File.file?(file_path)
105
90
  raise Restiny::InvalidParamsError.new("You must provide a valid path for the manifest file")
106
91
  end
107
92
 
108
93
  @database = SQLite3::Database.new(file_path, results_as_hash: true)
109
94
  @file_path = file_path
95
+ @version = version
110
96
  end
111
97
 
112
98
  private
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Restiny
4
- VERSION = "2.0.1"
4
+ VERSION = "3.1.0"
5
5
  end
data/lib/restiny.rb CHANGED
@@ -11,7 +11,11 @@ require "faraday"
11
11
  require "faraday/follow_redirects"
12
12
  require "faraday/destiny/api"
13
13
  require "faraday/destiny/auth"
14
+
15
+ require "down"
16
+ require "json"
14
17
  require "securerandom"
18
+ require "zip"
15
19
 
16
20
  module Restiny
17
21
  extend self
@@ -19,7 +23,7 @@ module Restiny
19
23
  BUNGIE_URL = "https://www.bungie.net"
20
24
  API_BASE_URL = BUNGIE_URL + "/platform"
21
25
 
22
- attr_accessor :api_key, :oauth_state, :oauth_client_id, :access_token, :refresh_token, :manifest
26
+ attr_accessor :api_key, :oauth_state, :oauth_client_id, :access_token, :user_agent
23
27
 
24
28
  # OAuth methods
25
29
 
@@ -29,7 +33,7 @@ module Restiny
29
33
  @oauth_state = state || SecureRandom.hex(15)
30
34
 
31
35
  params = { response_type: "code", client_id: @oauth_client_id, state: @oauth_state }
32
- params[:redirect_url] = redirect_url unless redirect_url.nil?
36
+ params["redirect_url"] = redirect_url unless redirect_url.nil?
33
37
 
34
38
  auth_connection.build_url(BUNGIE_URL + "/en/oauth/authorize/", params).to_s
35
39
  end
@@ -38,23 +42,39 @@ module Restiny
38
42
  check_oauth_client_id
39
43
 
40
44
  params = { code: code, grant_type: "authorization_code", client_id: @oauth_client_id }
41
- params[:redirect_url] = redirect_url unless redirect_url.nil?
45
+ params["redirect_url"] = redirect_url unless redirect_url.nil?
42
46
 
43
47
  auth_post("app/oauth/token/", params)
44
48
  end
45
49
 
46
50
  # Manifest methods
47
51
 
48
- def get_manifest_url(locale: "en")
49
- result = api_get("Destiny2/Manifest/").dig("mobileWorldContentPaths", locale)
50
- BUNGIE_URL + result
51
- end
52
+ def get_manifest(locale: "en", force_download: false)
53
+ result = api_get("Destiny2/Manifest/")
54
+ raise Restiny::ResponseError.new("Unable to determine manifest details") if result.nil?
55
+
56
+ live_version = result.dig("version")
57
+
58
+ @manifests ||= {}
59
+ @manifest_versions ||= {}
52
60
 
53
- def download_manifest(locale: "en")
54
- manifest_url = get_manifest_url
55
- raise Restiny::ResponseError.new("Unable to determine manifest URL") if manifest_url.nil?
61
+ if force_download || @manifests[locale].nil? || @manifest_versions[locale] != live_version
62
+ url = BUNGIE_URL + result.dig("mobileWorldContentPaths", locale)
56
63
 
57
- Manifest.download_by_url(BUNGIE_URL + manifest_url)
64
+ zipped_file = Down.download(url)
65
+ database_file_path = zipped_file.path + ".db"
66
+
67
+ Zip::File.open(zipped_file) { |file| file.first.extract(database_file_path) }
68
+
69
+ @manifests[locale] = Manifest.new(database_file_path, live_version)
70
+ @manifest_versions[locale] = live_version
71
+ end
72
+
73
+ @manifests[locale]
74
+ rescue Down::Error => error
75
+ raise Restiny::NetworkError.new("Unable to download the manifest file", error.response.code)
76
+ rescue Zip::Error => error
77
+ raise Restiny::Error.new("Unable to unzip the manifest file (#{error})")
58
78
  end
59
79
 
60
80
  # Profile and related methods
@@ -96,6 +116,17 @@ module Restiny
96
116
  api_get("User/GetMembershipsById/#{membership_id}/#{membership_type}/")
97
117
  end
98
118
 
119
+ def get_primary_membership(parent_membership_id, use_fallback: true)
120
+ result = get_user_memberships_by_id(parent_membership_id)
121
+ return nil if result.nil? || result["primaryMembershipId"].nil?
122
+
123
+ result["destinyMemberships"].each do |membership|
124
+ return membership if membership["membershipID"] == result["primaryMembershipId"]
125
+ end
126
+
127
+ return result["destinyMemberships"][0] if use_fallback
128
+ end
129
+
99
130
  def search_player_by_bungie_name(name, membership_type: Platform::ALL)
100
131
  display_name, display_name_code = name.split("#")
101
132
  if display_name.nil? || display_name_code.nil?
@@ -136,7 +167,7 @@ module Restiny
136
167
  end
137
168
 
138
169
  def default_headers
139
- { "User-Agent": "restiny v#{Restiny::VERSION}" }
170
+ { "User-Agent": @user_agent || "restiny v#{Restiny::VERSION}" }
140
171
  end
141
172
 
142
173
  def api_connection
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: 2.0.1
4
+ version: 3.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Bogan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-07-02 00:00:00.000000000 Z
11
+ date: 2023-08-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday