diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 2a7975e1..8717156b 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -44,6 +44,7 @@ namespace v2rayN.Forms Application.ApplicationExit += (sender, args) => { Utils.ClearTempPath(); + statistics.Close(); }; } @@ -52,70 +53,70 @@ namespace v2rayN.Forms ConfigHandler.LoadConfig(ref config); v2rayHandler = new V2rayHandler(); v2rayHandler.ProcessEvent += v2rayHandler_ProcessEvent; - statistics = new StatisticsHandler(config, - (ulong totalUp, ulong totalDown, ulong up, ulong down, List statistics) => + statistics = new StatisticsHandler(config, UpdateHandler); + } + + private void UpdateHandler(ulong totalUp, ulong totalDown, ulong up, ulong down, List statistics) + { + double up_amount = 0.0, down_amount; + string up_unit = "", down_unit; + + up /= (ulong) (config.statisticsFreshRate / 1000f); + down /= (ulong) (config.statisticsFreshRate / 1000f); + + Utils.ToHumanReadable(up, out up_amount, out up_unit); + Utils.ToHumanReadable(down, out down_amount, out down_unit); + up_unit += "/s"; + down_unit += "/s"; + + toolSslBlank4.Text = string.Format( + "{4}: {0:f2} {1} | {5}: {2:f2} {3}", + up_amount, + up_unit, + down_amount, + down_unit, + UIRes.I18N("uploadSpeed"), + UIRes.I18N("downloadSpeed") + ); + + List datas = new List(); + for (int i = 0; i < config.vmess.Count; i++) + { + string totalUp_ = string.Empty, + totalDown_ = string.Empty, + todayUp_ = string.Empty, + todayDown_ = string.Empty; + var index = statistics.FindIndex(item_ => (config.vmess[i].address == item_.address && config.vmess[i].port == item_.port && config.vmess[i].path == item_.path)); + if (index != -1) { - double up_amount = 0.0, down_amount; - string up_unit = "", down_unit; - - up /= (ulong)(config.statisticsFreshRate / 1000f); - down /= (ulong)(config.statisticsFreshRate / 1000f); - - Utils.ToHumanReadable(up, out up_amount, out up_unit); - Utils.ToHumanReadable(down, out down_amount, out down_unit); - up_unit += "/s"; - down_unit += "/s"; - - toolSslBlank4.Text = string.Format( - "{4}: {0:f2} {1} | {5}: {2:f2} {3}", - up_amount, - up_unit, - down_amount, - down_unit, - UIRes.I18N("uploadSpeed"), - UIRes.I18N("downloadSpeed") - ); - - - List datas = new List(); - for (int i= 0; i < config.vmess.Count; i++) + Func human_fy = (amount) => { - string totalUp_ = string.Empty, - totalDown_ = string.Empty, - todayUp_ = string.Empty, - todayDown_ = string.Empty; - var index = statistics.FindIndex(item_ => (config.vmess[i].address == item_.address && config.vmess[i].port == item_.port)); - if (index != -1) - { - Func human_fy = (amount) => - { - double result; - string unit; - Utils.ToHumanReadable(amount, out result, out unit); - return $"{string.Format("{0:f2}", result)}{unit}"; - }; - totalUp_ = human_fy(statistics[index].totalUp); - totalDown_ = human_fy(statistics[index].totalDown); - todayUp_ = human_fy(statistics[index].todayUp); - todayDown_ = human_fy(statistics[index].todayDown); - } + double result; + string unit; + Utils.ToHumanReadable(amount, out result, out unit); + return $"{string.Format("{0:f2}", result)}{unit}"; + }; + totalUp_ = human_fy(statistics[index].totalUp); + totalDown_ = human_fy(statistics[index].totalDown); + todayUp_ = human_fy(statistics[index].todayUp); + todayDown_ = human_fy(statistics[index].todayDown); + } - datas.Add(new string[] { totalUp_, totalDown_, todayUp_, todayDown_ }); - } + datas.Add(new string[] { totalUp_, totalDown_, todayUp_, todayDown_}); + } - lvServers.Invoke((MethodInvoker)delegate - { - lvServers.SuspendLayout(); - for (int i =0; i< datas.Count; i++) - { - lvServers.Items[i].SubItems[7].Text = datas[i][0]; - lvServers.Items[i].SubItems[8].Text = datas[i][1]; - lvServers.Items[i].SubItems[9].Text = datas[i][2]; - lvServers.Items[i].SubItems[10].Text = datas[i][3]; - } - lvServers.ResumeLayout(); - }); - }); + lvServers.Invoke((MethodInvoker)delegate + { + lvServers.SuspendLayout(); + for (int i =0; i 3, 17 - + 327, 17 - + 447, 22 @@ -401,12 +401,12 @@ 0 - + 17, 17 - - + + 137, 17 - + NoControl @@ -494,12 +494,12 @@ True - + 232, 17 - - + + 498, 17 - + Fill @@ -560,9 +560,9 @@ 0 - + 603, 17 - + 55, 17 @@ -609,7 +609,7 @@ 31, 17 - N/A + Disabled 3, 151 @@ -686,9 +686,9 @@ 4 - + 409, 17 - + 6, 56 @@ -736,13 +736,13 @@ - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAE3SURBVFhH7ZaBDQIhDEVvBEdwBDfQDXQER3AD3cARdAPd - QDfSDbQvuSb1AicFjJrwkxcN0FIolOuamv5VE2E+gLaPayWchEcE+hhTXVPhIoQmDcFYbKpoJtwEdX4X - jgIrXfTwnzb6dBw22BaJVdjJmWQs1/SdBRtE0U5cBXW2oSFRO0HtSEeW2FZ1wsq9sjuRdTDVAXnNuWLY - 6JnAl0sYa/Q5q1dhq35ci+Bkq2HJvbZpxGeybAAuw4Fq+cnW1wPITgHFYxvBUw+qHEIL1yq1vDKhVlH3 - NQwF4JkcFRWiUAB7IVW2FFPO3YqlgPd+LJf02e8Fdi3rMdIAcLDuf9UpeT0IS0G/hvhPm305vSl7EQFY - B6zCvozvYGzRM8zEoeg5TPZwDaGvpHQni1yzSxbXPW9q+hF13ROHuJnQcjbhtQAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAATdJREFUWEftloENAiEMRW8ER3AEN9ANdARHcAPdwBF0A91AN9INtC+5JvUCJwWM + mvCTFw3QUiiU65qa/lUTYT6Ato9rJZyERwT6GFNdU+EihCYNwVhsqmgm3AR1fheOAitd9PCfNvp0HDbY + FolV2MmZZCzX9J0FG0TRTlwFdbahIVE7Qe1IR5bYVnXCyr2yO5F1MNUBec25YtjomcCXSxhr9DmrV2Gr + flyL4GSrYcm9tmnEZ7JsAC7DgWr5ydbXA8hOAcVjG8FTD6ocQgvXKrW8MqFWUfc1DAXgmRwVFaJQAHsh + VbYUU87diqWA934sl/TZ7wV2Lesx0gBwsO5/1Sl5PQhLQb+G+E+bfTm9KXsRAVgHrMK+jO9gbNEzzMSh + 6DlM9nANoa+kdCeLXLNLFtc9b2r6EXXdE4e4mdByNuG1AAAAAElFTkSuQmCC @@ -852,9 +852,9 @@ - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/ - GqfZVG6X8mg1dfUAAPBQxAZd0SJruVXHWwAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAADJJREFUWEftzrENACAIRUFGdVMdTZkAG4zFXfI68kMAAD8ap9lUbpfyaDV19QAA + 8FDEBl3RImu5VcdbAAAAAElFTkSuQmCC @@ -890,12 +890,12 @@ 5 - + True - - + + 65 - + 6, 12 diff --git a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx index 6e2ce7b5..2e627b51 100644 --- a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx @@ -456,4 +456,7 @@ 移除重复的服务器 + + 未启用 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs index b692f928..e3d1883f 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Drawing; using System.Drawing.Text; using System.Windows.Forms; @@ -326,6 +327,7 @@ namespace v2rayN.Forms config.allowLANConn = chkAllowLANConn.Checked; + var lastEnableStatistics = config.enableStatistics; config.enableStatistics = chkEnableStatistics.Checked; uint days = 0; @@ -336,6 +338,15 @@ namespace v2rayN.Forms config.statisticsFreshRate = (int)cbFreshrate.SelectedValue; + if(lastEnableStatistics != config.enableStatistics) + { + /// https://stackoverflow.com/questions/779405/how-do-i-restart-my-c-sharp-winform-application + // Shut down the current app instance. + Application.Exit(); + + // Restart the app passing "/restart [processId]" as cmd line args + Process.Start(Application.ExecutablePath, "/restart " + Process.GetCurrentProcess().Id); + } return 0; } diff --git a/v2rayN/v2rayN/Handler/StatisticsHandler.cs b/v2rayN/v2rayN/Handler/StatisticsHandler.cs index ca1de95c..0d3cd907 100644 --- a/v2rayN/v2rayN/Handler/StatisticsHandler.cs +++ b/v2rayN/v2rayN/Handler/StatisticsHandler.cs @@ -62,7 +62,7 @@ namespace v2rayN.Handler DeleteExpiredLog(); foreach (var server in config.vmess) { - var statistic = new ServerStatistics(server.remarks, server.address, server.port, 0, 0, 0, 0); + var statistic = new ServerStatistics(server.remarks, server.address, server.port, server.path, 0, 0, 0, 0); Statistic.Add(statistic); } @@ -211,7 +211,7 @@ namespace v2rayN.Handler overallWriter.WriteLine($"DOWN {string.Format("{0:f2}", down_amount)}{down_unit} {TotalDown}"); foreach(var s in Statistic) { - overallWriter.WriteLine($"* {s.name} {s.address} {s.port} {s.totalUp} {s.totalDown}"); + overallWriter.WriteLine($"* {s.name} {s.address} {s.port} {s.path} {s.totalUp} {s.totalDown}"); } } } @@ -230,7 +230,7 @@ namespace v2rayN.Handler dailyWriter.WriteLine($"LastUpdate {DateTime.Now.ToLongDateString()} {DateTime.Now.ToLongTimeString()}"); foreach (var s in Statistic) { - dailyWriter.WriteLine($"* {s.name} {s.address} {s.port} {s.todayUp} {s.todayDown}"); + dailyWriter.WriteLine($"* {s.name} {s.address} {s.port} {s.path} {s.todayUp} {s.todayDown}"); } } } @@ -282,8 +282,9 @@ namespace v2rayN.Handler var name = datas[1]; var address = datas[2]; var port = int.Parse(datas[3]); - var totalUp = ulong.Parse(datas[4]); - var totalDown = ulong.Parse(datas[5]); + var path = datas[4]; + var totalUp = ulong.Parse(datas[5]); + var totalDown = ulong.Parse(datas[6]); var index = Statistic.FindIndex(item => item.address == address && item.port == port); if (index != -1) @@ -293,7 +294,7 @@ namespace v2rayN.Handler } else { - var s = new Mode.ServerStatistics(name, address, port, totalUp, totalDown, 0, 0); + var s = new Mode.ServerStatistics(name, address, port, path, totalUp, totalDown, 0, 0); Statistic.Add(s); } } @@ -325,8 +326,9 @@ namespace v2rayN.Handler var name = datas[1]; var address = datas[2]; var port = int.Parse(datas[3]); - var todayUp = ulong.Parse(datas[4]); - var todayDown = ulong.Parse(datas[5]); + var path = datas[4]; + var todayUp = ulong.Parse(datas[5]); + var todayDown = ulong.Parse(datas[6]); var index = Statistic.FindIndex(item => item.address == address && item.port == port); if (index != -1) @@ -336,7 +338,7 @@ namespace v2rayN.Handler } else { - var s = new Mode.ServerStatistics(name, address, port, 0, 0, todayUp, todayDown); + var s = new Mode.ServerStatistics(name, address, port, path, 0, 0, todayUp, todayDown); Statistic.Add(s); } } diff --git a/v2rayN/v2rayN/Mode/ServerStatistics.cs b/v2rayN/v2rayN/Mode/ServerStatistics.cs index ac8ee61b..4240e33e 100644 --- a/v2rayN/v2rayN/Mode/ServerStatistics.cs +++ b/v2rayN/v2rayN/Mode/ServerStatistics.cs @@ -11,17 +11,19 @@ namespace v2rayN.Mode public string name; public string address; public int port; + public string path; public ulong totalUp; public ulong totalDown; public ulong todayUp; public ulong todayDown; public ServerStatistics() { } - public ServerStatistics(string name, string addr, int port, ulong totalUp, ulong totalDown, ulong todayUp, ulong todayDown) + public ServerStatistics(string name, string addr, int port, string path, ulong totalUp, ulong totalDown, ulong todayUp, ulong todayDown) { this.name = name; this.address = addr; this.port = port; + this.path = path; this.totalUp = totalUp; this.totalDown = totalDown; this.todayUp = todayUp; diff --git a/v2rayN/v2rayN/Program.cs b/v2rayN/v2rayN/Program.cs index c9abcbe6..b48c8110 100644 --- a/v2rayN/v2rayN/Program.cs +++ b/v2rayN/v2rayN/Program.cs @@ -28,6 +28,25 @@ namespace v2rayN AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; + + var args = Environment.GetCommandLineArgs(); + bool _isRestart = args.Length > 1 && args[1] == "/restart"; + if (_isRestart) + { + try + { + // get old process and wait UP TO 5 secs then give up! + int _restartProcessId = int.Parse(args[2]); + Process oldProcess = Process.GetProcessById(_restartProcessId); + oldProcess.WaitForExit(); + } + catch + { + // the process did not exist - probably already closed! + //TODO: --> LOG + } + } + Process instance = RunningInstance(); if (instance == null) { @@ -43,7 +62,7 @@ namespace v2rayN } else { - UI.Show("v2rayN is already running(v2rayN已经运行)"); + UI.Show($"v2rayN is already running(v2rayN已经运行){args[1]} {args[2]}"); } } diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index 57725c24..21ea4727 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -316,7 +316,7 @@ namespace v2rayN var list = new List(); foreach (var item in source) { - if(!list.Exists(i => item.address == i.address && item.port == i.port)) + if(!list.Exists(i => item.address == i.address && item.port == i.port && item.path == i.path)) { list.Add(item); } diff --git a/v2rayN/v2rayN/v2rayN.csproj.user b/v2rayN/v2rayN/v2rayN.csproj.user index 68f714aa..fee3aea9 100644 --- a/v2rayN/v2rayN/v2rayN.csproj.user +++ b/v2rayN/v2rayN/v2rayN.csproj.user @@ -14,4 +14,8 @@ false + + Project + /restart 1001 + \ No newline at end of file