1 // Copyright (C) 2013 Kazuhiro Fujieda <fujieda@users.sourceforge.jp>
\r
3 // This program is part of KancolleSniffer.
\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
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
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
20 namespace KancolleSniffer
\r
23 public enum UpdateInfo
\r
35 public class Sniffer
\r
37 private readonly NameAndTimer[] _ndocInfo = new NameAndTimer[4];
\r
38 private readonly RingTimer[] _kdocTimers = new RingTimer[4];
\r
39 private readonly ShipMaster _shipMaster = new ShipMaster();
\r
40 private readonly ItemInfo _itemInfo = new ItemInfo();
\r
41 private readonly QuestInfo _questInfo = new QuestInfo();
\r
42 private readonly MissionInfo _missionInfo = new MissionInfo();
\r
43 private readonly ShipInfo _shipInfo;
\r
47 _shipInfo = new ShipInfo(_shipMaster);
\r
48 for (var i = 0; i < _ndocInfo.Length; i++)
\r
49 _ndocInfo[i] = new NameAndTimer();
\r
50 for (var i = 0; i < _kdocTimers.Length; i++)
\r
51 _kdocTimers[i] = new RingTimer(0);
\r
54 public UpdateInfo Sniff(string uri, dynamic json)
\r
56 if (uri.EndsWith("api_get_master/ship"))
\r
58 _shipMaster.InspectShip(json);
\r
59 return UpdateInfo.None;
\r
61 if (uri.EndsWith("api_get_member/basic"))
\r
63 _itemInfo.InspectBasic(json);
\r
64 return UpdateInfo.Item;
\r
66 if (uri.EndsWith("api_get_member/record"))
\r
68 _itemInfo.InspectRecord(json);
\r
69 return UpdateInfo.Item;
\r
71 if (uri.EndsWith("api_get_member/material"))
\r
73 _itemInfo.InspectMaterial(json);
\r
74 return UpdateInfo.Item;
\r
76 if (uri.EndsWith("api_get_member/slotitem"))
\r
78 _itemInfo.InspectSlotItem(json);
\r
79 return UpdateInfo.Item;
\r
81 if (uri.EndsWith("api_get_member/questlist"))
\r
83 _questInfo.Inspect(json);
\r
84 return UpdateInfo.Quest;
\r
86 if (uri.EndsWith("api_get_member/ndock"))
\r
89 return UpdateInfo.NDock | UpdateInfo.Timer;
\r
91 if (uri.EndsWith("api_get_member/kdock"))
\r
94 return UpdateInfo.Timer;
\r
96 if (uri.EndsWith("api_get_master/mission"))
\r
98 _missionInfo.InspectMission(json);
\r
99 return UpdateInfo.Mission;
\r
101 if (uri.Contains("api_get_member/deck"))
\r
103 _missionInfo.InspectDeck(json);
\r
104 _shipInfo.InspectDeck(json);
\r
105 return UpdateInfo.Mission | UpdateInfo.Ship | UpdateInfo.Charge;
\r
107 if (uri.EndsWith("api_get_member/ship2") || uri.EndsWith("api_get_member/ship3"))
\r
109 _shipInfo.InspectShipInfo(uri.EndsWith("ship3") ? json.api_ship_data : json);
\r
110 _itemInfo.NowShips = _shipInfo.NumShips;
\r
111 return UpdateInfo.Ship | UpdateInfo.Item | UpdateInfo.Timer | UpdateInfo.Charge;
\r
113 return UpdateInfo.None;
\r
116 public void SaveMaster()
\r
118 _missionInfo.SaveNames();
\r
119 _shipMaster.Save();
\r
122 public void LoadMaster()
\r
124 _missionInfo.LoadNames();
\r
125 _shipMaster.Load();
\r
128 private void InspectNDock(dynamic json)
\r
130 foreach (var entry in json)
\r
132 var id = (int)entry.api_id;
\r
133 _ndocInfo[id - 1].Timer.EndTime = (double)entry.api_complete_time;
\r
134 var ship = (int)entry.api_ship_id;
\r
135 _ndocInfo[id - 1].Name = ship == 0 ? "" : _shipInfo.GetNameById(ship);
\r
139 public NameAndTimer[] NDock
\r
141 get { return _ndocInfo; }
\r
144 private void InspectKDock(dynamic json)
\r
146 foreach (var entry in json)
\r
147 _kdocTimers[(int)entry.api_id - 1].EndTime = (double)entry.api_complete_time;
\r
150 public RingTimer[] KDock
\r
152 get { return _kdocTimers; }
\r
155 public ItemInfo Item
\r
157 get { return _itemInfo; }
\r
160 public QuestInfo.NameAndProgress[] Quests
\r
162 get { return _questInfo.Quests; }
\r
165 public NameAndTimer[] Missions
\r
167 get { return _missionInfo.Missions; }
\r
170 public string FleetName
\r
172 get { return _shipInfo.FleetName; }
\r
175 public DateTime[] RecoveryTimes
\r
177 get { return _shipInfo.RecoveryTimes; }
\r
180 public ShipStatus[] ShipStatuses
\r
182 get { return _shipInfo.ShipStatuses; }
\r
185 public ChargeStatus[] ChargeStatuses
\r
187 get { return _shipInfo.ChargeStatuses; }
\r
191 public class NameAndTimer
\r
193 public string Name { get; set; }
\r
195 public RingTimer Timer { get; set; }
\r
197 public NameAndTimer()
\r
199 Timer = new RingTimer();
\r
203 public class RingTimer
\r
205 private bool _ringed;
\r
206 private DateTime _endTime;
\r
207 private TimeSpan _rest;
\r
208 private readonly TimeSpan _spare;
\r
210 public RingTimer(int spare = 60)
\r
212 _spare = TimeSpan.FromSeconds(spare);
\r
215 public double EndTime
\r
219 // ReSharper disable once CompareOfFloatsByEqualityOperator
\r
221 _endTime = new DateTime(1970, 1, 1).ToLocalTime().AddSeconds(value / 1000);
\r
224 _endTime = DateTime.MinValue;
\r
230 public void Update()
\r
232 if (_endTime == DateTime.MinValue)
\r
234 _rest = TimeSpan.Zero;
\r
237 _rest = _endTime - DateTime.Now;
\r
238 if (_rest < TimeSpan.Zero)
\r
239 _rest = TimeSpan.Zero;
\r
240 if (_rest > _spare || _ringed)
\r
246 public bool NeedRing { get; set; }
\r
250 get { return _endTime != DateTime.MinValue; }
\r
253 public override string ToString()
\r
255 return _rest.Days == 0 ? _rest.ToString(@"hh\:mm\:ss") : _rest.ToString(@"d\.hh\:mm");
\r