OSDN Git Service

パネルのクリックでもパネルを閉じるようにする
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / MainForm.cs
index 485ab00..0dd201c 100644 (file)
@@ -21,11 +21,13 @@ using System.Diagnostics;
 using System.Drawing;\r
 using System.IO;\r
 using System.Linq;\r
+using System.Net;\r
+using System.Net.Sockets;\r
 using System.Runtime.InteropServices;\r
 using System.Text;\r
 using System.Threading;\r
-using System.Windows.Forms;\r
 using System.Threading.Tasks;\r
+using System.Windows.Forms;\r
 using Codeplex.Data;\r
 using Microsoft.CSharp.RuntimeBinder;\r
 using Microsoft.Win32;\r
@@ -49,7 +51,7 @@ namespace KancolleSniffer
         private string _debugLogFile;\r
         private IEnumerator<string> _playLog;\r
         private LogServer _logServer;\r
-        private ProxyConfig _prevProxy;\r
+        private int _prevProxyPort;\r
         private readonly SystemProxy _systemProxy = new SystemProxy();\r
 \r
         public MainForm()\r
@@ -68,7 +70,7 @@ namespace KancolleSniffer
             _shipLabels = new ShipLabels();\r
             _shipLabels.CreateAkashiTimers(panelShipInfo);\r
             _shipLabels.CreateLabels(panelShipInfo, ShowShipOnShipList);\r
-            _shipLabels.CreateDamagedShipList(panelDamagedShipList);\r
+            _shipLabels.CreateDamagedShipList(panelDamagedShipList, panelDamagedShipList_Click);\r
             _shipLabels.CreateNDockLabels(panelDock);\r
             _shipListForm = new ShipListForm(_sniffer, _config) {Owner = this};\r
             _noticeQueue = new NoticeQueue(Ring);\r
@@ -89,8 +91,8 @@ namespace KancolleSniffer
             var request = session.Request.BodyAsString;\r
             if (_debugLogFile != null)\r
             {\r
-                File.AppendAllText(_debugLogFile,\r
-                    string.Format("url: {0}\nrequest: {1}\nresponse: {2}\n", session.Request.PathAndQuery, request, json.ToString()));\r
+                File.AppendAllText(_debugLogFile, string.Format("url: {0}\nrequest: {1}\nresponse: {2}\n",\r
+                    session.Request.PathAndQuery, request, json.ToString()));\r
             }\r
             try\r
             {\r
@@ -132,7 +134,6 @@ namespace KancolleSniffer
         private void MainForm_Load(object sender, EventArgs e)\r
         {\r
             _config.Load();\r
-            _prevProxy = _config.Proxy.Clone();\r
             RestoreLocation();\r
             if (_config.HideOnMinimized && WindowState == FormWindowState.Minimized)\r
                 ShowInTaskbar = false;\r
@@ -140,29 +141,44 @@ namespace KancolleSniffer
             ApplyDebugLogSetting();\r
             ApplyLogSetting();\r
             _sniffer.LoadState();\r
-            if (_config.Proxy.Auto)\r
-                _systemProxy.SetAutoProxyUrl(ProxyConfig.AutoConfigUrl);\r
-            StartProxy();\r
+            ApplyProxySetting();\r
             SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;\r
         }\r
 \r
-        private void StartProxy()\r
-        {\r
-            if (_config.Proxy.UseUpstream)\r
-            {\r
-                HttpProxy.UpstreamProxyHost = "127.0.0.1";\r
-                HttpProxy.UpstreamProxyPort = _config.Proxy.UpstreamPort;\r
-            }\r
-            HttpProxy.IsEnableUpstreamProxy = _config.Proxy.UseUpstream;\r
-            HttpProxy.Startup(_config.Proxy.Listen, false, false);\r
-        }\r
-\r
         private void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)\r
         {\r
             if (e.Mode != PowerModes.Resume)\r
                 return;\r
-            Thread.Sleep(10000);\r
-            SystemProxy.Refresh();\r
+            Task.Run(() =>\r
+            {\r
+                for (var i = 0; i < 5; Thread.Sleep(10000), i++)\r
+                {\r
+                    WebResponse res = null;\r
+                    SystemProxy.Refresh();\r
+                    var system = WebRequest.GetSystemWebProxy();\r
+                    if (!system.GetProxy(new Uri("http://125.6.184.16/")).IsLoopback)\r
+                    {\r
+                        File.AppendAllText("wakeup.log",\r
+                            $"[{DateTime.Now.ToString("g")}] proxy settings doesn't work.\r\n");\r
+                        continue;\r
+                    }\r
+                    try\r
+                    {\r
+                        var req = WebRequest.Create("http://kancollesniffer.osdn.jp/version");\r
+                        res = req.GetResponse();\r
+                        break;\r
+                    }\r
+                    catch\r
+                    {\r
+                        File.AppendAllText("wakeup.log",\r
+                            $"[{DateTime.Now.ToString("g")}] failed to connect internet.\r\n");\r
+                    }\r
+                    finally\r
+                    {\r
+                        res?.Close();\r
+                    }\r
+                }\r
+            });\r
         }\r
 \r
         private void MainForm_FormClosing(object sender, FormClosingEventArgs e)\r
@@ -179,10 +195,7 @@ namespace KancolleSniffer
 \r
         private void ShutdownProxy()\r
         {\r
-            lock (typeof (HttpProxy))\r
-            {\r
-                HttpProxy.Shutdown();\r
-            }\r
+            HttpProxy.Shutdown();\r
         }\r
 \r
         private void MainForm_Resize(object sender, EventArgs e)\r
@@ -237,45 +250,105 @@ namespace KancolleSniffer
             _debugLogFile = _config.DebugLogging ? _config.DebugLogFile : null;\r
         }\r
 \r
-        public void ApplyProxySetting()\r
+        public bool ApplyProxySetting()\r
+        {\r
+            if (!_config.Proxy.Auto)\r
+                _systemProxy.RestoreSettings();\r
+            if (_config.Proxy.UseUpstream)\r
+            {\r
+                HttpProxy.UpstreamProxyHost = "127.0.0.1";\r
+                HttpProxy.UpstreamProxyPort = _config.Proxy.UpstreamPort;\r
+            }\r
+            HttpProxy.IsEnableUpstreamProxy = _config.Proxy.UseUpstream;\r
+            var result = true;\r
+            if (!HttpProxy.IsInListening || _config.Proxy.Listen != _prevProxyPort)\r
+            {\r
+                ShutdownProxy();\r
+                result = StartProxy();\r
+            }\r
+            if (_config.Proxy.Auto && result)\r
+            {\r
+                _systemProxy.SetAutoProxyUrl(HttpProxy.LocalPort == 8080\r
+                    ? ProxyConfig.AutoConfigUrl\r
+                    : ProxyConfig.AutoConfigUrlWithPort + HttpProxy.LocalPort);\r
+            }\r
+            _prevProxyPort = _config.Proxy.Listen;\r
+            return result;\r
+        }\r
+\r
+        private bool StartProxy()\r
         {\r
-            if (_config.Proxy.Auto != _prevProxy.Auto)\r
+            try\r
             {\r
-                if (_config.Proxy.Auto)\r
-                    _systemProxy.SetAutoProxyUrl(ProxyConfig.AutoConfigUrl);\r
-                else\r
-                    _systemProxy.RestoreSettings();\r
+                HttpProxy.Startup(_config.Proxy.Listen, false, false);\r
             }\r
-            if (_config.Proxy.Listen != _prevProxy.Listen ||\r
-                _config.Proxy.UseUpstream != _prevProxy.UseUpstream ||\r
-                _config.Proxy.UpstreamPort != _prevProxy.UpstreamPort)\r
+            catch (SocketException e)\r
             {\r
-                Task.Run(() =>\r
+                if (e.SocketErrorCode != SocketError.AddressAlreadyInUse)\r
+                    throw;\r
+                if (WarnConflictPortNumber("プロキシサーバー", _config.Proxy.Listen, _config.Proxy.Auto) == DialogResult.No ||\r
+                    !_config.Proxy.Auto)\r
                 {\r
-                    ShutdownProxy();\r
-                    StartProxy();\r
-                });\r
+                    _systemProxy.RestoreSettings();\r
+                    return false;\r
+                }\r
+                HttpProxy.Startup(0, false, false);\r
+                _config.Proxy.Listen = HttpProxy.LocalPort;\r
             }\r
-            _prevProxy = _config.Proxy.Clone();\r
+            return true;\r
         }\r
 \r
-        public void ApplyLogSetting()\r
+        private DialogResult WarnConflictPortNumber(string name, int port, bool auto)\r
         {\r
-            if (_logServer != null && (!_config.Log.ServerOn || _config.Log.Listen != _logServer.Port))\r
+            var msg = $"{name}のポート番号{port}は他のアプリケーションが使用中です。";\r
+            var cap = "ポート番号の衝突";\r
+            return auto\r
+                ? MessageBox.Show(this, msg + "自動的に別の番号を割り当てますか?", cap,\r
+                    MessageBoxButtons.YesNo, MessageBoxIcon.Question)\r
+                : MessageBox.Show(this, msg + "設定ダイアログでポート番号を変更してください。", cap,\r
+                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation);\r
+        }\r
+\r
+        public bool ApplyLogSetting()\r
+        {\r
+            var result = true;\r
+            if (_config.Log.ServerOn)\r
             {\r
-                _logServer.Stop();\r
-                _logServer = null;\r
+                result = StartLogServer();\r
             }\r
-            if (_logServer == null && _config.Log.ServerOn)\r
+            else\r
             {\r
-                _logServer = new LogServer(_config.Log.Listen);\r
-                _logServer.Start();\r
+                _logServer?.Stop();\r
+                _logServer = null;\r
             }\r
-            if (_logServer != null)\r
-                _logServer.OutputDir = _config.Log.OutputDir;\r
             _sniffer.EnableLog(_config.Log.On ? LogType.All : LogType.None);\r
             _sniffer.MaterialLogInterval = _config.Log.MaterialLogInterval;\r
             _sniffer.LogOutputDir = _config.Log.OutputDir;\r
+            return result;\r
+        }\r
+\r
+        private bool StartLogServer()\r
+        {\r
+            var port = _config.Log.Listen;\r
+            if (_logServer?.Port == port)\r
+                return true;\r
+            _logServer?.Stop();\r
+            _logServer = null;\r
+            try\r
+            {\r
+                _logServer = new LogServer(port);\r
+                _logServer.Start();\r
+            }\r
+            catch (SocketException e) when (e.SocketErrorCode == SocketError.AddressAlreadyInUse)\r
+            {\r
+                if (WarnConflictPortNumber("閲覧サーバー", port, true) == DialogResult.No)\r
+                    return false;\r
+                _logServer = new LogServer(0);\r
+                _logServer.Start();\r
+                _config.Log.Listen = _logServer.Port;\r
+            }\r
+            _logServer.OutputDir = _config.Log.OutputDir;\r
+            return true;\r
         }\r
 \r
         public static bool IsVisibleOnAnyScreen(Rectangle rect)\r
@@ -391,13 +464,16 @@ namespace KancolleSniffer
             for (var i = 0; i < labels.Length; i++)\r
             {\r
                 var count = _sniffer.Item.MaterialHistory[i];\r
+                var port = count.Now - _sniffer.Item.PrevPort[i];\r
+                if (port >= 100000)\r
+                    port = 99999;\r
                 var day = count.Now - count.BegOfDay;\r
                 if (day >= 100000)\r
                     day = 99999;\r
                 var week = count.Now - count.BegOfWeek;\r
                 if (week >= 100000)\r
                     week = 99999;\r
-                labels[i].Text = $"{text[i]}\n{day:+#;-#;±0}\n{week:+#;-#;±0}";\r
+                labels[i].Text = $"{text[i]}\n{port:+#;-#;±0}\n{day:+#;-#;±0}\n{week:+#;-#;±0}";\r
             }\r
         }\r
 \r
@@ -451,9 +527,8 @@ namespace KancolleSniffer
 \r
         public void UpdateFighterPower()\r
         {\r
-            labelFighterPower.Text = _sniffer.GetFighterPower(_currentFleet, _config.WithAlvBonus).ToString("D");\r
-            toolTipFigherPower.SetToolTip(labelFighterPower,\r
-                (!_config.WithAlvBonus ? "熟練度込み " : "熟練度抜き ") + _sniffer.GetFighterPower(_currentFleet, !_config.WithAlvBonus));\r
+            labelFighterPower.Text = _sniffer.GetFighterPower(_currentFleet, true).ToString("D");\r
+            toolTipFigherPower.SetToolTip(labelFighterPower, "熟練度抜き " + _sniffer.GetFighterPower(_currentFleet, false));\r
         }\r
 \r
         private void UpdateLoS()\r
@@ -766,6 +841,12 @@ namespace KancolleSniffer
             }\r
         }\r
 \r
+        private void labelBucketHistory_Click(object sender, EventArgs e)\r
+        {\r
+            labelBucketHistory.Visible = false;\r
+            labelBucketHistoryButton.BackColor = DefaultBackColor;\r
+        }\r
+\r
         private void labelMaterialHistoryButton_Click(object sender, EventArgs e)\r
         {\r
             if (panelMaterialHistory.Visible)\r
@@ -781,6 +862,12 @@ namespace KancolleSniffer
             }\r
         }\r
 \r
+        private void panelMaterialHistory_Click(object sender, EventArgs e)\r
+        {\r
+            panelMaterialHistory.Visible = false;\r
+            labelMaterialHistoryButton.BackColor = DefaultBackColor;\r
+        }\r
+\r
         public void ResetAchievemnt()\r
         {\r
             _sniffer.Achievement.Reset();\r
@@ -802,6 +889,12 @@ namespace KancolleSniffer
             }\r
         }\r
 \r
+        private void panelDamagedShipList_Click(object sender, EventArgs e)\r
+        {\r
+            panelDamagedShipList.Visible = false;\r
+            labelDamgedShipListButton.BackColor = DefaultBackColor;\r
+        }\r
+\r
         private void ShipListToolStripMenuItem_Click(object sender, EventArgs e)\r
         {\r
             _shipListForm.UpdateList();\r
@@ -815,5 +908,17 @@ namespace KancolleSniffer
         {\r
             Process.Start("http://localhost:" + _config.Log.Listen + "/");\r
         }\r
+\r
+        private void CaptureToolStripMenuItem_Click(object sender, EventArgs e)\r
+        {\r
+            try\r
+            {\r
+                var proc = new ProcessStartInfo("BurageSnap.exe") {WorkingDirectory = "Capture"};\r
+                Process.Start(proc);\r
+            }\r
+            catch (FileNotFoundException)\r
+            {\r
+            }\r
+        }\r
     }\r
 }
\ No newline at end of file