OSDN Git Service

当日5時からと月曜5時からのバケツの増減を表示する
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / Sniffer.cs
1 // Copyright (C) 2013, 2014 Kazuhiro Fujieda <fujieda@users.sourceforge.jp>\r
2 // \r
3 // This program is part of KancolleSniffer.\r
4 //\r
5 // KancolleSniffer is free software: you can redistribute it and/or modify\r
6 // it under the terms of the GNU General Public License as published by\r
7 // the Free Software Foundation, either version 3 of the License, or\r
8 // (at your option) any later version.\r
9 //\r
10 // This program is distributed in the hope that it will be useful,\r
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13 // GNU General Public License for more details.\r
14 //\r
15 // You should have received a copy of the GNU General Public License\r
16 // along with this program; if not, see <http://www.gnu.org/licenses/>.\r
17 \r
18 using System;\r
19 \r
20 namespace KancolleSniffer\r
21 {\r
22     public class Sniffer\r
23     {\r
24         private bool _start;\r
25         private readonly ShipMaster _shipMaster = new ShipMaster();\r
26         private readonly ItemInfo _itemInfo = new ItemInfo();\r
27         private readonly QuestInfo _questInfo = new QuestInfo();\r
28         private readonly MissionInfo _missionInfo = new MissionInfo();\r
29         private readonly ShipInfo _shipInfo;\r
30         private readonly DockInfo _dockInfo;\r
31         private readonly AkashiTimer _akashiTimer;\r
32         private readonly Achievement _achievement = new Achievement();\r
33         private readonly BattleInfo _battleInfo;\r
34         private readonly Status _status = new Status();\r
35 \r
36         [Flags]\r
37         public enum Update\r
38         {\r
39             None = 0,\r
40             Start = 1,\r
41             Item = 2,\r
42             Ship = 4,\r
43             Timer = 8,\r
44             NDock = 16,\r
45             Mission = 32,\r
46             QuestList = 64,\r
47             Battle = 128,\r
48             All = 255\r
49         }\r
50 \r
51         public Sniffer()\r
52         {\r
53             _shipInfo = new ShipInfo(_shipMaster, _itemInfo);\r
54             _dockInfo = new DockInfo(_shipInfo);\r
55             _akashiTimer = new AkashiTimer(_shipInfo, _itemInfo, _dockInfo, _missionInfo);\r
56             _battleInfo = new BattleInfo(_shipMaster, _shipInfo, _itemInfo);\r
57         }\r
58 \r
59         public void SaveState()\r
60         {\r
61             _achievement.SaveState(_status);\r
62             _itemInfo.SaveState(_status);\r
63             _status.Save();\r
64         }\r
65 \r
66         public void LoadState()\r
67         {\r
68             _status.Load();\r
69             _achievement.LoadState(_status);\r
70             _itemInfo.LoadSate(_status);\r
71         }\r
72 \r
73         public Update Sniff(string url, string request, dynamic json)\r
74         {\r
75             var data = json.IsDefined("api_data") ? json.api_data : new object();\r
76 \r
77             if (url.EndsWith("api_start2"))\r
78             {\r
79                 _start = true;\r
80                 _shipMaster.Inspect(data.api_mst_ship);\r
81                 _missionInfo.InspectMaster(data.api_mst_mission);\r
82                 _itemInfo.InspectMaster(data.api_mst_slotitem);\r
83                 return Update.Start;\r
84             }\r
85             if (!_start)\r
86                 return Update.None;\r
87             if (url.EndsWith("api_port/port"))\r
88             {\r
89                 _itemInfo.InspectBasic(data.api_basic);\r
90                 _itemInfo.InspectMaterial(data.api_material);\r
91                 _shipInfo.InspectShip(data);\r
92                 _missionInfo.InspectDeck(data.api_deck_port);\r
93                 _dockInfo.InspectNDock(data.api_ndock);\r
94                 _akashiTimer.SetTimer(true);\r
95                 _achievement.InspectBasic(data.api_basic);\r
96                 _battleInfo.InBattle = false;\r
97                 _battleInfo.HasDamagedShip = false;\r
98                 return Update.All;\r
99             }\r
100             if (url.EndsWith("api_get_member/basic"))\r
101             {\r
102                 _itemInfo.InspectBasic(data);\r
103                 return Update.None;\r
104             }\r
105             if (url.EndsWith("api_get_member/slot_item"))\r
106             {\r
107                 _itemInfo.InspectSlotItem(data, true);\r
108                 return Update.None;\r
109             }\r
110             if (url.EndsWith("api_get_member/kdock"))\r
111             {\r
112                 _dockInfo.InspectKDock(data);\r
113                 return Update.Timer;\r
114             }\r
115             if (url.EndsWith("api_get_member/ndock"))\r
116             {\r
117                 _dockInfo.InspectNDock(data);\r
118                 _akashiTimer.SetTimer();\r
119                 return Update.NDock | Update.Timer;\r
120             }\r
121             if (url.EndsWith("api_req_hensei/change"))\r
122             {\r
123                 _shipInfo.InspectChange(request);\r
124                 _akashiTimer.SetTimer();\r
125                 return Update.Ship;\r
126             }\r
127             if (url.EndsWith("api_get_member/questlist"))\r
128             {\r
129                 _questInfo.Inspect(data);\r
130                 return Update.QuestList;\r
131             }\r
132             if (url.EndsWith("api_get_member/deck"))\r
133             {\r
134                 _missionInfo.InspectDeck(data);\r
135                 _akashiTimer.SetTimer();\r
136                 return Update.Mission | Update.Timer;\r
137             }\r
138             if (url.EndsWith("api_get_member/ship2"))\r
139             {\r
140                 // ここだけjsonなので注意\r
141                 _shipInfo.InspectShip(json);\r
142                 _akashiTimer.SetTimer();\r
143                 _battleInfo.InBattle = false;\r
144                 return Update.Item | Update.Ship | Update.Battle;\r
145             }\r
146             if (url.EndsWith("api_get_member/ship3"))\r
147             {\r
148                 _shipInfo.InspectShip(data);\r
149                 _akashiTimer.SetTimer();\r
150                 return Update.Ship;\r
151             }\r
152             if (url.EndsWith("api_req_hokyu/charge"))\r
153             {\r
154                 _shipInfo.InspectCharge(data);\r
155                 return Update.Ship;\r
156             }\r
157             if (url.EndsWith("api_req_kousyou/createitem"))\r
158             {\r
159                 _itemInfo.InspectCreateItem(data);\r
160                 return Update.Item;\r
161             }\r
162             if (url.EndsWith("api_req_kousyou/getship"))\r
163             {\r
164                 _itemInfo.InspectGetShip(data);\r
165                 _shipInfo.InspectShip(data);\r
166                 _dockInfo.InspectKDock(data.api_kdock);\r
167                 return Update.Item | Update.Timer;\r
168             }\r
169             if (url.EndsWith("api_req_kousyou/destroyship"))\r
170             {\r
171                 _shipInfo.InspectDestroyShip(request);\r
172                 _akashiTimer.SetTimer();\r
173                 return Update.Item | Update.Ship;\r
174             }\r
175             if (url.EndsWith("api_req_kousyou/destroyitem2"))\r
176             {\r
177                 _itemInfo.InspectDestroyItem(request);\r
178                 return Update.Item;\r
179             }\r
180             if (url.EndsWith("api_req_kaisou/powerup"))\r
181             {\r
182                 _shipInfo.InspectPowerup(request, data);\r
183                 return Update.Item | Update.Ship;\r
184             }\r
185             if (url.EndsWith("api_req_nyukyo/start"))\r
186             {\r
187                 _shipInfo.InspectNyukyo(request);\r
188                 return Update.Item | Update.Ship;\r
189             }\r
190             if (url.EndsWith("api_req_sortie/battle") || url.EndsWith("api_req_practice/battle"))\r
191             {\r
192                 _battleInfo.InspectBattle(data);\r
193                 return Update.Battle;\r
194             }\r
195             if (url.EndsWith("api_req_sortie/battleresult") || url.EndsWith("api_req_practice/battleresult"))\r
196             {\r
197                 return Update.Ship;\r
198             }\r
199             return Update.None;\r
200         }\r
201 \r
202         public NameAndTimer[] NDock\r
203         {\r
204             get { return _dockInfo.NDock; }\r
205         }\r
206 \r
207         public RingTimer[] KDock\r
208         {\r
209             get { return _dockInfo.KDock; }\r
210         }\r
211 \r
212         public ItemInfo Item\r
213         {\r
214             get { return _itemInfo; }\r
215         }\r
216 \r
217         public QuestInfo.NameAndProgress[] Quests\r
218         {\r
219             get { return _questInfo.Quests; }\r
220         }\r
221 \r
222         public NameAndTimer[] Missions\r
223         {\r
224             get { return _missionInfo.Missions; }\r
225         }\r
226 \r
227         public string[] GetConditionTimers(int fleet)\r
228         {\r
229             return _shipInfo.GetConditionTimers(fleet);\r
230         }\r
231 \r
232         public ShipStatus[] GetShipStatuses(int fleet)\r
233         {\r
234             return _shipInfo.GetShipStatuses(fleet);\r
235         }\r
236 \r
237         public ChargeStatus[] ChargeStatuses\r
238         {\r
239             get { return _shipInfo.ChargeStatuses; }\r
240         }\r
241 \r
242         public int GetAirSuperiority(int fleet)\r
243         {\r
244             return _shipInfo.GetAirSuperiority(fleet);\r
245         }\r
246 \r
247         public DateTime GetAkashiStartTime(int fleet)\r
248         {\r
249             return _akashiTimer[fleet];\r
250         }\r
251 \r
252         public Achievement Achievement\r
253         {\r
254             get { return _achievement; }\r
255         }\r
256 \r
257         public BattleInfo Battle\r
258         {\r
259             get { return _battleInfo; }\r
260         }\r
261     }\r
262 \r
263     public class NameAndTimer\r
264     {\r
265         public string Name { get; set; }\r
266         public RingTimer Timer { get; set; }\r
267 \r
268         public NameAndTimer()\r
269         {\r
270             Timer = new RingTimer();\r
271         }\r
272     }\r
273 \r
274     public class RingTimer\r
275     {\r
276         private DateTime _endTime;\r
277         private TimeSpan _rest;\r
278         private readonly TimeSpan _spare;\r
279 \r
280         public RingTimer(int spare = 60)\r
281         {\r
282             _spare = TimeSpan.FromSeconds(spare);\r
283         }\r
284 \r
285         public void SetEndTime(double time)\r
286         {\r
287             SetEndTime((int)time == 0\r
288                 ? DateTime.MinValue\r
289                 : new DateTime(1970, 1, 1).ToLocalTime().AddSeconds(time / 1000));\r
290         }\r
291 \r
292         public void SetEndTime(DateTime time)\r
293         {\r
294             _endTime = time;\r
295             if (_endTime == DateTime.MinValue)\r
296                 IsFinished = false;\r
297         }\r
298 \r
299         public void Update()\r
300         {\r
301             if (_endTime == DateTime.MinValue)\r
302             {\r
303                 _rest = TimeSpan.Zero;\r
304                 return;\r
305             }\r
306             _rest = _endTime - DateTime.Now;\r
307             if (_rest < TimeSpan.Zero)\r
308                 _rest = TimeSpan.Zero;\r
309             if (_rest > _spare || IsFinished)\r
310                 return;\r
311             IsFinished = true;\r
312             NeedRing = true;\r
313         }\r
314 \r
315         public bool IsFinished { get; private set; }\r
316         public bool NeedRing { get; set; }\r
317 \r
318         public override string ToString()\r
319         {\r
320             return _rest.Days == 0 ? _rest.ToString(@"hh\:mm\:ss") : _rest.ToString(@"d\.hh\:mm");\r
321         }\r
322     }\r
323 }