OSDN Git Service

大破警告をリピート可能にする
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Sat, 16 Jun 2018 12:32:00 +0000 (21:32 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Sat, 16 Jun 2018 12:32:00 +0000 (21:32 +0900)
KancolleSniffer.Test/NotificationManagerTest.cs
KancolleSniffer/MainForm.cs
KancolleSniffer/NotificationConfigDialog.cs
KancolleSniffer/NotificationManager.cs
KancolleSniffer/Sniffer.cs

index c35c6a2..242f052 100644 (file)
@@ -326,6 +326,59 @@ namespace KancolleSniffer.Test
         }\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
index 21b1c84..7b7a89b 100644 (file)
@@ -159,7 +159,7 @@ namespace KancolleSniffer
 \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
@@ -661,7 +661,7 @@ namespace KancolleSniffer
         {\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
index 8b20b12..0c67c7b 100644 (file)
@@ -40,7 +40,6 @@ namespace KancolleSniffer
             {\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
index e9fdef1..1114ec6 100644 (file)
@@ -78,9 +78,9 @@ namespace KancolleSniffer
             _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
@@ -278,6 +278,7 @@ namespace KancolleSniffer
             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
@@ -320,9 +321,10 @@ namespace KancolleSniffer
             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
@@ -336,7 +338,7 @@ namespace KancolleSniffer
                 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
index f492fe2..3f0b306 100644 (file)
@@ -45,7 +45,7 @@ namespace KancolleSniffer
         {\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
@@ -170,7 +170,7 @@ namespace KancolleSniffer
             _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
@@ -517,7 +517,7 @@ namespace KancolleSniffer
                 _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