OSDN Git Service

23cc7bdba3bf2b509a7534c31de7065a1fedb1d1
[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 Status _status = new Status();\r
34 \r
35         [Flags]\r
36         public enum Update\r
37         {\r
38             None = 0,\r
39             Start = 1,\r
40             Item = 2,\r
41             Ship = 4,\r
42             Timer = 8,\r
43             NDock = 16,\r
44             Mission = 32,\r
45             QuestList = 64,\r
46             All = 127\r
47         }\r
48 \r
49         public Sniffer()\r
50         {\r
51             _shipInfo = new ShipInfo(_shipMaster, _itemInfo);\r
52             _dockInfo = new DockInfo(_shipInfo);\r
53             _akashiTimer = new AkashiTimer(_shipInfo, _itemInfo, _dockInfo, _missionInfo);\r
54         }\r
55 \r
56         public void SaveState()\r
57         {\r
58             _achievement.SaveState(_status);\r
59             _status.Save();\r
60         }\r
61 \r
62         public void LoadState()\r
63         {\r
64             _status.Load();\r
65             _achievement.LoadState(_status);\r
66         }\r
67 \r
68         public Update Sniff(string url, string request, dynamic json)\r
69         {\r
70             var data = json.IsDefined("api_data") ? json.api_data : new object();\r
71 \r
72             if (url.EndsWith("api_start2"))\r
73             {\r
74                 _start = true;\r
75                 _shipMaster.Inspect(data.api_mst_ship);\r
76                 _missionInfo.InspectMaster(data.api_mst_mission);\r
77                 _itemInfo.InspectMaster(data.api_mst_slotitem);\r
78                 return Update.Start;\r
79             }\r
80             if (!_start)\r
81                 return Update.None;\r
82             if (url.EndsWith("api_port/port"))\r
83             {\r
84                 _itemInfo.InspectBasic(data.api_basic);\r
85                 _itemInfo.InspectMaterial(data.api_material);\r
86                 _shipInfo.InspectShip(data);\r
87                 _missionInfo.InspectDeck(data.api_deck_port);\r
88                 _dockInfo.InspectNDock(data.api_ndock);\r
89                 _akashiTimer.SetTimer(true);\r
90                 _achievement.InspectBasic(data.api_basic);\r
91                 return Update.All;\r
92             }\r
93             if (url.EndsWith("api_get_member/basic"))\r
94             {\r
95                 _itemInfo.InspectBasic(data);\r
96                 return Update.None;\r
97             }\r
98             if (url.EndsWith("api_get_member/slot_item"))\r
99             {\r
100                 _itemInfo.InspectSlotItem(data, true);\r
101                 return Update.None;\r
102             }\r
103             if (url.EndsWith("api_get_member/kdock"))\r
104             {\r
105                 _dockInfo.InspectKDock(data);\r
106                 return Update.Timer;\r
107             }\r
108             if (url.EndsWith("api_get_member/ndock"))\r
109             {\r
110                 _dockInfo.InspectNDock(data);\r
111                 _akashiTimer.SetTimer();\r
112                 return Update.NDock | Update.Timer;\r
113             }\r
114             if (url.EndsWith("api_req_hensei/change"))\r
115             {\r
116                 _shipInfo.InspectChange(request);\r
117                 _akashiTimer.SetTimer();\r
118                 return Update.Ship;\r
119             }\r
120             if (url.EndsWith("api_get_member/questlist"))\r
121             {\r
122                 _questInfo.Inspect(data);\r
123                 return Update.QuestList;\r
124             }\r
125             if (url.EndsWith("api_get_member/deck"))\r
126             {\r
127                 _missionInfo.InspectDeck(data);\r
128                 _akashiTimer.SetTimer();\r
129                 return Update.Mission | Update.Timer;\r
130             }\r
131             if (url.EndsWith("api_get_member/ship2"))\r
132             {\r
133                 // ここだけjsonなので注意\r
134                 _shipInfo.InspectShip(json);\r
135                 _akashiTimer.SetTimer();\r
136                 return Update.Ship;\r
137             }\r
138             if (url.EndsWith("api_get_member/ship3"))\r
139             {\r
140                 _shipInfo.InspectShip(data);\r
141                 _akashiTimer.SetTimer();\r
142                 return Update.Ship;\r
143             }\r
144             if (url.EndsWith("api_req_hokyu/charge"))\r
145             {\r
146                 _shipInfo.InspectCharge(data);\r
147                 return Update.Ship;\r
148             }\r
149             if (url.EndsWith("api_req_kousyou/createitem"))\r
150             {\r
151                 _itemInfo.InspectCreateItem(data);\r
152                 return Update.Item;\r
153             }\r
154             if (url.EndsWith("api_req_kousyou/getship"))\r
155             {\r
156                 _itemInfo.InspectGetShip(data);\r
157                 _shipInfo.InspectShip(data);\r
158                 _dockInfo.InspectKDock(data.api_kdock);\r
159                 return Update.Item | Update.Timer;\r
160             }\r
161             if (url.EndsWith("api_req_kousyou/destroyship"))\r
162             {\r
163                 _shipInfo.InspectDestroyShip(request);\r
164                 _akashiTimer.SetTimer();\r
165                 return Update.Item | Update.Ship;\r
166             }\r
167             if (url.EndsWith("api_req_kousyou/destroyitem2"))\r
168             {\r
169                 _itemInfo.InspectDestroyItem(request);\r
170                 return Update.Item;\r
171             }\r
172             if (url.EndsWith("api_req_kaisou/powerup"))\r
173             {\r
174                 _shipInfo.InspectPowerup(request, data);\r
175                 return Update.Item | Update.Ship;\r
176             }\r
177             if (url.EndsWith("api_req_nyukyo/start"))\r
178             {\r
179                 _shipInfo.InspectNyukyo(request);\r
180                 return Update.Item | Update.Ship;\r
181             }\r
182             return Update.None;\r
183         }\r
184 \r
185         public NameAndTimer[] NDock\r
186         {\r
187             get { return _dockInfo.NDock; }\r
188         }\r
189 \r
190         public RingTimer[] KDock\r
191         {\r
192             get { return _dockInfo.KDock; }\r
193         }\r
194 \r
195         public ItemInfo Item\r
196         {\r
197             get { return _itemInfo; }\r
198         }\r
199 \r
200         public QuestInfo.NameAndProgress[] Quests\r
201         {\r
202             get { return _questInfo.Quests; }\r
203         }\r
204 \r
205         public NameAndTimer[] Missions\r
206         {\r
207             get { return _missionInfo.Missions; }\r
208         }\r
209 \r
210         public string[] GetConditionTimers(int fleet)\r
211         {\r
212             return _shipInfo.GetConditionTimers(fleet);\r
213         }\r
214 \r
215         public ShipStatus[] GetShipStatuses(int fleet)\r
216         {\r
217             return _shipInfo.GetShipStatuses(fleet);\r
218         }\r
219 \r
220         public ChargeStatus[] ChargeStatuses\r
221         {\r
222             get { return _shipInfo.ChargeStatuses; }\r
223         }\r
224 \r
225         public int GetAirSuperiority(int fleet)\r
226         {\r
227             return _shipInfo.GetAirSuperiority(fleet);\r
228         }\r
229 \r
230         public DateTime GetAkashiStartTime(int fleet)\r
231         {\r
232             return _akashiTimer[fleet];\r
233         }\r
234 \r
235         public double Achievement\r
236         {\r
237             get { return _achievement.Value; }\r
238         }\r
239 \r
240         public void ResetAchievement()\r
241         {\r
242             _achievement.Reset();\r
243         }\r
244     }\r
245 \r
246     public class NameAndTimer\r
247     {\r
248         public string Name { get; set; }\r
249         public RingTimer Timer { get; set; }\r
250 \r
251         public NameAndTimer()\r
252         {\r
253             Timer = new RingTimer();\r
254         }\r
255     }\r
256 \r
257     public class RingTimer\r
258     {\r
259         private DateTime _endTime;\r
260         private TimeSpan _rest;\r
261         private readonly TimeSpan _spare;\r
262 \r
263         public RingTimer(int spare = 60)\r
264         {\r
265             _spare = TimeSpan.FromSeconds(spare);\r
266         }\r
267 \r
268         public void SetEndTime(double time)\r
269         {\r
270             SetEndTime((int)time == 0\r
271                 ? DateTime.MinValue\r
272                 : new DateTime(1970, 1, 1).ToLocalTime().AddSeconds(time / 1000));\r
273         }\r
274 \r
275         public void SetEndTime(DateTime time)\r
276         {\r
277             _endTime = time;\r
278             if (_endTime == DateTime.MinValue)\r
279                 IsFinished = false;\r
280         }\r
281 \r
282         public void Update()\r
283         {\r
284             if (_endTime == DateTime.MinValue)\r
285             {\r
286                 _rest = TimeSpan.Zero;\r
287                 return;\r
288             }\r
289             _rest = _endTime - DateTime.Now;\r
290             if (_rest < TimeSpan.Zero)\r
291                 _rest = TimeSpan.Zero;\r
292             if (_rest > _spare || IsFinished)\r
293                 return;\r
294             IsFinished = true;\r
295             NeedRing = true;\r
296         }\r
297 \r
298         public bool IsFinished { get; private set; }\r
299         public bool NeedRing { get; set; }\r
300 \r
301         public override string ToString()\r
302         {\r
303             return _rest.Days == 0 ? _rest.ToString(@"hh\:mm\:ss") : _rest.ToString(@"d\.hh\:mm");\r
304         }\r
305     }\r
306 }