admiral_stats_parser 1.14.1 → 1.15.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
  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