OSDN Git Service

上流プロキシの変更時にプロキシを再起動しない
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / Config.cs
1 // Copyright (C) 2014, 2015 Kazuhiro Fujieda <fujieda@users.osdn.me>\r
2 // \r
3 // This program is part of KancolleSniffer.\r
4 //\r
5 // KancolleSniffer is free software: you can redistribute it and/or modify\r
6 // it under the terms of the GNU General Public License as published by\r
7 // the Free Software Foundation, either version 3 of the License, or\r
8 // (at your option) any later version.\r
9 //\r
10 // This program is distributed in the hope that it will be useful,\r
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13 // GNU General Public License for more details.\r
14 //\r
15 // You should have received a copy of the GNU General Public License\r
16 // along with this program; if not, see <http://www.gnu.org/licenses/>.\r
17 \r
18 using System;\r
19 using System.Collections.Generic;\r
20 using System.Drawing;\r
21 using System.IO;\r
22 using System.Windows.Forms;\r
23 using Codeplex.Data;\r
24 \r
25 namespace KancolleSniffer\r
26 {\r
27     public class ProxyConfig\r
28     {\r
29         public const int DefaultListenPort = 8080;\r
30         public const string AutoConfigUrl = "https://kancollesniffer.osdn.jp/proxy.pac";\r
31         public const string AutoConfigUrlWithPort = "https://kancollesniffer.osdn.jp/proxy.php?port=";\r
32         public bool Auto { get; set; }\r
33         public int Listen { get; set; }\r
34         public bool UseUpstream { get; set; }\r
35         public int UpstreamPort { get; set; }\r
36 \r
37         public ProxyConfig()\r
38         {\r
39             Auto = true;\r
40             Listen = DefaultListenPort;\r
41             UseUpstream = false;\r
42             UpstreamPort = 8888;\r
43         }\r
44     }\r
45 \r
46     public class ShipListConfig\r
47     {\r
48         public Point Location { get; set; }\r
49         public Size Size { get; set; }\r
50         public bool ShipType { get; set; }\r
51         public List<int>[] ShipGroup { get; set; }\r
52 \r
53         public ShipListConfig()\r
54         {\r
55             Location = new Point(int.MinValue, int.MinValue);\r
56             ShipGroup = new List<int>[ShipListForm.GroupCount];\r
57             for (var i = 0; i < ShipGroup.Length; i++)\r
58                 ShipGroup[i] = new List<int>();\r
59         }\r
60     }\r
61 \r
62     public class LogConfig\r
63     {\r
64         public bool On { get; set; }\r
65         public string OutputDir { get; set; }\r
66         public int MaterialLogInterval { get; set; }\r
67         public bool ServerOn { get; set; }\r
68         public int Listen { get; set; }\r
69 \r
70         public LogConfig()\r
71         {\r
72             On = true;\r
73             OutputDir = "";\r
74             MaterialLogInterval = 10;\r
75             ServerOn = true;\r
76             Listen = 8008;\r
77         }\r
78     }\r
79 \r
80     public class Config\r
81     {\r
82         private readonly string _baseDir = Path.GetDirectoryName(Application.ExecutablePath);\r
83         private readonly string _configFileName;\r
84 \r
85         public Point Location { get; set; }\r
86         public bool TopMost { get; set; }\r
87         public bool HideOnMinimized { get; set; }\r
88         public bool FlashWindow { get; set; }\r
89         public bool ShowBaloonTip { get; set; }\r
90         public bool PlaySound { get; set; }\r
91         public int MarginShips { get; set; }\r
92         public int MarginEquips { get; set; }\r
93         public List<int> NotifyConditions { get; set; }\r
94         public List<int> ResetHours { get; set; }\r
95         public bool AlwaysShowResultRank { get; set; }\r
96         public int SoundVolume { get; set; }\r
97         public string MissionSoundFile { get; set; }\r
98         public string NDockSoundFile { get; set; }\r
99         public string KDockSoundFile { get; set; }\r
100         public string MaxShipsSoundFile { get; set; }\r
101         public string MaxEquipsSoundFile { get; set; }\r
102         public string DamagedShipSoundFile { get; set; }\r
103         public string Akashi20MinSoundFile { get; set; }\r
104         public string AkashiProgressSoundFile { get; set; }\r
105         public string AkashiCompleteSoundFile { get; set; }\r
106         public string ConditionSoundFile { get; set; }\r
107         public bool DebugLogging { get; set; }\r
108         public string DebugLogFile { get; set; }\r
109         public ProxyConfig Proxy { get; set; }\r
110         public ShipListConfig ShipList { get; set; }\r
111         public LogConfig Log { get; set; }\r
112 \r
113         public Config()\r
114         {\r
115             _configFileName = Path.Combine(_baseDir, "config.json");\r
116             Location = new Point(int.MinValue, int.MinValue);\r
117             FlashWindow = ShowBaloonTip = PlaySound = true;\r
118             MarginShips = 4;\r
119             MarginEquips = 10;\r
120             NotifyConditions = new List<int>(new[] {40, 49});\r
121             ResetHours = new List<int>(new[] {2});\r
122             AlwaysShowResultRank = false;\r
123             SoundVolume = 100;\r
124             MissionSoundFile = "ensei.mp3";\r
125             NDockSoundFile = "nyuukyo.mp3";\r
126             KDockSoundFile = "kenzou.mp3";\r
127             MaxShipsSoundFile = "kanmusu.mp3";\r
128             MaxEquipsSoundFile = "soubi.mp3";\r
129             DamagedShipSoundFile = "taiha.mp3";\r
130             Akashi20MinSoundFile = "20min.mp3";\r
131             AkashiProgressSoundFile = "syuuri.mp3";\r
132             AkashiCompleteSoundFile = "syuuri2.mp3";\r
133             ConditionSoundFile = "hirou.mp3";\r
134             DebugLogFile = "log.txt";\r
135             Proxy = new ProxyConfig();\r
136             ShipList = new ShipListConfig();\r
137             Log = new LogConfig();\r
138             ConvertPath(PrependBaseDir);\r
139         }\r
140 \r
141         public void Load()\r
142         {\r
143             try\r
144             {\r
145                 var config = (Config)DynamicJson.Parse(File.ReadAllText(_configFileName));\r
146                 foreach (var property in GetType().GetProperties())\r
147                     property.SetValue(this, property.GetValue(config, null), null);\r
148                 ConvertPath(PrependBaseDir);\r
149             }\r
150             catch (FileNotFoundException)\r
151             {\r
152             }\r
153         }\r
154 \r
155         public void Save()\r
156         {\r
157             ConvertPath(StripBaseDir);\r
158             File.WriteAllText(_configFileName, DynamicJson.Serialize(this));\r
159         }\r
160 \r
161         private void ConvertPath(Func<string, string> func)\r
162         {\r
163             foreach (var property in GetType().GetProperties())\r
164             {\r
165                 if (!property.Name.EndsWith("File"))\r
166                     continue;\r
167                 property.SetValue(this, func((string)property.GetValue(this)));\r
168             }\r
169             Log.OutputDir = func(Log.OutputDir);\r
170         }\r
171 \r
172         private string StripBaseDir(string path)\r
173         {\r
174             if (_baseDir == null)\r
175                 return path;\r
176             if (!path.StartsWith(_baseDir))\r
177                 return path;\r
178             path = path.Substring(_baseDir.Length);\r
179             return path.StartsWith(Path.DirectorySeparatorChar.ToString()) ? path.Substring(1) : path;\r
180         }\r
181 \r
182         private string PrependBaseDir(string path)\r
183         {\r
184             if (_baseDir == null)\r
185                 return path;\r
186             if (Path.IsPathRooted(path))\r
187                 return path;\r
188             return Path.Combine(_baseDir, path);\r
189         }\r
190     }\r
191 }