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 +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
|