OSDN Git Service

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