OSDN Git Service

Graf Zeppelin以外の空母の夜戦攻撃力を表示する
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / AlarmTimer.cs
1 // Copyright (C) 2018 Kazuhiro Fujieda <fujieda@users.osdn.me>\r
2 //\r
3 // Licensed under the Apache License, Version 2.0 (the "License");\r
4 // you may not use this file except in compliance with the License.\r
5 // You may obtain a copy of the License at\r
6 //\r
7 //    http://www.apache.org/licenses/LICENSE-2.0\r
8 //\r
9 // Unless required by applicable law or agreed to in writing, software\r
10 // distributed under the License is distributed on an "AS IS" BASIS,\r
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
12 // See the License for the specific language governing permissions and\r
13 // limitations under the License.\r
14 \r
15 using System;\r
16 using System.Globalization;\r
17 \r
18 namespace KancolleSniffer\r
19 {\r
20     public class NameAndTimer\r
21     {\r
22         public string Name { get; set; }\r
23         public AlarmTimer Timer { get; set; }\r
24 \r
25         public NameAndTimer()\r
26         {\r
27             Timer = new AlarmTimer();\r
28         }\r
29     }\r
30 \r
31     public class AlarmTimer\r
32     {\r
33         private readonly TimeSpan _spare;\r
34         private bool _finished;\r
35 \r
36         public bool IsFinished(DateTime now) => EndTime != DateTime.MinValue && EndTime - now < _spare || _finished;\r
37 \r
38         public DateTime EndTime { get; private set; }\r
39 \r
40         public AlarmTimer(int spare = 60)\r
41         {\r
42             _spare = TimeSpan.FromSeconds(spare);\r
43         }\r
44 \r
45         public void SetEndTime(double time)\r
46         {\r
47             SetEndTime((int)time == 0\r
48                 ? DateTime.MinValue\r
49                 : new DateTime(1970, 1, 1).ToLocalTime().AddSeconds(time / 1000));\r
50         }\r
51 \r
52         public void SetEndTime(DateTime time)\r
53         {\r
54             EndTime = time;\r
55             _finished = false;\r
56         }\r
57 \r
58         public void Finish()\r
59         {\r
60             _finished = true;\r
61         }\r
62 \r
63         public bool CheckAlarm(DateTime prev, DateTime now)\r
64         {\r
65             return EndTime != DateTime.MinValue && prev < EndTime - _spare && EndTime - _spare <= now;\r
66         }\r
67 \r
68         public string ToString(DateTime now, bool endTime = false)\r
69         {\r
70             if (EndTime == DateTime.MinValue && !_finished)\r
71                 return "";\r
72             if (endTime)\r
73                 return EndTime.ToString(@"dd\ HH\:mm", CultureInfo.InvariantCulture);\r
74             var rest = _finished || EndTime - now < TimeSpan.Zero ? TimeSpan.Zero : EndTime - now;\r
75             return $"{(int)rest.TotalHours:d2}:" + rest.ToString(@"mm\:ss", CultureInfo.InvariantCulture);\r
76         }\r
77     }\r
78 }