一些修改

1. 需要重启的设置保存会自动重启
2. 去重逻辑更新 address port path
3. 一些重构和小修改
pull/40/head
CGQAQ 2019-08-26 16:21:08 +08:00
parent 26c9cd4d27
commit c1354600c7
9 changed files with 153 additions and 101 deletions

View File

@ -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<Mode.ServerStatistics> statistics) =>
statistics = new StatisticsHandler(config, UpdateHandler);
}
private void UpdateHandler(ulong totalUp, ulong totalDown, ulong up, ulong down, List<Mode.ServerStatistics> 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<string[]> datas = new List<string[]>();
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<string[]> datas = new List<string[]>();
for (int i= 0; i < config.vmess.Count; i++)
Func<ulong, string> 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<ulong, string> 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<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();
});
}
private void MainForm_VisibleChanged(object sender, EventArgs e)
@ -155,7 +156,9 @@ namespace v2rayN.Forms
}
if(e.CloseReason == CloseReason.ApplicationExitCall)
{
ConfigHandler.SaveConfig(ref config);
statistics.saveToFile();
statistics.Close();
}
}
@ -519,6 +522,14 @@ namespace v2rayN.Forms
break;
case Keys.T:
// Speed test selected servers
if (!config.sysAgentEnabled || config.listenerType != 1)
{
UI.Show(UIRes.I18N("NeedHttpGlobalProxy"));
return;
}
UI.Show(UIRes.I18N("SpeedServerTips"));
GetLvSelectedIndex();
ServerSpeedTest();
break;

View File

@ -125,9 +125,9 @@
<data name="splitContainer1.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 17</value>
</data>
<metadata name="cmsLv.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<data name="cmsLv.TrayLocation" type="System.Drawing.Point, System.Drawing">
<value>327, 17</value>
</metadata>
</data>
<data name="menuAddVmessServer.Size" type="System.Drawing.Size, System.Drawing">
<value>447, 22</value>
</data>
@ -401,12 +401,12 @@
<data name="&gt;&gt;splitContainer1.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<metadata name="notifyMain.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<data name="notifyMain.TrayLocation" type="System.Drawing.Point, System.Drawing">
<value>17, 17</value>
</metadata>
<metadata name="cmsMain.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
</data>
<data name="cmsMain.TrayLocation" type="System.Drawing.Point, System.Drawing">
<value>137, 17</value>
</metadata>
</data>
<data name="cmsMain.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
@ -494,12 +494,12 @@
<data name="notifyMain.Visible" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<metadata name="bgwPing.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<data name="bgwPing.TrayLocation" type="System.Drawing.Point, System.Drawing">
<value>232, 17</value>
</metadata>
<metadata name="bgwScan.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
</data>
<data name="bgwScan.TrayLocation" type="System.Drawing.Point, System.Drawing">
<value>498, 17</value>
</metadata>
</data>
<data name="groupBox1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
@ -560,9 +560,9 @@
<data name="&gt;&gt;txtMsgBox.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<metadata name="ssMain.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<data name="ssMain.TrayLocation" type="System.Drawing.Point, System.Drawing">
<value>603, 17</value>
</metadata>
</data>
<data name="toolSslSocksPortLab.Size" type="System.Drawing.Size, System.Drawing">
<value>55, 17</value>
</data>
@ -609,7 +609,7 @@
<value>31, 17</value>
</data>
<data name="toolSslBlank4.Text" xml:space="preserve">
<value>N/A</value>
<value>Disabled</value>
</data>
<data name="ssMain.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 151</value>
@ -686,9 +686,9 @@
<data name="&gt;&gt;panel1.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<metadata name="tsMain.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<data name="tsMain.TrayLocation" type="System.Drawing.Point, System.Drawing">
<value>409, 17</value>
</metadata>
</data>
<data name="toolStripSeparator4.Size" type="System.Drawing.Size, System.Drawing">
<value>6, 56</value>
</data>
@ -736,13 +736,13 @@
</data>
<data name="tsbReload.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<data name="tsbReload.ImageAlign" type="System.Drawing.ContentAlignment, System.Drawing">
@ -852,9 +852,9 @@
</data>
<data name="tsbClose.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/
GqfZVG6X8mg1dfUAAPBQxAZd0SJruVXHWwAAAABJRU5ErkJggg==
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wwAADsMBx2+oZAAAADJJREFUWEftzrENACAIRUFGdVMdTZkAG4zFXfI68kMAAD8ap9lUbpfyaDV19QAA
8FDEBl3RImu5VcdbAAAAAElFTkSuQmCC
</value>
</data>
<data name="tsbClose.ImageTransparentColor" type="System.Drawing.Color, System.Drawing">
@ -890,12 +890,12 @@
<data name="&gt;&gt;tsMain.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<data name="$this.Localizable" type="System.Boolean, mscorlib">
<value>True</value>
</metadata>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
</data>
<data name="$this.TrayHeight" type="System.Int32, mscorlib">
<value>65</value>
</metadata>
</data>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>6, 12</value>
</data>

View File

@ -456,4 +456,7 @@
<data name="menuRemoveDuplicateServer.Text" xml:space="preserve">
<value>移除重复的服务器</value>
</data>
<data name="toolSslBlank4.Text" xml:space="preserve">
<value>未启用</value>
</data>
</root>

View File

@ -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;
}

View File

@ -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);
}
}

View File

@ -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;

View File

@ -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]}");
}
}

View File

@ -316,7 +316,7 @@ namespace v2rayN
var list = new List<Mode.VmessItem>();
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);
}

View File

@ -14,4 +14,8 @@
<PropertyGroup>
<EnableSecurityDebugging>false</EnableSecurityDebugging>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
<StartAction>Project</StartAction>
<StartArguments>/restart 1001</StartArguments>
</PropertyGroup>
</Project>