admiral_stats_parser 1.14.1 → 1.15.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
  SHA1:
3
- metadata.gz: 6249a56ebe7373db336e171a31678f363a8c1e65
4
- data.tar.gz: 4e8539b79295a4a2d5ad60f1c8d7ef03872bff28
3
+ metadata.gz: d3f2d0f49ebaf289106652ca0d113c9ad4a76599
4
+ data.tar.gz: 52ebd6874fe62e3efde5697e167f67cd70147f4c
5
5
  SHA512:
6
- metadata.gz: e83aa86adb4781293bbcc1bac2e9c07bb763dee26d8d35c5c6e26000e38b8dc6768ebd50d6a45b22a6b3fcf71e49eb7dacd3c03b393fb3ec3eb9f7c4fc400e06
7
- data.tar.gz: 2c5ea481dc84e741d9980e87508f9eccef24047d26192cd9e2a23c5226e58019adb00bc7ea2f89dfcf4385343efdfd6bfc64770851e414c243ba0235d1e582b9
6
+ metadata.gz: d6a7f4c3883e36d5b7a741153f2925c2a49f1b3dc28767333e81c86f17873c849d4bf7715c23a83b66f410155cfee4ef65c894c096a1e0cb1c5d6493f540038a
7
+ data.tar.gz: da6b4cc1efab62bf0ed05f6c6aff8664721894cf95cc9730cf5d4760dfad52a317f9192529b702960f300a93b9cb2381d11a4e026fa5ee0821de04036a87f20b
data/README.md CHANGED
@@ -46,6 +46,9 @@ AdmiralStatsParser.parse_event_info(json, api_version)
46
46
 
47
47
  # 改装設計図一覧
48
48
  AdmiralStatsParser.parse_blueprint_list_info(json, api_version)
49
+
50
+ # 輸送イベント海域情報
51
+ AdmiralStatsParser.parse_cop_info(json, api_version)
49
52
  ```
50
53
 
51
54
  ## Specification
@@ -69,7 +72,8 @@ AdmiralStatsParser は、以下の API version をサポートしています。
69
72
  | 11 | 2018-02-01 (VERSION A REVISION 3 のリリース日) 〜 2018-02-15 |
70
73
  | 12 | 2018-02-16 (ケッコンカッコカリの実装日) 〜 2018-04-18 |
71
74
  | 13 | 2018-04-19 (第4回イベントの EO 開始日) 〜 2018-05-13 |
72
- | 14 | 2018-05-14 (大型艦建造の実装日) 〜 |
75
+ | 14 | 2018-05-14 (大型艦建造の実装日) 〜 2018-07-23 |
76
+ | 15 | 2018-07-24 (VERSION B のリリース日) 〜 |
73
77
 
74
78
  各 API version でパースできる JSON の種類は以下の通りです。また、同じ情報でも、API version によって、含まれる情報量が異なる場合があります。その場合は Supported (1), Supported (2) のように記載して区別しています。
75
79
 
@@ -80,7 +84,7 @@ AdmiralStatsParser は、以下の API version をサポートしています。
80
84
  | 7 〜 10 | Supported (3) | Supported (3) | Supported (2) | Supported |
81
85
  | 11 | Supported (3) | Supported (4) | Supported (2) | Supported |
82
86
  | 12 〜 13 | Supported (3) | Supported (4) | Supported (3) | Supported |
83
- | 14 | Supported (3) | Supported (4) | Supported (4) | Supported |
87
+ | 14 〜 15 | Supported (3) | Supported (4) | Supported (4) | Supported |
84
88
 
85
89
  | API version | 艦娘一覧 | 装備一覧 | イベント海域情報 |
86
90
  |------------:|:-----|:-----|:-----|
@@ -93,13 +97,14 @@ AdmiralStatsParser は、以下の API version をサポートしています。
93
97
  | 9 〜 11 | Supported (4) | Supported (2) | Supported (2) |
94
98
  | 12 | Supported (5) | Supported (2) | Supported (2) |
95
99
  | 13 | Supported (5) | Supported (2) | Supported (3) |
96
- | 14 | Supported (6) | Supported (2) | Supported (3) |
97
-
98
- | API version | 改装設計図一覧 |
99
- |------------:|:-----|
100
- | 1 〜 6 | Unsupported |
101
- | 7 | Supported (1) |
102
- | 8 〜 14 | Supported (2) |
100
+ | 14 〜 15 | Supported (6) | Supported (2) | Supported (3) |
101
+
102
+ | API version | 改装設計図一覧 | 輸送イベント海域情報 |
103
+ |------------:|:-----|:-----|
104
+ | 1 〜 6 | Unsupported | Unsupported |
105
+ | 7 | Supported (1) | Unsupported |
106
+ | 8 〜 14 | Supported (2) | Unsupported |
107
+ | 15 | Supported (2) | Supported (1) |
103
108
 
104
109
  ## Development
105
110
 
@@ -8,11 +8,12 @@ require 'admiral_stats_parser/parser/character_list_info_parser'
8
8
  require 'admiral_stats_parser/parser/equip_list_info_parser'
9
9
  require 'admiral_stats_parser/parser/event_info_parser'
10
10
  require 'admiral_stats_parser/parser/blueprint_list_info_parser'
11
+ require 'admiral_stats_parser/parser/cop_info_parser'
11
12
 
12
13
  module AdmiralStatsParser
13
14
  # 最新の API バージョンを返します。
14
15
  def self.get_latest_api_version
15
- return 14
16
+ return 15
16
17
  end
17
18
 
18
19
  # エクスポート時刻を元に、API バージョンを推測して返します。
@@ -56,6 +57,9 @@ module AdmiralStatsParser
56
57
  # version 14 の開始日
57
58
  return 13 if exported_at < Time.parse('2018-05-14T07:00:00+0900')
58
59
 
60
+ # version 15 の開始日
61
+ return 14 if exported_at < Time.parse('2018-07-24T07:00:00+0900')
62
+
59
63
  return self.get_latest_api_version
60
64
  end
61
65
 
@@ -66,7 +70,7 @@ module AdmiralStatsParser
66
70
  PersonalBasicInfoParser.parse(json, 1)
67
71
  when 2..6
68
72
  PersonalBasicInfoParser.parse(json, 2)
69
- when 7..14
73
+ when 7..15
70
74
  PersonalBasicInfoParser.parse(json, 3)
71
75
  else
72
76
  raise 'unsupported API version'
@@ -82,7 +86,7 @@ module AdmiralStatsParser
82
86
  AreaCaptureInfoParser.parse(json, 2)
83
87
  when 7..10
84
88
  AreaCaptureInfoParser.parse(json, 3)
85
- when 11..14
89
+ when 11..15
86
90
  AreaCaptureInfoParser.parse(json, 4)
87
91
  else
88
92
  raise 'unsupported API version'
@@ -98,7 +102,7 @@ module AdmiralStatsParser
98
102
  TcBookInfoParser.parse(json, 2)
99
103
  when 12..13
100
104
  TcBookInfoParser.parse(json, 3)
101
- when 14
105
+ when 14..15
102
106
  TcBookInfoParser.parse(json, 4)
103
107
  else
104
108
  raise 'unsupported API version'
@@ -108,7 +112,7 @@ module AdmiralStatsParser
108
112
  # 装備図鑑をパースします。
109
113
  def self.parse_equip_book_info(json, api_version)
110
114
  case api_version
111
- when 1..14
115
+ when 1..15
112
116
  EquipBookInfoParser.parse(json)
113
117
  else
114
118
  raise 'unsupported API version'
@@ -130,7 +134,7 @@ module AdmiralStatsParser
130
134
  CharacterListInfoParser.parse(json, 4)
131
135
  when 12..13
132
136
  CharacterListInfoParser.parse(json, 5)
133
- when 14
137
+ when 14..15
134
138
  CharacterListInfoParser.parse(json, 6)
135
139
  else
136
140
  raise 'unsupported API version'
@@ -144,7 +148,7 @@ module AdmiralStatsParser
144
148
  raise 'API version 1 does not support equip list info'
145
149
  when 2..8
146
150
  EquipListInfoParser.parse(json, 1)
147
- when 9..14
151
+ when 9..15
148
152
  EquipListInfoParser.parse(json, 2)
149
153
  else
150
154
  raise 'unsupported API version'
@@ -156,7 +160,7 @@ module AdmiralStatsParser
156
160
  case api_version
157
161
  when 1..8
158
162
  EquipListInfoParser.parse_max_slot_num(json, 1)
159
- when 9..14
163
+ when 9..15
160
164
  EquipListInfoParser.parse_max_slot_num(json, 2)
161
165
  else
162
166
  raise 'unsupported API version'
@@ -172,7 +176,7 @@ module AdmiralStatsParser
172
176
  EventInfoParser.parse(json, 1)
173
177
  when 7..12
174
178
  EventInfoParser.parse(json, 2)
175
- when 13..14
179
+ when 13..15
176
180
  EventInfoParser.parse(json, 3)
177
181
  else
178
182
  raise 'unsupported API version'
@@ -184,7 +188,7 @@ module AdmiralStatsParser
184
188
  case api_version
185
189
  when 1..3
186
190
  raise "API version #{api_version} does not support event info"
187
- when 4..14
191
+ when 4..15
188
192
  {
189
193
  opened: EventInfoParser.opened?(event_info_list, level, period),
190
194
  all_cleared: EventInfoParser.all_cleared?(event_info_list, level, period),
@@ -205,10 +209,22 @@ module AdmiralStatsParser
205
209
  raise "API version #{api_version} does not support blueprint list info"
206
210
  when 7
207
211
  BlueprintListInfoParser.parse(json, 1)
208
- when 8..14
212
+ when 8..15
209
213
  BlueprintListInfoParser.parse(json, 2)
210
214
  else
211
215
  raise 'unsupported API version'
212
216
  end
213
217
  end
218
+
219
+ # 輸送イベント海域情報をパースします。
220
+ def self.parse_cop_info(json, api_version)
221
+ case api_version
222
+ when 1..14
223
+ raise "API version #{api_version} does not support cop info"
224
+ when 15
225
+ CopInfoParser.parse(json, 1)
226
+ else
227
+ raise 'unsupported API version'
228
+ end
229
+ end
214
230
  end
@@ -0,0 +1,53 @@
1
+ # 輸送イベント海域情報
2
+ class CopInfo
3
+ # TPゲージの残量
4
+ attr_accessor :numerator
5
+
6
+ # TPゲージの最大数
7
+ attr_accessor :denominator
8
+
9
+ # 現在の周回数(1周目=クリア周回数0の場合は1)
10
+ attr_accessor :achievement_number
11
+
12
+ # 次回達成ボーナス(IndividualAchievement)のリスト
13
+ attr_accessor :individual_achievement
14
+
15
+ # "全提督協力作戦 達成報酬獲得権利" の権利獲得済かどうか
16
+ attr_accessor :area_achievement_claim
17
+
18
+ # 限定フレームの所持数
19
+ attr_accessor :limited_frame_num
20
+
21
+ # 海域データ(AreaData)のリスト
22
+ attr_accessor :area_data_list
23
+
24
+ # 次回達成ボーナス
25
+ class CopInfoIndividualAchievement
26
+ # 表示順(0 〜)
27
+ attr_accessor :data_id
28
+
29
+ # ボーナスの種類
30
+ # "RESULT_POINT": 戦果
31
+ # "STRATEGY_POINT": 戦略ポイント
32
+ # "ROOM_ITEM_ICON": 家具コイン
33
+ # "EQUIP": 装備
34
+ # "TRC_FRAME": 限定フレーム
35
+ attr_accessor :kind
36
+
37
+ # 数値(戦果の場合はポイント数、家具コインの場合はコイン枚数)
38
+ attr_accessor :value
39
+ end
40
+
41
+ # 海域データ
42
+ # 情報量が多いが、Admiral Statsではその大半が不要なため、
43
+ # Admiral Statsで最低限必要なデータだけパースする
44
+ class CopInfoAreaData
45
+ # 海域番号
46
+ # 期間限定作戦「兵站輸送作戦」では、共通して 3000
47
+ attr_accessor :area_id
48
+
49
+ # サブ海域番号
50
+ # 期間限定作戦「兵站輸送作戦」では、1 〜 3
51
+ attr_accessor :area_sub_id
52
+ end
53
+ end
@@ -0,0 +1,142 @@
1
+ require 'json'
2
+ require 'admiral_stats_parser/model/cop_info'
3
+
4
+ class CopInfoParser
5
+ MANDATORY_KEYS = {
6
+ 1 => {
7
+ numerator: Integer,
8
+ denominator: Integer,
9
+ achievement_number: Integer,
10
+ individual_achievement: :individual_achievement,
11
+ area_achievement_claim: :boolean,
12
+ limited_frame_num: Integer,
13
+ area_data_list: :area_data_list
14
+ },
15
+ }
16
+
17
+ OPTIONAL_KEYS = {
18
+ 1 => {},
19
+ }
20
+
21
+ INDIVIDUAL_ACHIEVEMENT_MANDATORY_KEYS = {
22
+ data_id: Integer,
23
+ kind: String,
24
+ value: Integer,
25
+ }
26
+
27
+ AREA_DATA_LIST_MANDATORY_KEYS = {
28
+ area_id: Integer,
29
+ area_sub_id: Integer,
30
+ }
31
+
32
+ def self.parse(json, api_version)
33
+ items = JSON.parse(json)
34
+
35
+ # イベント期間外はnilを返す
36
+ return nil if items.empty?
37
+
38
+ result = CopInfo.new
39
+
40
+ MANDATORY_KEYS[api_version].each do |key, key_class|
41
+ # 必須のキーが含まれなければエラー
42
+ camel_case_key = key.to_s.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
43
+ unless items.include?(camel_case_key)
44
+ raise "Mandatory key #{key} does not exist"
45
+ end
46
+
47
+ # 結果のクラスが合わなければエラー
48
+ # 海域撃破ボーナスを格納するために、特別な処理を追加
49
+ if key_class == :individual_achievement
50
+ result.instance_variable_set(
51
+ "@#{key.to_s}", CopInfoParser.parse_individual_achievement(items[camel_case_key]))
52
+ next
53
+ elsif key_class == :area_data_list
54
+ result.instance_variable_set(
55
+ "@#{key.to_s}", CopInfoParser.parse_area_data_list(items[camel_case_key]))
56
+ next
57
+ end
58
+
59
+ # ruby には Boolean クラスがないので、そこだけ特別な処理を用意する
60
+ if key_class == :boolean
61
+ unless [true, false].include?(items[camel_case_key])
62
+ raise "Mandatory key #{key} is not boolean"
63
+ end
64
+ else
65
+ unless items[camel_case_key].is_a?(key_class)
66
+ raise "Mandatory key #{key} is not class #{key_class}"
67
+ end
68
+ end
69
+
70
+ result.instance_variable_set("@#{key.to_s}", items[camel_case_key])
71
+ end
72
+
73
+ OPTIONAL_KEYS[api_version].each do |key, key_class|
74
+ # キーが含まれなければ、処理をスキップ
75
+ camel_case_key = key.to_s.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
76
+ next unless items.include?(camel_case_key)
77
+
78
+ # 結果のクラスが合わなければエラー
79
+ unless items[camel_case_key].is_a?(key_class)
80
+ raise "Optional key #{key} is not class #{key_class}"
81
+ end
82
+
83
+ result.instance_variable_set("@#{key.to_s}", items[camel_case_key])
84
+ end
85
+
86
+ result
87
+ end
88
+
89
+ def self.parse_individual_achievement(achievements)
90
+ results = []
91
+
92
+ achievements.each do |achievement|
93
+ result = CopInfo::CopInfoIndividualAchievement.new
94
+
95
+ INDIVIDUAL_ACHIEVEMENT_MANDATORY_KEYS.each do |key, key_class|
96
+ # 必須のキーが含まれなければエラー
97
+ camel_case_key = key.to_s.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
98
+ unless achievement.include?(camel_case_key)
99
+ raise "Mandatory key #{key} does not exist"
100
+ end
101
+
102
+ # 結果のクラスが合わなければエラー
103
+ unless achievement[camel_case_key].is_a?(key_class)
104
+ raise "Mandatory key #{key} is not class #{key_class}"
105
+ end
106
+
107
+ result.instance_variable_set("@#{key.to_s}", achievement[camel_case_key])
108
+ end
109
+
110
+ results << result
111
+ end
112
+
113
+ results
114
+ end
115
+
116
+ def self.parse_area_data_list(area_data_list)
117
+ results = []
118
+
119
+ area_data_list.each do |area_data|
120
+ result = CopInfo::CopInfoAreaData.new
121
+
122
+ AREA_DATA_LIST_MANDATORY_KEYS.each do |key, key_class|
123
+ # 必須のキーが含まれなければエラー
124
+ camel_case_key = key.to_s.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
125
+ unless area_data.include?(camel_case_key)
126
+ raise "Mandatory key #{key} does not exist"
127
+ end
128
+
129
+ # 結果のクラスが合わなければエラー
130
+ unless area_data[camel_case_key].is_a?(key_class)
131
+ raise "Mandatory key #{key} is not class #{key_class}"
132
+ end
133
+
134
+ result.instance_variable_set("@#{key.to_s}", area_data[camel_case_key])
135
+ end
136
+
137
+ results << result
138
+ end
139
+
140
+ results
141
+ end
142
+ end
@@ -1,3 +1,3 @@
1
1
  module AdmiralStatsParser
2
- VERSION = '1.14.1'
2
+ VERSION = '1.15.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: admiral_stats_parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.14.1
4
+ version: 1.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masahiro Yoshizawa
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-05-14 00:00:00.000000000 Z
11
+ date: 2018-08-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -74,6 +74,7 @@ files:
74
74
  - lib/admiral_stats_parser/model/area_capture_info.rb
75
75
  - lib/admiral_stats_parser/model/blueprint_list_info.rb
76
76
  - lib/admiral_stats_parser/model/character_list_info.rb
77
+ - lib/admiral_stats_parser/model/cop_info.rb
77
78
  - lib/admiral_stats_parser/model/equip_book_info.rb
78
79
  - lib/admiral_stats_parser/model/equip_list_info.rb
79
80
  - lib/admiral_stats_parser/model/event_info.rb
@@ -82,6 +83,7 @@ files:
82
83
  - lib/admiral_stats_parser/parser/area_capture_info_parser.rb
83
84
  - lib/admiral_stats_parser/parser/blueprint_list_info_parser.rb
84
85
  - lib/admiral_stats_parser/parser/character_list_info_parser.rb
86
+ - lib/admiral_stats_parser/parser/cop_info_parser.rb
85
87
  - lib/admiral_stats_parser/parser/equip_book_info_parser.rb
86
88
  - lib/admiral_stats_parser/parser/equip_list_info_parser.rb
87
89
  - lib/admiral_stats_parser/parser/event_info_parser.rb