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 +4 -4
- data/README.md +14 -9
- data/lib/admiral_stats_parser.rb +27 -11
- data/lib/admiral_stats_parser/model/cop_info.rb +53 -0
- data/lib/admiral_stats_parser/parser/cop_info_parser.rb +142 -0
- data/lib/admiral_stats_parser/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d3f2d0f49ebaf289106652ca0d113c9ad4a76599
|
4
|
+
data.tar.gz: 52ebd6874fe62e3efde5697e167f67cd70147f4c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
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
|
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
|
|
data/lib/admiral_stats_parser.rb
CHANGED
@@ -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
|
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..
|
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..
|
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..
|
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..
|
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..
|
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..
|
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..
|
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..
|
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
|
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.
|
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-
|
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
|