-// Copyright (C) 2013 Kazuhiro Fujieda <fujieda@users.sourceforge.jp>\r
+// Copyright (C) 2013, 2014 Kazuhiro Fujieda <fujieda@users.sourceforge.jp>\r
// \r
// This program is part of KancolleSniffer.\r
//\r
\r
namespace KancolleSniffer\r
{\r
- [Flags]\r
- public enum UpdateInfo\r
- {\r
- None = 0,\r
- Item = 1,\r
- Ship = 2,\r
- Timer = 4,\r
- Quest = 8,\r
- NDock = 16,\r
- Mission = 32,\r
- Charge = 64\r
- }\r
-\r
public class Sniffer\r
{\r
- private readonly NameAndTimer[] _ndocInfo = new NameAndTimer[4];\r
- private readonly RingTimer[] _kdocTimers = new RingTimer[4];\r
+ private bool _start;\r
private readonly ShipMaster _shipMaster = new ShipMaster();\r
private readonly ItemInfo _itemInfo = new ItemInfo();\r
private readonly QuestInfo _questInfo = new QuestInfo();\r
private readonly MissionInfo _missionInfo = new MissionInfo();\r
private readonly ShipInfo _shipInfo;\r
+ private readonly DockInfo _dockInfo;\r
+ private readonly AkashiTimer _akashiTimer;\r
+ private readonly Achievement _achievement = new Achievement();\r
+ private readonly Status _status = new Status();\r
+\r
+ [Flags]\r
+ public enum Update\r
+ {\r
+ None = 0,\r
+ Start = 1,\r
+ Item = 2,\r
+ Ship = 4,\r
+ Timer = 8,\r
+ NDock = 16,\r
+ Mission = 32,\r
+ QuestList = 64,\r
+ All = 127\r
+ }\r
\r
public Sniffer()\r
{\r
- _shipInfo = new ShipInfo(_shipMaster);\r
- for (var i = 0; i < _ndocInfo.Length; i++)\r
- _ndocInfo[i] = new NameAndTimer();\r
- for (var i = 0; i < _kdocTimers.Length; i++)\r
- _kdocTimers[i] = new RingTimer(0);\r
+ _shipInfo = new ShipInfo(_shipMaster, _itemInfo);\r
+ _dockInfo = new DockInfo(_shipInfo);\r
+ _akashiTimer = new AkashiTimer(_shipInfo, _itemInfo, _dockInfo, _missionInfo);\r
}\r
\r
- public UpdateInfo Sniff(string uri, dynamic json)\r
+ public void SaveState()\r
{\r
- if (uri.EndsWith("api_get_master/ship"))\r
+ _achievement.SaveState(_status);\r
+ _status.Save();\r
+ }\r
+\r
+ public void LoadState()\r
+ {\r
+ _status.Load();\r
+ _achievement.LoadState(_status);\r
+ }\r
+\r
+ public Update Sniff(string url, string request, dynamic json)\r
+ {\r
+ var data = json.IsDefined("api_data") ? json.api_data : new object();\r
+\r
+ if (url.EndsWith("api_start2"))\r
{\r
- _shipMaster.InspectShip(json);\r
- return UpdateInfo.None;\r
+ _start = true;\r
+ _shipMaster.Inspect(data.api_mst_ship);\r
+ _missionInfo.InspectMaster(data.api_mst_mission);\r
+ _itemInfo.InspectMaster(data.api_mst_slotitem);\r
+ return Update.Start;\r
}\r
- if (uri.EndsWith("api_get_member/basic"))\r
+ if (!_start)\r
+ return Update.None;\r
+ if (url.EndsWith("api_port/port"))\r
{\r
- _itemInfo.InspectBasic(json);\r
- return UpdateInfo.Item;\r
+ _itemInfo.InspectBasic(data.api_basic);\r
+ _itemInfo.InspectMaterial(data.api_material);\r
+ _shipInfo.InspectShip(data);\r
+ _missionInfo.InspectDeck(data.api_deck_port);\r
+ _dockInfo.InspectNDock(data.api_ndock);\r
+ _akashiTimer.SetTimer(true);\r
+ _achievement.InspectBasic(data.api_basic);\r
+ return Update.All;\r
}\r
- if (uri.EndsWith("api_get_member/record"))\r
+ if (url.EndsWith("api_get_member/basic"))\r
{\r
- _itemInfo.InspectRecord(json);\r
- return UpdateInfo.Item;\r
+ _itemInfo.InspectBasic(data);\r
+ return Update.None;\r
}\r
- if (uri.EndsWith("api_get_member/material"))\r
+ if (url.EndsWith("api_get_member/slot_item"))\r
{\r
- _itemInfo.InspectMaterial(json);\r
- return UpdateInfo.Item;\r
+ _itemInfo.InspectSlotItem(data, true);\r
+ return Update.None;\r
}\r
- if (uri.EndsWith("api_get_member/slotitem"))\r
+ if (url.EndsWith("api_get_member/kdock"))\r
{\r
- _itemInfo.InspectSlotItem(json);\r
- return UpdateInfo.Item;\r
+ _dockInfo.InspectKDock(data);\r
+ return Update.Timer;\r
}\r
- if (uri.EndsWith("api_get_member/questlist"))\r
+ if (url.EndsWith("api_get_member/ndock"))\r
{\r
- _questInfo.Inspect(json);\r
- return UpdateInfo.Quest;\r
+ _dockInfo.InspectNDock(data);\r
+ _akashiTimer.SetTimer();\r
+ return Update.NDock | Update.Timer;\r
}\r
- if (uri.EndsWith("api_get_member/ndock"))\r
+ if (url.EndsWith("api_req_hensei/change"))\r
{\r
- InspectNDock(json);\r
- return UpdateInfo.NDock | UpdateInfo.Timer;\r
+ _shipInfo.InspectChange(request);\r
+ _akashiTimer.SetTimer();\r
+ return Update.Ship;\r
}\r
- if (uri.EndsWith("api_get_member/kdock"))\r
+ if (url.EndsWith("api_get_member/questlist"))\r
{\r
- InspectKDock(json);\r
- return UpdateInfo.Timer;\r
+ _questInfo.Inspect(data);\r
+ return Update.QuestList;\r
}\r
- if (uri.EndsWith("api_get_master/mission"))\r
+ if (url.EndsWith("api_get_member/deck"))\r
{\r
- _missionInfo.InspectMission(json);\r
- return UpdateInfo.Mission;\r
+ _missionInfo.InspectDeck(data);\r
+ _akashiTimer.SetTimer();\r
+ return Update.Mission | Update.Timer;\r
}\r
- if (uri.Contains("api_get_member/deck"))\r
+ if (url.EndsWith("api_get_member/ship2"))\r
{\r
- _missionInfo.InspectDeck(json);\r
- _shipInfo.InspectDeck(json);\r
- return UpdateInfo.Mission | UpdateInfo.Ship | UpdateInfo.Charge;\r
+ // ここだけjsonなので注意\r
+ _shipInfo.InspectShip(json);\r
+ _akashiTimer.SetTimer();\r
+ return Update.Ship;\r
}\r
- if (uri.EndsWith("api_get_member/ship2") || uri.EndsWith("api_get_member/ship3"))\r
+ if (url.EndsWith("api_get_member/ship3"))\r
{\r
- _shipInfo.InspectShipInfo(uri.EndsWith("ship3") ? json.api_ship_data : json);\r
- _itemInfo.NowShips = _shipInfo.NumShips;\r
- return UpdateInfo.Ship | UpdateInfo.Item | UpdateInfo.Timer | UpdateInfo.Charge;\r
+ _shipInfo.InspectShip(data);\r
+ _akashiTimer.SetTimer();\r
+ return Update.Ship;\r
}\r
- return UpdateInfo.None;\r
- }\r
-\r
- public void SaveMaster()\r
- {\r
- _missionInfo.SaveNames();\r
- _shipMaster.Save();\r
- }\r
-\r
- public void LoadMaster()\r
- {\r
- _missionInfo.LoadNames();\r
- _shipMaster.Load();\r
- }\r
-\r
- private void InspectNDock(dynamic json)\r
- {\r
- foreach (var entry in json)\r
+ if (url.EndsWith("api_req_hokyu/charge"))\r
+ {\r
+ _shipInfo.InspectCharge(data);\r
+ return Update.Ship;\r
+ }\r
+ if (url.EndsWith("api_req_kousyou/createitem"))\r
+ {\r
+ _itemInfo.InspectCreateItem(data);\r
+ return Update.Item;\r
+ }\r
+ if (url.EndsWith("api_req_kousyou/getship"))\r
+ {\r
+ _itemInfo.InspectGetShip(data);\r
+ _shipInfo.InspectShip(data);\r
+ _dockInfo.InspectKDock(data.api_kdock);\r
+ return Update.Item | Update.Timer;\r
+ }\r
+ if (url.EndsWith("api_req_kousyou/destroyship"))\r
+ {\r
+ _shipInfo.InspectDestroyShip(request);\r
+ _akashiTimer.SetTimer();\r
+ return Update.Item | Update.Ship;\r
+ }\r
+ if (url.EndsWith("api_req_kousyou/destroyitem2"))\r
{\r
- var id = (int)entry.api_id;\r
- _ndocInfo[id - 1].Timer.EndTime = (double)entry.api_complete_time;\r
- var ship = (int)entry.api_ship_id;\r
- _ndocInfo[id - 1].Name = ship == 0 ? "" : _shipInfo.GetNameById(ship);\r
+ _itemInfo.InspectDestroyItem(request);\r
+ return Update.Item;\r
}\r
+ if (url.EndsWith("api_req_kaisou/powerup"))\r
+ {\r
+ _shipInfo.InspectPowerup(request, data);\r
+ return Update.Item | Update.Ship;\r
+ }\r
+ if (url.EndsWith("api_req_nyukyo/start"))\r
+ {\r
+ _shipInfo.InspectNyukyo(request);\r
+ return Update.Item | Update.Ship;\r
+ }\r
+ return Update.None;\r
}\r
\r
public NameAndTimer[] NDock\r
{\r
- get { return _ndocInfo; }\r
- }\r
-\r
- private void InspectKDock(dynamic json)\r
- {\r
- foreach (var entry in json)\r
- _kdocTimers[(int)entry.api_id - 1].EndTime = (double)entry.api_complete_time;\r
+ get { return _dockInfo.NDock; }\r
}\r
\r
public RingTimer[] KDock\r
{\r
- get { return _kdocTimers; }\r
+ get { return _dockInfo.KDock; }\r
}\r
\r
public ItemInfo Item\r
get { return _missionInfo.Missions; }\r
}\r
\r
- public string FleetName\r
+ public string[] GetConditionTimers(int fleet)\r
{\r
- get { return _shipInfo.FleetName; }\r
+ return _shipInfo.GetConditionTimers(fleet);\r
}\r
\r
- public DateTime[] RecoveryTimes\r
+ public ShipStatus[] GetShipStatuses(int fleet)\r
{\r
- get { return _shipInfo.RecoveryTimes; }\r
+ return _shipInfo.GetShipStatuses(fleet);\r
}\r
\r
- public ShipStatus[] ShipStatuses\r
+ public ChargeStatus[] ChargeStatuses\r
{\r
- get { return _shipInfo.ShipStatuses; }\r
+ get { return _shipInfo.ChargeStatuses; }\r
}\r
\r
- public ChargeStatus[] ChargeStatuses\r
+ public int GetAirSuperiority(int fleet)\r
{\r
- get { return _shipInfo.ChargeStatuses; }\r
+ return _shipInfo.GetAirSuperiority(fleet);\r
+ }\r
+\r
+ public DateTime GetAkashiStartTime(int fleet)\r
+ {\r
+ return _akashiTimer[fleet];\r
+ }\r
+\r
+ public double Achievement\r
+ {\r
+ get { return _achievement.Value; }\r
+ }\r
+\r
+ public void ResetAchievement()\r
+ {\r
+ _achievement.Reset();\r
}\r
}\r
\r
public class NameAndTimer\r
{\r
public string Name { get; set; }\r
-\r
public RingTimer Timer { get; set; }\r
\r
public NameAndTimer()\r
\r
public class RingTimer\r
{\r
- private bool _ringed;\r
private DateTime _endTime;\r
private TimeSpan _rest;\r
private readonly TimeSpan _spare;\r
_spare = TimeSpan.FromSeconds(spare);\r
}\r
\r
- public double EndTime\r
+ public void SetEndTime(double time)\r
{\r
- set\r
- {\r
-// ReSharper disable once CompareOfFloatsByEqualityOperator\r
- if (value != 0)\r
- _endTime = new DateTime(1970, 1, 1).ToLocalTime().AddSeconds(value / 1000);\r
- else\r
- {\r
- _endTime = DateTime.MinValue;\r
- _ringed = false;\r
- }\r
- }\r
+ SetEndTime((int)time == 0\r
+ ? DateTime.MinValue\r
+ : new DateTime(1970, 1, 1).ToLocalTime().AddSeconds(time / 1000));\r
+ }\r
+\r
+ public void SetEndTime(DateTime time)\r
+ {\r
+ _endTime = time;\r
+ if (_endTime == DateTime.MinValue)\r
+ IsFinished = false;\r
}\r
\r
public void Update()\r
_rest = _endTime - DateTime.Now;\r
if (_rest < TimeSpan.Zero)\r
_rest = TimeSpan.Zero;\r
- if (_rest > _spare || _ringed)\r
+ if (_rest > _spare || IsFinished)\r
return;\r
- _ringed = true;\r
+ IsFinished = true;\r
NeedRing = true;\r
}\r
\r
+ public bool IsFinished { get; private set; }\r
public bool NeedRing { get; set; }\r
\r
- public bool IsSet\r
- {\r
- get { return _endTime != DateTime.MinValue; }\r
- }\r
-\r
public override string ToString()\r
{\r
return _rest.Days == 0 ? _rest.ToString(@"hh\:mm\:ss") : _rest.ToString(@"d\.hh\:mm");\r