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