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
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
_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
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
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
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
\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
_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
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
\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
}\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
}\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
}\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
{\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