}\r
\r
/// <summary>\r
+ /// リピートを例外付きで中断・再開する\r
+ /// </summary>\r
+ [TestMethod]\r
+ public void SuspendRepeatWithException()\r
+ {\r
+ var time = new TimeProvider();\r
+ Message result = null;\r
+ var manager =\r
+ new NotificationManager((t, b, n) => { result = new Message {Title = t, Body = b, Name = n}; }, time.GetNow);\r
+ var ensei = new Message {Title = "遠征が終わりました", Body = "第二艦隊 防空射撃演習", Name = "遠征終了"};\r
+ var taiha = new Message {Title = "大破した艦娘がいます", Body = "摩耶改二", Name = "大破警告"};\r
+ var elapsed = 0;\r
+ while (true)\r
+ {\r
+ switch (elapsed)\r
+ {\r
+ case 0:\r
+ manager.Enqueue("遠征終了", 1, "防空射撃演習", 10);\r
+ manager.Flash();\r
+ PAssert.That(() => ensei.Equals(result));\r
+ break;\r
+ case 1000:\r
+ manager.Flash();\r
+ manager.SuspendRepeat("大破警告");\r
+ break;\r
+ case 2000:\r
+ manager.Enqueue("大破警告", "摩耶改二", 8);\r
+ manager.Flash();\r
+ PAssert.That(() => taiha.Equals(result));\r
+ break;\r
+ case 10000:\r
+ manager.Flash();\r
+ PAssert.That(() => taiha.Repeat.Equals(result));\r
+ break;\r
+ case 11000:\r
+ manager.Flash();\r
+ manager.ResumeRepeat();\r
+ break;\r
+ case 12000:\r
+ manager.Flash();\r
+ PAssert.That(() => ensei.Repeat.Equals(result));\r
+ return;\r
+ default:\r
+ manager.Flash();\r
+ PAssert.That(() => result == null, elapsed.ToString());\r
+ break;\r
+ }\r
+ result = null;\r
+ elapsed += 1000;\r
+ }\r
+ }\r
+\r
+ /// <summary>\r
/// リピート中の特定の通知を止める\r
/// </summary>\r
[TestMethod]\r
\r
public void Stop(string key, int fleet) => _manager.StopRepeat(key, fleet);\r
\r
- public void Suspend() => _manager.SuspendRepeat();\r
+ public void Suspend(string exception = null) => _manager.SuspendRepeat(exception);\r
\r
public void Resume() => _manager.ResumeRepeat();\r
}\r
{\r
if (!_sniffer.BadlyDamagedShips.Any())\r
return;\r
- _notificationManager.Enqueue("大破警告", string.Join(" ", _sniffer.BadlyDamagedShips));\r
+ SetNotification("大破警告", string.Join(" ", _sniffer.BadlyDamagedShips));\r
_notificationManager.Flash();\r
}\r
\r
{\r
case "艦娘数超過":\r
case "装備数超過":\r
- case "大破警告":\r
textBoxPreliminary.Visible = labelPreliminary.Visible = checkBoxPreliminary.Visible =\r
textBoxRepeat.Visible = labelRepeat.Visible = checkBoxRepeat.Visible =\r
checkBoxCont.Visible = false;\r
_notificationQueue.StopRepeat(key, fleet);\r
}\r
\r
- public void SuspendRepeat()\r
+ public void SuspendRepeat(string exception = "")\r
{\r
- _notificationQueue.SuspendRepeat();\r
+ _notificationQueue.SuspendRepeat(exception);\r
}\r
\r
public void ResumeRepeat()\r
private readonly NotificationConfig _notificationConfig = new NotificationConfig();\r
private DateTime _lastAlarm;\r
private bool _suspend;\r
+ private string _suspendException;\r
\r
public NotificationQueue(Action<string, string, string> alarm, Func<DateTime> nowFunc = null)\r
{\r
private bool IsMatch(Notification n, string key) =>\r
n.Key.Substring(0, 4) == key.Substring(0, 4) && n.Schedule != default;\r
\r
- public void SuspendRepeat()\r
+ public void SuspendRepeat(string exception = null)\r
{\r
_suspend = true;\r
+ _suspendException = exception;\r
}\r
\r
public void ResumeRepeat()\r
if (now - _lastAlarm < TimeSpan.FromSeconds(2))\r
return;\r
var first = _queue.FirstOrDefault(n => n.Schedule.CompareTo(now) <= 0 &&\r
- !(_suspend && n.Schedule != default));\r
+ !(n.Schedule != default && _suspend && n.Key != _suspendException));\r
if (first == null)\r
return;\r
var message = _notificationConfig.GenerateMessage(first);\r
{\r
void Stop(string key);\r
void Stop(string key, int fleet);\r
- void Suspend();\r
+ void Suspend(string exception = null);\r
void Resume();\r
}\r
\r
_cellInfo.Port();\r
SaveState();\r
RepeatingTimerController?.Resume();\r
- foreach (var s in new[] {"遠征終了", "入渠終了", "疲労回復", "泊地修理"})\r
+ foreach (var s in new[] {"遠征終了", "入渠終了", "疲労回復", "泊地修理", "大破警告"})\r
RepeatingTimerController?.Stop(s);\r
return Update.All;\r
}\r
_miscTextInfo.InspectMapStart(data);\r
_questInfo.InspectMapStart(data);\r
_cellInfo.InspectMapStart(data);\r
- RepeatingTimerController?.Suspend();\r
+ RepeatingTimerController?.Suspend("大破警告");\r
return Update.Timer | Update.Ship | Update.Cell;\r
}\r
if (url.EndsWith("api_req_map/next"))\r