From d42346d50053dc3498f8b15b988df61ce4fcada3 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sun, 13 Mar 2022 10:41:04 +0800 Subject: [PATCH] Add server group --- v2rayN/v2rayN/Forms/AddServer2Form.cs | 7 +- v2rayN/v2rayN/Forms/AddServer3Form.cs | 10 +- v2rayN/v2rayN/Forms/AddServer4Form.cs | 10 +- v2rayN/v2rayN/Forms/AddServer5Form.cs | 6 +- v2rayN/v2rayN/Forms/AddServer6Form.cs | 8 +- v2rayN/v2rayN/Forms/AddServerForm.cs | 8 +- v2rayN/v2rayN/Forms/BaseServerForm.cs | 4 +- .../Forms/GroupSettingControl.Designer.cs | 86 + v2rayN/v2rayN/Forms/GroupSettingControl.cs | 59 + v2rayN/v2rayN/Forms/GroupSettingControl.resx | 243 ++ .../Forms/GroupSettingControl.zh-Hans.resx | 133 + .../v2rayN/Forms/GroupSettingForm.Designer.cs | 97 + v2rayN/v2rayN/Forms/GroupSettingForm.cs | 108 + v2rayN/v2rayN/Forms/GroupSettingForm.resx | 273 ++ .../Forms/GroupSettingForm.zh-Hans.resx | 132 + v2rayN/v2rayN/Forms/MainForm.Designer.cs | 220 +- v2rayN/v2rayN/Forms/MainForm.cs | 151 +- v2rayN/v2rayN/Forms/MainForm.resx | 2813 +++++++++-------- v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx | 131 +- v2rayN/v2rayN/Forms/QRCodeControl.cs | 10 +- .../Forms/RoutingSettingForm.Designer.cs | 79 +- v2rayN/v2rayN/Forms/RoutingSettingForm.cs | 8 + v2rayN/v2rayN/Forms/RoutingSettingForm.resx | 2112 +++++++------ .../Forms/RoutingSettingForm.zh-Hans.resx | 111 +- .../Forms/SubSettingControl.Designer.cs | 19 + v2rayN/v2rayN/Forms/SubSettingControl.cs | 22 +- v2rayN/v2rayN/Forms/SubSettingControl.resx | 131 +- .../Forms/SubSettingControl.zh-Hans.resx | 6 + v2rayN/v2rayN/Forms/SubSettingForm.resx | 8 +- v2rayN/v2rayN/Handler/ConfigHandler.cs | 464 ++- v2rayN/v2rayN/Handler/MainFormHandler.cs | 36 +- v2rayN/v2rayN/Handler/ShareHandler.cs | 14 +- v2rayN/v2rayN/Handler/SpeedtestHandler.cs | 47 +- v2rayN/v2rayN/Handler/StatisticsHandler.cs | 2 +- v2rayN/v2rayN/Handler/UpdateHandle.cs | 3 +- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 241 +- v2rayN/v2rayN/Handler/V2rayHandler.cs | 3 +- v2rayN/v2rayN/Mode/Config.cs | 315 +- v2rayN/v2rayN/Mode/ServerTestItem.cs | 4 - v2rayN/v2rayN/Resx/ResUI.Designer.cs | 9 + v2rayN/v2rayN/Resx/ResUI.resx | 3 + v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 3 + v2rayN/v2rayN/Sample/SampleServerConfig.txt | 2 +- v2rayN/v2rayN/Tool/Utils.cs | 12 + v2rayN/v2rayN/v2rayN.csproj | 28 + 45 files changed, 4843 insertions(+), 3348 deletions(-) create mode 100644 v2rayN/v2rayN/Forms/GroupSettingControl.Designer.cs create mode 100644 v2rayN/v2rayN/Forms/GroupSettingControl.cs create mode 100644 v2rayN/v2rayN/Forms/GroupSettingControl.resx create mode 100644 v2rayN/v2rayN/Forms/GroupSettingControl.zh-Hans.resx create mode 100644 v2rayN/v2rayN/Forms/GroupSettingForm.Designer.cs create mode 100644 v2rayN/v2rayN/Forms/GroupSettingForm.cs create mode 100644 v2rayN/v2rayN/Forms/GroupSettingForm.resx create mode 100644 v2rayN/v2rayN/Forms/GroupSettingForm.zh-Hans.resx diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.cs b/v2rayN/v2rayN/Forms/AddServer2Form.cs index 999b0c25..012f3039 100644 --- a/v2rayN/v2rayN/Forms/AddServer2Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer2Form.cs @@ -6,7 +6,7 @@ using v2rayN.Mode; namespace v2rayN.Forms { public partial class AddServer2Form : BaseServerForm - { + { public AddServer2Form() { @@ -15,7 +15,7 @@ namespace v2rayN.Forms private void AddServer2Form_Load(object sender, EventArgs e) { - if (EditIndex >= 0) + if (vmessItem != null) { BindingServer(); } @@ -30,7 +30,6 @@ namespace v2rayN.Forms /// private void BindingServer() { - vmessItem = config.vmess[EditIndex]; txtRemarks.Text = vmessItem.remarks; txtAddress.Text = vmessItem.address; txtAddress.ReadOnly = true; @@ -55,7 +54,7 @@ namespace v2rayN.Forms } vmessItem.remarks = remarks; - if (ConfigHandler.EditCustomServer(ref config, vmessItem, EditIndex) == 0) + if (ConfigHandler.EditCustomServer(ref config, vmessItem) == 0) { this.DialogResult = DialogResult.OK; } diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.cs b/v2rayN/v2rayN/Forms/AddServer3Form.cs index e4920b37..b300df46 100644 --- a/v2rayN/v2rayN/Forms/AddServer3Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer3Form.cs @@ -6,7 +6,7 @@ using v2rayN.Mode; namespace v2rayN.Forms { public partial class AddServer3Form : BaseServerForm - { + { public AddServer3Form() { @@ -16,14 +16,14 @@ namespace v2rayN.Forms private void AddServer3Form_Load(object sender, EventArgs e) { cmbSecurity.Items.AddRange(config.GetShadowsocksSecuritys().ToArray()); - if (EditIndex >= 0) + if (vmessItem != null) { - vmessItem = config.vmess[EditIndex]; BindingServer(); } else { vmessItem = new VmessItem(); + vmessItem.groupId = groupId; ClearServer(); } } @@ -89,7 +89,7 @@ namespace v2rayN.Forms vmessItem.security = security; vmessItem.remarks = remarks; - if (ConfigHandler.AddShadowsocksServer(ref config, vmessItem, EditIndex) == 0) + if (ConfigHandler.AddShadowsocksServer(ref config, vmessItem) == 0) { this.DialogResult = DialogResult.OK; } @@ -101,7 +101,7 @@ namespace v2rayN.Forms private void btnClose_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.Cancel; - } + } } } diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.cs b/v2rayN/v2rayN/Forms/AddServer4Form.cs index 66d63999..800eaf7d 100644 --- a/v2rayN/v2rayN/Forms/AddServer4Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer4Form.cs @@ -6,7 +6,7 @@ using v2rayN.Mode; namespace v2rayN.Forms { public partial class AddServer4Form : BaseServerForm - { + { public AddServer4Form() { @@ -15,14 +15,14 @@ namespace v2rayN.Forms private void AddServer4Form_Load(object sender, EventArgs e) { - if (EditIndex >= 0) + if (vmessItem != null) { - vmessItem = config.vmess[EditIndex]; BindingServer(); } else { vmessItem = new VmessItem(); + vmessItem.groupId = groupId; ClearServer(); } } @@ -77,7 +77,7 @@ namespace v2rayN.Forms vmessItem.security = security; vmessItem.remarks = remarks; - if (ConfigHandler.AddSocksServer(ref config, vmessItem, EditIndex) == 0) + if (ConfigHandler.AddSocksServer(ref config, vmessItem) == 0) { this.DialogResult = DialogResult.OK; } @@ -90,7 +90,7 @@ namespace v2rayN.Forms { this.DialogResult = DialogResult.Cancel; } - + } } diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.cs b/v2rayN/v2rayN/Forms/AddServer5Form.cs index 7635e839..5c1d747a 100644 --- a/v2rayN/v2rayN/Forms/AddServer5Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer5Form.cs @@ -17,14 +17,14 @@ namespace v2rayN.Forms { cmbFlow.Items.AddRange(Global.xtlsFlows.ToArray()); transportControl.AllowXtls = true; - if (EditIndex >= 0) + if (vmessItem != null) { - vmessItem = config.vmess[EditIndex]; BindingServer(); } else { vmessItem = new VmessItem(); + vmessItem.groupId = groupId; ClearServer(); } } @@ -94,7 +94,7 @@ namespace v2rayN.Forms vmessItem.security = security; vmessItem.remarks = remarks; - if (ConfigHandler.AddVlessServer(ref config, vmessItem, EditIndex) == 0) + if (ConfigHandler.AddVlessServer(ref config, vmessItem) == 0) { this.DialogResult = DialogResult.OK; } diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.cs b/v2rayN/v2rayN/Forms/AddServer6Form.cs index 70c60443..7b0abb05 100644 --- a/v2rayN/v2rayN/Forms/AddServer6Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer6Form.cs @@ -16,14 +16,14 @@ namespace v2rayN.Forms { cmbFlow.Items.AddRange(Global.xtlsFlows.ToArray()); transportControl.AllowXtls = true; - if (EditIndex >= 0) + if (vmessItem != null) { - vmessItem = config.vmess[EditIndex]; BindingServer(); } else { vmessItem = new VmessItem(); + vmessItem.groupId = groupId; ClearServer(); } } @@ -52,7 +52,7 @@ namespace v2rayN.Forms txtPort.Text = ""; txtId.Text = ""; cmbFlow.Text = ""; - txtRemarks.Text = ""; + txtRemarks.Text = ""; transportControl.ClearServer(vmessItem); } @@ -89,7 +89,7 @@ namespace v2rayN.Forms vmessItem.flow = flow; vmessItem.remarks = remarks; - if (ConfigHandler.AddTrojanServer(ref config, vmessItem, EditIndex) == 0) + if (ConfigHandler.AddTrojanServer(ref config, vmessItem) == 0) { this.DialogResult = DialogResult.OK; } diff --git a/v2rayN/v2rayN/Forms/AddServerForm.cs b/v2rayN/v2rayN/Forms/AddServerForm.cs index 02223070..57b5871f 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.cs @@ -16,14 +16,14 @@ namespace v2rayN.Forms private void AddServerForm_Load(object sender, EventArgs e) { cmbSecurity.Items.AddRange(Global.vmessSecuritys.ToArray()); - if (EditIndex >= 0) + if (vmessItem != null) { - vmessItem = config.vmess[EditIndex]; BindingServer(); } else { vmessItem = new VmessItem(); + vmessItem.groupId = groupId; ClearServer(); } } @@ -58,7 +58,7 @@ namespace v2rayN.Forms transportControl.ClearServer(vmessItem); } - + private void btnOK_Click(object sender, EventArgs e) { string address = txtAddress.Text; @@ -93,7 +93,7 @@ namespace v2rayN.Forms vmessItem.security = security; vmessItem.remarks = remarks; - if (ConfigHandler.AddServer(ref config, vmessItem, EditIndex) == 0) + if (ConfigHandler.AddServer(ref config, vmessItem) == 0) { this.DialogResult = DialogResult.OK; } diff --git a/v2rayN/v2rayN/Forms/BaseServerForm.cs b/v2rayN/v2rayN/Forms/BaseServerForm.cs index 84711727..e68198fe 100644 --- a/v2rayN/v2rayN/Forms/BaseServerForm.cs +++ b/v2rayN/v2rayN/Forms/BaseServerForm.cs @@ -6,8 +6,8 @@ namespace v2rayN.Forms { public partial class BaseServerForm : BaseForm { - public int EditIndex { get; set; } - protected VmessItem vmessItem = null; + public VmessItem vmessItem = null; + public string groupId; public BaseServerForm() { diff --git a/v2rayN/v2rayN/Forms/GroupSettingControl.Designer.cs b/v2rayN/v2rayN/Forms/GroupSettingControl.Designer.cs new file mode 100644 index 00000000..239057e5 --- /dev/null +++ b/v2rayN/v2rayN/Forms/GroupSettingControl.Designer.cs @@ -0,0 +1,86 @@ +namespace v2rayN.Forms +{ + partial class GroupSettingControl + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GroupSettingControl)); + this.grbMain = new System.Windows.Forms.GroupBox(); + this.btnRemove = new System.Windows.Forms.Button(); + this.txtRemarks = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.grbMain.SuspendLayout(); + this.SuspendLayout(); + // + // grbMain + // + resources.ApplyResources(this.grbMain, "grbMain"); + this.grbMain.Controls.Add(this.btnRemove); + this.grbMain.Controls.Add(this.txtRemarks); + this.grbMain.Controls.Add(this.label2); + this.grbMain.Name = "grbMain"; + this.grbMain.TabStop = false; + // + // btnRemove + // + resources.ApplyResources(this.btnRemove, "btnRemove"); + this.btnRemove.Name = "btnRemove"; + this.btnRemove.UseVisualStyleBackColor = true; + this.btnRemove.Click += new System.EventHandler(this.btnRemove_Click); + // + // txtRemarks + // + resources.ApplyResources(this.txtRemarks, "txtRemarks"); + this.txtRemarks.Name = "txtRemarks"; + this.txtRemarks.Leave += new System.EventHandler(this.txtRemarks_Leave); + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // GroupSettingControl + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.grbMain); + this.Name = "GroupSettingControl"; + this.Load += new System.EventHandler(this.GroupSettingControl_Load); + this.grbMain.ResumeLayout(false); + this.grbMain.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox grbMain; + private System.Windows.Forms.TextBox txtRemarks; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Button btnRemove; + } +} diff --git a/v2rayN/v2rayN/Forms/GroupSettingControl.cs b/v2rayN/v2rayN/Forms/GroupSettingControl.cs new file mode 100644 index 00000000..ac10087a --- /dev/null +++ b/v2rayN/v2rayN/Forms/GroupSettingControl.cs @@ -0,0 +1,59 @@ +using System; +using System.Windows.Forms; +using v2rayN.Base; +using v2rayN.Handler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class GroupSettingControl : UserControl + { + public event ChangeEventHandler OnButtonClicked; + + + public GroupItem groupItem + { + get; set; + } + + public GroupSettingControl() + { + InitializeComponent(); + } + + private void GroupSettingControl_Load(object sender, EventArgs e) + { + this.Height = grbMain.Height; + BindingSub(); + } + + private void BindingSub() + { + if (groupItem != null) + { + txtRemarks.Text = groupItem.remarks.ToString(); + } + } + private void EndBindingSub() + { + if (groupItem != null) + { + groupItem.remarks = txtRemarks.Text.TrimEx(); + } + } + private void txtRemarks_Leave(object sender, EventArgs e) + { + EndBindingSub(); + } + + private void btnRemove_Click(object sender, EventArgs e) + { + if (groupItem != null) + { + groupItem.remarks = string.Empty; + } + + OnButtonClicked?.Invoke(sender, e); + } + } +} diff --git a/v2rayN/v2rayN/Forms/GroupSettingControl.resx b/v2rayN/v2rayN/Forms/GroupSettingControl.resx new file mode 100644 index 00000000..c8761f6e --- /dev/null +++ b/v2rayN/v2rayN/Forms/GroupSettingControl.resx @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + 10 + + + + 6, 12 + + + 0 + + + 292, 21 + + + 525, 21 + + + 127, 21 + + + grbMain + + + 12, 25 + + + 24 + + + System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + GroupSettingControl + + + grbMain + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + grbMain + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 2 + + + label2 + + + 75, 23 + + + 0, 0 + + + 619, 61 + + + Remarks + + + grbMain + + + Group details + + + + NoControl + + + 1 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 47, 12 + + + txtRemarks + + + 0 + + + btnRemove + + + Fill + + + 10 + + + True + + + NoControl + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 1 + + + $this + + + 619, 61 + + + Remove + + + True + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/GroupSettingControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/GroupSettingControl.zh-Hans.resx new file mode 100644 index 00000000..c68bf863 --- /dev/null +++ b/v2rayN/v2rayN/Forms/GroupSettingControl.zh-Hans.resx @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 移除 + + + + 29, 12 + + + 备注 + + + 分组详情 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/GroupSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/GroupSettingForm.Designer.cs new file mode 100644 index 00000000..1eedb2ee --- /dev/null +++ b/v2rayN/v2rayN/Forms/GroupSettingForm.Designer.cs @@ -0,0 +1,97 @@ +namespace v2rayN.Forms +{ + partial class GroupSettingForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GroupSettingForm)); + this.btnClose = new System.Windows.Forms.Button(); + this.panCon = new System.Windows.Forms.Panel(); + this.panel2 = new System.Windows.Forms.Panel(); + this.btnAdd = new System.Windows.Forms.Button(); + this.btnOK = new System.Windows.Forms.Button(); + this.panel2.SuspendLayout(); + this.SuspendLayout(); + // + // btnClose + // + this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; + resources.ApplyResources(this.btnClose, "btnClose"); + this.btnClose.Name = "btnClose"; + this.btnClose.UseVisualStyleBackColor = true; + this.btnClose.Click += new System.EventHandler(this.btnClose_Click); + // + // panCon + // + resources.ApplyResources(this.panCon, "panCon"); + this.panCon.Name = "panCon"; + // + // panel2 + // + this.panel2.Controls.Add(this.btnAdd); + this.panel2.Controls.Add(this.btnClose); + this.panel2.Controls.Add(this.btnOK); + resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Name = "panel2"; + // + // btnAdd + // + resources.ApplyResources(this.btnAdd, "btnAdd"); + this.btnAdd.Name = "btnAdd"; + this.btnAdd.UseVisualStyleBackColor = true; + this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click); + // + // btnOK + // + resources.ApplyResources(this.btnOK, "btnOK"); + this.btnOK.Name = "btnOK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // GroupSettingForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.Controls.Add(this.panCon); + this.Controls.Add(this.panel2); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Name = "GroupSettingForm"; + this.Load += new System.EventHandler(this.GroupSettingForm_Load); + this.panel2.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Button btnAdd; + private System.Windows.Forms.Panel panCon; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/GroupSettingForm.cs b/v2rayN/v2rayN/Forms/GroupSettingForm.cs new file mode 100644 index 00000000..11e5d7ad --- /dev/null +++ b/v2rayN/v2rayN/Forms/GroupSettingForm.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using v2rayN.Handler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class GroupSettingForm : BaseForm + { + List lstControls = new List(); + + public GroupSettingForm() + { + InitializeComponent(); + } + + private void GroupSettingForm_Load(object sender, EventArgs e) + { + if (config.groupItem == null) + { + config.groupItem = new List(); + } + + RefreshGroupsView(); + } + + /// + /// 刷新列表 + /// + private void RefreshGroupsView() + { + panCon.Controls.Clear(); + lstControls.Clear(); + + for (int k = config.groupItem.Count - 1; k >= 0; k--) + { + GroupItem item = config.groupItem[k]; + if (Utils.IsNullOrEmpty(item.remarks)) + { + if (!Utils.IsNullOrEmpty(item.id)) + { + ConfigHandler.RemoveGroupItem(ref config, item.id); + } + config.groupItem.RemoveAt(k); + } + } + + foreach (GroupItem item in config.groupItem) + { + GroupSettingControl control = new GroupSettingControl(); + control.OnButtonClicked += Control_OnButtonClicked; + control.groupItem = item; + control.Dock = DockStyle.Top; + + panCon.Controls.Add(control); + panCon.Controls.SetChildIndex(control, 0); + + lstControls.Add(control); + } + } + + private void Control_OnButtonClicked(object sender, EventArgs e) + { + RefreshGroupsView(); + } + + private void btnOK_Click(object sender, EventArgs e) + { + if (config.groupItem.Count <= 0) + { + AddGroup(); + } + + if (ConfigHandler.SaveGroupItem(ref config) == 0) + { + this.DialogResult = DialogResult.OK; + } + else + { + UI.ShowWarning(UIRes.I18N("OperationFailed")); + } + } + + private void btnClose_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + + private void btnAdd_Click(object sender, EventArgs e) + { + AddGroup(); + + RefreshGroupsView(); + } + + + private void AddGroup() + { + GroupItem groupItem = new GroupItem + { + id = string.Empty, + remarks = "remarks" + }; + config.groupItem.Add(groupItem); + } + } +} diff --git a/v2rayN/v2rayN/Forms/GroupSettingForm.resx b/v2rayN/v2rayN/Forms/GroupSettingForm.resx new file mode 100644 index 00000000..043f3152 --- /dev/null +++ b/v2rayN/v2rayN/Forms/GroupSettingForm.resx @@ -0,0 +1,273 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + NoControl + + + + 448, 17 + + + 75, 23 + + + + 4 + + + &Cancel + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + + True + + + Fill + + + 0, 0 + + + 614, 351 + + + 10 + + + panCon + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + NoControl + + + 47, 17 + + + 75, 23 + + + 6 + + + &Add + + + btnAdd + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + NoControl + + + 355, 17 + + + 75, 23 + + + 5 + + + &OK + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 2 + + + Bottom + + + 0, 351 + + + 614, 60 + + + 7 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + True + + + 6, 12 + + + 614, 411 + + + Group settings + + + GroupSettingForm + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/GroupSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/GroupSettingForm.zh-Hans.resx new file mode 100644 index 00000000..0d4dba82 --- /dev/null +++ b/v2rayN/v2rayN/Forms/GroupSettingForm.zh-Hans.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 取消(&C) + + + 添加(&A) + + + 确定(&O) + + + 服务器分组设置 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs index 425eebe3..914921d4 100644 --- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -65,6 +65,7 @@ this.menuExport2ShareUrl = new System.Windows.Forms.ToolStripMenuItem(); this.menuExport2SubContent = new System.Windows.Forms.ToolStripMenuItem(); this.tsbServer = new System.Windows.Forms.ToolStripDropDownButton(); + this.tabGroup = new System.Windows.Forms.TabControl(); this.qrCodeControl = new v2rayN.Forms.QRCodeControl(); this.splitContainer1 = new System.Windows.Forms.SplitContainer(); this.groupBox1 = new System.Windows.Forms.GroupBox(); @@ -114,6 +115,7 @@ this.tsbOptionSetting = new System.Windows.Forms.ToolStripMenuItem(); this.tsbRoutingSetting = new System.Windows.Forms.ToolStripMenuItem(); this.tsbGlobalHotkeySetting = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbGroupSetting = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator(); this.tsbBackupGuiNConfig = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); @@ -161,19 +163,18 @@ // // scMain.Panel1 // - resources.ApplyResources(this.scMain.Panel1, "scMain.Panel1"); this.scMain.Panel1.Controls.Add(this.lvServers); + this.scMain.Panel1.Controls.Add(this.tabGroup); // // scMain.Panel2 // - resources.ApplyResources(this.scMain.Panel2, "scMain.Panel2"); this.scMain.Panel2.Controls.Add(this.qrCodeControl); this.scMain.TabStop = false; // // lvServers // - resources.ApplyResources(this.lvServers, "lvServers"); this.lvServers.ContextMenuStrip = this.cmsLv; + resources.ApplyResources(this.lvServers, "lvServers"); this.lvServers.FullRowSelect = true; this.lvServers.GridLines = true; this.lvServers.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; @@ -192,7 +193,6 @@ // // cmsLv // - resources.ApplyResources(this.cmsLv, "cmsLv"); this.cmsLv.ImageScalingSize = new System.Drawing.Size(20, 20); this.cmsLv.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuAddVmessServer, @@ -227,196 +227,205 @@ this.menuExport2ShareUrl, this.menuExport2SubContent}); this.cmsLv.Name = "cmsLv"; + this.cmsLv.OwnerItem = this.tsbServer; + resources.ApplyResources(this.cmsLv, "cmsLv"); // // menuAddVmessServer // - resources.ApplyResources(this.menuAddVmessServer, "menuAddVmessServer"); this.menuAddVmessServer.Name = "menuAddVmessServer"; + resources.ApplyResources(this.menuAddVmessServer, "menuAddVmessServer"); this.menuAddVmessServer.Click += new System.EventHandler(this.menuAddVmessServer_Click); // // menuAddVlessServer // - resources.ApplyResources(this.menuAddVlessServer, "menuAddVlessServer"); this.menuAddVlessServer.Name = "menuAddVlessServer"; + resources.ApplyResources(this.menuAddVlessServer, "menuAddVlessServer"); this.menuAddVlessServer.Click += new System.EventHandler(this.menuAddVlessServer_Click); // // menuAddShadowsocksServer // - resources.ApplyResources(this.menuAddShadowsocksServer, "menuAddShadowsocksServer"); this.menuAddShadowsocksServer.Name = "menuAddShadowsocksServer"; + resources.ApplyResources(this.menuAddShadowsocksServer, "menuAddShadowsocksServer"); this.menuAddShadowsocksServer.Click += new System.EventHandler(this.menuAddShadowsocksServer_Click); // // menuAddSocksServer // - resources.ApplyResources(this.menuAddSocksServer, "menuAddSocksServer"); this.menuAddSocksServer.Name = "menuAddSocksServer"; + resources.ApplyResources(this.menuAddSocksServer, "menuAddSocksServer"); this.menuAddSocksServer.Click += new System.EventHandler(this.menuAddSocksServer_Click); // // menuAddTrojanServer // - resources.ApplyResources(this.menuAddTrojanServer, "menuAddTrojanServer"); this.menuAddTrojanServer.Name = "menuAddTrojanServer"; + resources.ApplyResources(this.menuAddTrojanServer, "menuAddTrojanServer"); this.menuAddTrojanServer.Click += new System.EventHandler(this.menuAddTrojanServer_Click); // // menuAddCustomServer // - resources.ApplyResources(this.menuAddCustomServer, "menuAddCustomServer"); this.menuAddCustomServer.Name = "menuAddCustomServer"; + resources.ApplyResources(this.menuAddCustomServer, "menuAddCustomServer"); this.menuAddCustomServer.Click += new System.EventHandler(this.menuAddCustomServer_Click); // // menuAddServers // - resources.ApplyResources(this.menuAddServers, "menuAddServers"); this.menuAddServers.Name = "menuAddServers"; + resources.ApplyResources(this.menuAddServers, "menuAddServers"); this.menuAddServers.Click += new System.EventHandler(this.menuAddServers_Click); // // menuScanScreen // - resources.ApplyResources(this.menuScanScreen, "menuScanScreen"); this.menuScanScreen.Name = "menuScanScreen"; + resources.ApplyResources(this.menuScanScreen, "menuScanScreen"); this.menuScanScreen.Click += new System.EventHandler(this.menuScanScreen_Click); // // toolStripSeparator1 // - resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); this.toolStripSeparator1.Name = "toolStripSeparator1"; + resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); // // menuRemoveServer // - resources.ApplyResources(this.menuRemoveServer, "menuRemoveServer"); this.menuRemoveServer.Name = "menuRemoveServer"; + resources.ApplyResources(this.menuRemoveServer, "menuRemoveServer"); this.menuRemoveServer.Click += new System.EventHandler(this.menuRemoveServer_Click); // // menuRemoveDuplicateServer // - resources.ApplyResources(this.menuRemoveDuplicateServer, "menuRemoveDuplicateServer"); this.menuRemoveDuplicateServer.Name = "menuRemoveDuplicateServer"; + resources.ApplyResources(this.menuRemoveDuplicateServer, "menuRemoveDuplicateServer"); this.menuRemoveDuplicateServer.Click += new System.EventHandler(this.menuRemoveDuplicateServer_Click); // // menuCopyServer // - resources.ApplyResources(this.menuCopyServer, "menuCopyServer"); this.menuCopyServer.Name = "menuCopyServer"; + resources.ApplyResources(this.menuCopyServer, "menuCopyServer"); this.menuCopyServer.Click += new System.EventHandler(this.menuCopyServer_Click); // // menuSetDefaultServer // - resources.ApplyResources(this.menuSetDefaultServer, "menuSetDefaultServer"); this.menuSetDefaultServer.Name = "menuSetDefaultServer"; + resources.ApplyResources(this.menuSetDefaultServer, "menuSetDefaultServer"); this.menuSetDefaultServer.Click += new System.EventHandler(this.menuSetDefaultServer_Click); // // toolStripSeparator3 // - resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3"); this.toolStripSeparator3.Name = "toolStripSeparator3"; + resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3"); // // menuMoveTop // - resources.ApplyResources(this.menuMoveTop, "menuMoveTop"); this.menuMoveTop.Name = "menuMoveTop"; + resources.ApplyResources(this.menuMoveTop, "menuMoveTop"); this.menuMoveTop.Click += new System.EventHandler(this.menuMoveTop_Click); // // menuMoveUp // - resources.ApplyResources(this.menuMoveUp, "menuMoveUp"); this.menuMoveUp.Name = "menuMoveUp"; + resources.ApplyResources(this.menuMoveUp, "menuMoveUp"); this.menuMoveUp.Click += new System.EventHandler(this.menuMoveUp_Click); // // menuMoveDown // - resources.ApplyResources(this.menuMoveDown, "menuMoveDown"); this.menuMoveDown.Name = "menuMoveDown"; + resources.ApplyResources(this.menuMoveDown, "menuMoveDown"); this.menuMoveDown.Click += new System.EventHandler(this.menuMoveDown_Click); // // menuMoveBottom // - resources.ApplyResources(this.menuMoveBottom, "menuMoveBottom"); this.menuMoveBottom.Name = "menuMoveBottom"; + resources.ApplyResources(this.menuMoveBottom, "menuMoveBottom"); this.menuMoveBottom.Click += new System.EventHandler(this.menuMoveBottom_Click); // // menuSelectAll // - resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); this.menuSelectAll.Name = "menuSelectAll"; + resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click); // // toolStripSeparator9 // - resources.ApplyResources(this.toolStripSeparator9, "toolStripSeparator9"); this.toolStripSeparator9.Name = "toolStripSeparator9"; + resources.ApplyResources(this.toolStripSeparator9, "toolStripSeparator9"); // // menuPingServer // - resources.ApplyResources(this.menuPingServer, "menuPingServer"); this.menuPingServer.Name = "menuPingServer"; + resources.ApplyResources(this.menuPingServer, "menuPingServer"); this.menuPingServer.Click += new System.EventHandler(this.menuPingServer_Click); // // menuTcpingServer // - resources.ApplyResources(this.menuTcpingServer, "menuTcpingServer"); this.menuTcpingServer.Name = "menuTcpingServer"; + resources.ApplyResources(this.menuTcpingServer, "menuTcpingServer"); this.menuTcpingServer.Click += new System.EventHandler(this.menuTcpingServer_Click); // // menuRealPingServer // - resources.ApplyResources(this.menuRealPingServer, "menuRealPingServer"); this.menuRealPingServer.Name = "menuRealPingServer"; + resources.ApplyResources(this.menuRealPingServer, "menuRealPingServer"); this.menuRealPingServer.Click += new System.EventHandler(this.menuRealPingServer_Click); // // menuSpeedServer // - resources.ApplyResources(this.menuSpeedServer, "menuSpeedServer"); this.menuSpeedServer.Name = "menuSpeedServer"; + resources.ApplyResources(this.menuSpeedServer, "menuSpeedServer"); this.menuSpeedServer.Click += new System.EventHandler(this.menuSpeedServer_Click); // // tsbTestMe // - resources.ApplyResources(this.tsbTestMe, "tsbTestMe"); this.tsbTestMe.Name = "tsbTestMe"; + resources.ApplyResources(this.tsbTestMe, "tsbTestMe"); this.tsbTestMe.Click += new System.EventHandler(this.tsbTestMe_Click); // // menuClearServerStatistics // - resources.ApplyResources(this.menuClearServerStatistics, "menuClearServerStatistics"); this.menuClearServerStatistics.Name = "menuClearServerStatistics"; + resources.ApplyResources(this.menuClearServerStatistics, "menuClearServerStatistics"); this.menuClearServerStatistics.Click += new System.EventHandler(this.menuClearStatistic_Click); // // toolStripSeparator6 // - resources.ApplyResources(this.toolStripSeparator6, "toolStripSeparator6"); this.toolStripSeparator6.Name = "toolStripSeparator6"; + resources.ApplyResources(this.toolStripSeparator6, "toolStripSeparator6"); // // menuExport2ClientConfig // - resources.ApplyResources(this.menuExport2ClientConfig, "menuExport2ClientConfig"); this.menuExport2ClientConfig.Name = "menuExport2ClientConfig"; + resources.ApplyResources(this.menuExport2ClientConfig, "menuExport2ClientConfig"); this.menuExport2ClientConfig.Click += new System.EventHandler(this.menuExport2ClientConfig_Click); // // menuExport2ServerConfig // - resources.ApplyResources(this.menuExport2ServerConfig, "menuExport2ServerConfig"); this.menuExport2ServerConfig.Name = "menuExport2ServerConfig"; + resources.ApplyResources(this.menuExport2ServerConfig, "menuExport2ServerConfig"); this.menuExport2ServerConfig.Click += new System.EventHandler(this.menuExport2ServerConfig_Click); // // menuExport2ShareUrl // - resources.ApplyResources(this.menuExport2ShareUrl, "menuExport2ShareUrl"); this.menuExport2ShareUrl.Name = "menuExport2ShareUrl"; + resources.ApplyResources(this.menuExport2ShareUrl, "menuExport2ShareUrl"); this.menuExport2ShareUrl.Click += new System.EventHandler(this.menuExport2ShareUrl_Click); // // menuExport2SubContent // - resources.ApplyResources(this.menuExport2SubContent, "menuExport2SubContent"); this.menuExport2SubContent.Name = "menuExport2SubContent"; + resources.ApplyResources(this.menuExport2SubContent, "menuExport2SubContent"); this.menuExport2SubContent.Click += new System.EventHandler(this.menuExport2SubContent_Click); // // tsbServer // - resources.ApplyResources(this.tsbServer, "tsbServer"); this.tsbServer.DropDown = this.cmsLv; this.tsbServer.Image = global::v2rayN.Properties.Resources.server; + resources.ApplyResources(this.tsbServer, "tsbServer"); this.tsbServer.Name = "tsbServer"; // + // tabGroup + // + resources.ApplyResources(this.tabGroup, "tabGroup"); + this.tabGroup.Name = "tabGroup"; + this.tabGroup.SelectedIndex = 0; + this.tabGroup.SelectedIndexChanged += new System.EventHandler(this.tabGroup_SelectedIndexChanged); + // // qrCodeControl // resources.ApplyResources(this.qrCodeControl, "qrCodeControl"); @@ -429,35 +438,33 @@ // // splitContainer1.Panel1 // - resources.ApplyResources(this.splitContainer1.Panel1, "splitContainer1.Panel1"); this.splitContainer1.Panel1.Controls.Add(this.groupBox1); // // splitContainer1.Panel2 // - resources.ApplyResources(this.splitContainer1.Panel2, "splitContainer1.Panel2"); this.splitContainer1.Panel2.Controls.Add(this.gbMsgTitle); // // groupBox1 // - resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Controls.Add(this.scMain); + resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // // gbMsgTitle // - resources.ApplyResources(this.gbMsgTitle, "gbMsgTitle"); this.gbMsgTitle.Controls.Add(this.txtMsgBox); this.gbMsgTitle.Controls.Add(this.ssMain); + resources.ApplyResources(this.gbMsgTitle, "gbMsgTitle"); this.gbMsgTitle.Name = "gbMsgTitle"; this.gbMsgTitle.TabStop = false; // // txtMsgBox // - resources.ApplyResources(this.txtMsgBox, "txtMsgBox"); this.txtMsgBox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(41)))), ((int)(((byte)(49)))), ((int)(((byte)(52))))); this.txtMsgBox.BorderStyle = System.Windows.Forms.BorderStyle.None; this.txtMsgBox.ContextMenuStrip = this.cmsMsgBox; + resources.ApplyResources(this.txtMsgBox, "txtMsgBox"); this.txtMsgBox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(226)))), ((int)(((byte)(228))))); this.txtMsgBox.Name = "txtMsgBox"; this.txtMsgBox.ReadOnly = true; @@ -465,7 +472,6 @@ // // cmsMsgBox // - resources.ApplyResources(this.cmsMsgBox, "cmsMsgBox"); this.cmsMsgBox.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuMsgBoxSelectAll, this.menuMsgBoxCopy, @@ -474,46 +480,46 @@ this.menuMsgBoxAddRoutingRule, this.menuMsgBoxFilter}); this.cmsMsgBox.Name = "cmsMsgBox"; + resources.ApplyResources(this.cmsMsgBox, "cmsMsgBox"); // // menuMsgBoxSelectAll // - resources.ApplyResources(this.menuMsgBoxSelectAll, "menuMsgBoxSelectAll"); this.menuMsgBoxSelectAll.Name = "menuMsgBoxSelectAll"; + resources.ApplyResources(this.menuMsgBoxSelectAll, "menuMsgBoxSelectAll"); this.menuMsgBoxSelectAll.Click += new System.EventHandler(this.menuMsgBoxSelectAll_Click); // // menuMsgBoxCopy // - resources.ApplyResources(this.menuMsgBoxCopy, "menuMsgBoxCopy"); this.menuMsgBoxCopy.Name = "menuMsgBoxCopy"; + resources.ApplyResources(this.menuMsgBoxCopy, "menuMsgBoxCopy"); this.menuMsgBoxCopy.Click += new System.EventHandler(this.menuMsgBoxCopy_Click); // // menuMsgBoxCopyAll // - resources.ApplyResources(this.menuMsgBoxCopyAll, "menuMsgBoxCopyAll"); this.menuMsgBoxCopyAll.Name = "menuMsgBoxCopyAll"; + resources.ApplyResources(this.menuMsgBoxCopyAll, "menuMsgBoxCopyAll"); this.menuMsgBoxCopyAll.Click += new System.EventHandler(this.menuMsgBoxCopyAll_Click); // // menuMsgBoxClear // - resources.ApplyResources(this.menuMsgBoxClear, "menuMsgBoxClear"); this.menuMsgBoxClear.Name = "menuMsgBoxClear"; + resources.ApplyResources(this.menuMsgBoxClear, "menuMsgBoxClear"); this.menuMsgBoxClear.Click += new System.EventHandler(this.menuMsgBoxClear_Click); // // menuMsgBoxAddRoutingRule // - resources.ApplyResources(this.menuMsgBoxAddRoutingRule, "menuMsgBoxAddRoutingRule"); this.menuMsgBoxAddRoutingRule.Name = "menuMsgBoxAddRoutingRule"; + resources.ApplyResources(this.menuMsgBoxAddRoutingRule, "menuMsgBoxAddRoutingRule"); this.menuMsgBoxAddRoutingRule.Click += new System.EventHandler(this.menuMsgBoxAddRoutingRule_Click); // // menuMsgBoxFilter // - resources.ApplyResources(this.menuMsgBoxFilter, "menuMsgBoxFilter"); this.menuMsgBoxFilter.Name = "menuMsgBoxFilter"; + resources.ApplyResources(this.menuMsgBoxFilter, "menuMsgBoxFilter"); this.menuMsgBoxFilter.Click += new System.EventHandler(this.menuMsgBoxFilter_Click); // // ssMain // - resources.ApplyResources(this.ssMain, "ssMain"); this.ssMain.ImageScalingSize = new System.Drawing.Size(20, 20); this.ssMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolSslInboundInfo, @@ -522,13 +528,14 @@ this.toolSslBlank2, this.toolSslServerSpeed, this.toolSslBlank4}); + resources.ApplyResources(this.ssMain, "ssMain"); this.ssMain.Name = "ssMain"; this.ssMain.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.ssMain_ItemClicked); // // toolSslInboundInfo // - resources.ApplyResources(this.toolSslInboundInfo, "toolSslInboundInfo"); this.toolSslInboundInfo.Name = "toolSslInboundInfo"; + resources.ApplyResources(this.toolSslInboundInfo, "toolSslInboundInfo"); // // toolSslBlank1 // @@ -538,13 +545,13 @@ // // toolSslRoutingRule // - resources.ApplyResources(this.toolSslRoutingRule, "toolSslRoutingRule"); this.toolSslRoutingRule.Name = "toolSslRoutingRule"; + resources.ApplyResources(this.toolSslRoutingRule, "toolSslRoutingRule"); // // toolSslBlank2 // - resources.ApplyResources(this.toolSslBlank2, "toolSslBlank2"); this.toolSslBlank2.Name = "toolSslBlank2"; + resources.ApplyResources(this.toolSslBlank2, "toolSslBlank2"); this.toolSslBlank2.Spring = true; // // toolSslServerSpeed @@ -555,19 +562,19 @@ // // toolSslBlank4 // - resources.ApplyResources(this.toolSslBlank4, "toolSslBlank4"); this.toolSslBlank4.Name = "toolSslBlank4"; + resources.ApplyResources(this.toolSslBlank4, "toolSslBlank4"); // // notifyMain // - resources.ApplyResources(this.notifyMain, "notifyMain"); this.notifyMain.ContextMenuStrip = this.cmsMain; + resources.ApplyResources(this.notifyMain, "notifyMain"); this.notifyMain.MouseClick += new System.Windows.Forms.MouseEventHandler(this.notifyMain_MouseClick); // // cmsMain // - resources.ApplyResources(this.cmsMain, "cmsMain"); this.cmsMain.ImageScalingSize = new System.Drawing.Size(20, 20); + resources.ApplyResources(this.cmsMain, "cmsMain"); this.cmsMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuSysAgentMode, this.menuRoutings, @@ -587,87 +594,87 @@ // // menuSysAgentMode // - resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode"); this.menuSysAgentMode.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuKeepClear, this.menuGlobal, this.menuKeepNothing}); this.menuSysAgentMode.Name = "menuSysAgentMode"; + resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode"); // // menuKeepClear // - resources.ApplyResources(this.menuKeepClear, "menuKeepClear"); this.menuKeepClear.Name = "menuKeepClear"; + resources.ApplyResources(this.menuKeepClear, "menuKeepClear"); this.menuKeepClear.Click += new System.EventHandler(this.menuKeepClear_Click); // // menuGlobal // - resources.ApplyResources(this.menuGlobal, "menuGlobal"); this.menuGlobal.Name = "menuGlobal"; + resources.ApplyResources(this.menuGlobal, "menuGlobal"); this.menuGlobal.Click += new System.EventHandler(this.menuGlobal_Click); // // menuKeepNothing // - resources.ApplyResources(this.menuKeepNothing, "menuKeepNothing"); this.menuKeepNothing.Name = "menuKeepNothing"; + resources.ApplyResources(this.menuKeepNothing, "menuKeepNothing"); this.menuKeepNothing.Click += new System.EventHandler(this.menuKeepNothing_Click); // // menuRoutings // - resources.ApplyResources(this.menuRoutings, "menuRoutings"); this.menuRoutings.Name = "menuRoutings"; + resources.ApplyResources(this.menuRoutings, "menuRoutings"); // // menuServers // - resources.ApplyResources(this.menuServers, "menuServers"); this.menuServers.Name = "menuServers"; + resources.ApplyResources(this.menuServers, "menuServers"); // // menuServers2 // - resources.ApplyResources(this.menuServers2, "menuServers2"); this.menuServers2.BackColor = System.Drawing.SystemColors.Window; this.menuServers2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.menuServers2.DropDownWidth = 500; + resources.ApplyResources(this.menuServers2, "menuServers2"); this.menuServers2.Name = "menuServers2"; // // toolStripSeparator13 // - resources.ApplyResources(this.toolStripSeparator13, "toolStripSeparator13"); this.toolStripSeparator13.Name = "toolStripSeparator13"; + resources.ApplyResources(this.toolStripSeparator13, "toolStripSeparator13"); // // menuAddServers2 // - resources.ApplyResources(this.menuAddServers2, "menuAddServers2"); this.menuAddServers2.Name = "menuAddServers2"; + resources.ApplyResources(this.menuAddServers2, "menuAddServers2"); this.menuAddServers2.Click += new System.EventHandler(this.menuAddServers_Click); // // menuScanScreen2 // - resources.ApplyResources(this.menuScanScreen2, "menuScanScreen2"); this.menuScanScreen2.Name = "menuScanScreen2"; + resources.ApplyResources(this.menuScanScreen2, "menuScanScreen2"); this.menuScanScreen2.Click += new System.EventHandler(this.menuScanScreen_Click); // // menuUpdateSubscriptions // - resources.ApplyResources(this.menuUpdateSubscriptions, "menuUpdateSubscriptions"); this.menuUpdateSubscriptions.Name = "menuUpdateSubscriptions"; + resources.ApplyResources(this.menuUpdateSubscriptions, "menuUpdateSubscriptions"); this.menuUpdateSubscriptions.Click += new System.EventHandler(this.menuUpdateSubscriptions_Click); // // menuUpdateSubViaProxy // - resources.ApplyResources(this.menuUpdateSubViaProxy, "menuUpdateSubViaProxy"); this.menuUpdateSubViaProxy.Name = "menuUpdateSubViaProxy"; + resources.ApplyResources(this.menuUpdateSubViaProxy, "menuUpdateSubViaProxy"); this.menuUpdateSubViaProxy.Click += new System.EventHandler(this.menuUpdateSubViaProxy_Click); // // toolStripSeparator2 // - resources.ApplyResources(this.toolStripSeparator2, "toolStripSeparator2"); this.toolStripSeparator2.Name = "toolStripSeparator2"; + resources.ApplyResources(this.toolStripSeparator2, "toolStripSeparator2"); // // menuExit // - resources.ApplyResources(this.menuExit, "menuExit"); this.menuExit.Name = "menuExit"; + resources.ApplyResources(this.menuExit, "menuExit"); this.menuExit.Click += new System.EventHandler(this.menuExit_Click); // // bgwScan @@ -683,7 +690,6 @@ // // tsMain // - resources.ApplyResources(this.tsMain, "tsMain"); this.tsMain.ImageScalingSize = new System.Drawing.Size(32, 32); this.tsMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbServer, @@ -701,116 +707,124 @@ this.tsbPromotion, this.toolStripSeparator11, this.tsbClose}); + resources.ApplyResources(this.tsMain, "tsMain"); this.tsMain.Name = "tsMain"; this.tsMain.TabStop = true; // // toolStripSeparator4 // - resources.ApplyResources(this.toolStripSeparator4, "toolStripSeparator4"); this.toolStripSeparator4.Name = "toolStripSeparator4"; + resources.ApplyResources(this.toolStripSeparator4, "toolStripSeparator4"); // // tsbSub // - resources.ApplyResources(this.tsbSub, "tsbSub"); this.tsbSub.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbSubSetting, this.tsbSubUpdate, this.tsbSubUpdateViaProxy}); this.tsbSub.Image = global::v2rayN.Properties.Resources.sub; + resources.ApplyResources(this.tsbSub, "tsbSub"); this.tsbSub.Name = "tsbSub"; // // tsbSubSetting // - resources.ApplyResources(this.tsbSubSetting, "tsbSubSetting"); this.tsbSubSetting.Name = "tsbSubSetting"; + resources.ApplyResources(this.tsbSubSetting, "tsbSubSetting"); this.tsbSubSetting.Click += new System.EventHandler(this.tsbSubSetting_Click); // // tsbSubUpdate // - resources.ApplyResources(this.tsbSubUpdate, "tsbSubUpdate"); this.tsbSubUpdate.Name = "tsbSubUpdate"; + resources.ApplyResources(this.tsbSubUpdate, "tsbSubUpdate"); this.tsbSubUpdate.Click += new System.EventHandler(this.tsbSubUpdate_Click); // // tsbSubUpdateViaProxy // - resources.ApplyResources(this.tsbSubUpdateViaProxy, "tsbSubUpdateViaProxy"); this.tsbSubUpdateViaProxy.Name = "tsbSubUpdateViaProxy"; + resources.ApplyResources(this.tsbSubUpdateViaProxy, "tsbSubUpdateViaProxy"); this.tsbSubUpdateViaProxy.Click += new System.EventHandler(this.tsbSubUpdateViaProxy_Click); // // tsbQRCodeSwitch // - resources.ApplyResources(this.tsbQRCodeSwitch, "tsbQRCodeSwitch"); this.tsbQRCodeSwitch.CheckOnClick = true; this.tsbQRCodeSwitch.ForeColor = System.Drawing.Color.Black; this.tsbQRCodeSwitch.Image = global::v2rayN.Properties.Resources.share; + resources.ApplyResources(this.tsbQRCodeSwitch, "tsbQRCodeSwitch"); this.tsbQRCodeSwitch.Name = "tsbQRCodeSwitch"; this.tsbQRCodeSwitch.CheckedChanged += new System.EventHandler(this.tsbQRCodeSwitch_CheckedChanged); // // toolStripSeparator8 // - resources.ApplyResources(this.toolStripSeparator8, "toolStripSeparator8"); this.toolStripSeparator8.Name = "toolStripSeparator8"; + resources.ApplyResources(this.toolStripSeparator8, "toolStripSeparator8"); // // tsbSetting // - resources.ApplyResources(this.tsbSetting, "tsbSetting"); this.tsbSetting.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbOptionSetting, this.tsbRoutingSetting, this.tsbGlobalHotkeySetting, + this.tsbGroupSetting, this.toolStripSeparator14, this.tsbBackupGuiNConfig}); this.tsbSetting.Image = global::v2rayN.Properties.Resources.option; + resources.ApplyResources(this.tsbSetting, "tsbSetting"); this.tsbSetting.Name = "tsbSetting"; // // tsbOptionSetting // - resources.ApplyResources(this.tsbOptionSetting, "tsbOptionSetting"); this.tsbOptionSetting.Name = "tsbOptionSetting"; + resources.ApplyResources(this.tsbOptionSetting, "tsbOptionSetting"); this.tsbOptionSetting.Click += new System.EventHandler(this.tsbOptionSetting_Click); // // tsbRoutingSetting // - resources.ApplyResources(this.tsbRoutingSetting, "tsbRoutingSetting"); this.tsbRoutingSetting.Name = "tsbRoutingSetting"; + resources.ApplyResources(this.tsbRoutingSetting, "tsbRoutingSetting"); this.tsbRoutingSetting.Click += new System.EventHandler(this.tsbRoutingSetting_Click); // // tsbGlobalHotkeySetting // - resources.ApplyResources(this.tsbGlobalHotkeySetting, "tsbGlobalHotkeySetting"); this.tsbGlobalHotkeySetting.Name = "tsbGlobalHotkeySetting"; + resources.ApplyResources(this.tsbGlobalHotkeySetting, "tsbGlobalHotkeySetting"); this.tsbGlobalHotkeySetting.Click += new System.EventHandler(this.tsbGlobalHotkeySetting_Click); // + // tsbGroupSetting + // + this.tsbGroupSetting.Name = "tsbGroupSetting"; + resources.ApplyResources(this.tsbGroupSetting, "tsbGroupSetting"); + this.tsbGroupSetting.Click += new System.EventHandler(this.tsbGroupSetting_Click); + // // toolStripSeparator14 // - resources.ApplyResources(this.toolStripSeparator14, "toolStripSeparator14"); this.toolStripSeparator14.Name = "toolStripSeparator14"; + resources.ApplyResources(this.toolStripSeparator14, "toolStripSeparator14"); // // tsbBackupGuiNConfig // - resources.ApplyResources(this.tsbBackupGuiNConfig, "tsbBackupGuiNConfig"); this.tsbBackupGuiNConfig.Name = "tsbBackupGuiNConfig"; + resources.ApplyResources(this.tsbBackupGuiNConfig, "tsbBackupGuiNConfig"); this.tsbBackupGuiNConfig.Click += new System.EventHandler(this.tsbBackupGuiNConfig_Click); // // toolStripSeparator5 // - resources.ApplyResources(this.toolStripSeparator5, "toolStripSeparator5"); this.toolStripSeparator5.Name = "toolStripSeparator5"; + resources.ApplyResources(this.toolStripSeparator5, "toolStripSeparator5"); // // tsbReload // + this.tsbReload.Image = global::v2rayN.Properties.Resources.restart; resources.ApplyResources(this.tsbReload, "tsbReload"); this.tsbReload.Name = "tsbReload"; this.tsbReload.Click += new System.EventHandler(this.tsbReload_Click); // // toolStripSeparator7 // - resources.ApplyResources(this.toolStripSeparator7, "toolStripSeparator7"); this.toolStripSeparator7.Name = "toolStripSeparator7"; + resources.ApplyResources(this.toolStripSeparator7, "toolStripSeparator7"); // // tsbCheckUpdate // - resources.ApplyResources(this.tsbCheckUpdate, "tsbCheckUpdate"); this.tsbCheckUpdate.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbCheckUpdateN, this.tsbCheckUpdateCore, @@ -819,51 +833,51 @@ this.tsbCheckUpdateGeoSite, this.tsbCheckUpdateGeoIP}); this.tsbCheckUpdate.Image = global::v2rayN.Properties.Resources.checkupdate; + resources.ApplyResources(this.tsbCheckUpdate, "tsbCheckUpdate"); this.tsbCheckUpdate.Name = "tsbCheckUpdate"; // // tsbCheckUpdateN // - resources.ApplyResources(this.tsbCheckUpdateN, "tsbCheckUpdateN"); this.tsbCheckUpdateN.Name = "tsbCheckUpdateN"; + resources.ApplyResources(this.tsbCheckUpdateN, "tsbCheckUpdateN"); this.tsbCheckUpdateN.Click += new System.EventHandler(this.tsbCheckUpdateN_Click); // // tsbCheckUpdateCore // - resources.ApplyResources(this.tsbCheckUpdateCore, "tsbCheckUpdateCore"); this.tsbCheckUpdateCore.Name = "tsbCheckUpdateCore"; + resources.ApplyResources(this.tsbCheckUpdateCore, "tsbCheckUpdateCore"); this.tsbCheckUpdateCore.Click += new System.EventHandler(this.tsbCheckUpdateCore_Click); // // tsbCheckUpdateXrayCore // - resources.ApplyResources(this.tsbCheckUpdateXrayCore, "tsbCheckUpdateXrayCore"); this.tsbCheckUpdateXrayCore.Name = "tsbCheckUpdateXrayCore"; + resources.ApplyResources(this.tsbCheckUpdateXrayCore, "tsbCheckUpdateXrayCore"); this.tsbCheckUpdateXrayCore.Click += new System.EventHandler(this.tsbCheckUpdateXrayCore_Click); // // toolStripSeparator15 // - resources.ApplyResources(this.toolStripSeparator15, "toolStripSeparator15"); this.toolStripSeparator15.Name = "toolStripSeparator15"; + resources.ApplyResources(this.toolStripSeparator15, "toolStripSeparator15"); // // tsbCheckUpdateGeoSite // - resources.ApplyResources(this.tsbCheckUpdateGeoSite, "tsbCheckUpdateGeoSite"); this.tsbCheckUpdateGeoSite.Name = "tsbCheckUpdateGeoSite"; + resources.ApplyResources(this.tsbCheckUpdateGeoSite, "tsbCheckUpdateGeoSite"); this.tsbCheckUpdateGeoSite.Click += new System.EventHandler(this.tsbCheckUpdateGeoSite_Click); // // tsbCheckUpdateGeoIP // - resources.ApplyResources(this.tsbCheckUpdateGeoIP, "tsbCheckUpdateGeoIP"); this.tsbCheckUpdateGeoIP.Name = "tsbCheckUpdateGeoIP"; + resources.ApplyResources(this.tsbCheckUpdateGeoIP, "tsbCheckUpdateGeoIP"); this.tsbCheckUpdateGeoIP.Click += new System.EventHandler(this.tsbCheckUpdateGeoIP_Click); // // toolStripSeparator10 // - resources.ApplyResources(this.toolStripSeparator10, "toolStripSeparator10"); this.toolStripSeparator10.Name = "toolStripSeparator10"; + resources.ApplyResources(this.toolStripSeparator10, "toolStripSeparator10"); // // tsbHelp // - resources.ApplyResources(this.tsbHelp, "tsbHelp"); this.tsbHelp.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbAbout, this.tsbV2rayWebsite, @@ -871,52 +885,54 @@ this.tsbLanguageDef, this.tsbLanguageZhHans}); this.tsbHelp.Image = global::v2rayN.Properties.Resources.help; + resources.ApplyResources(this.tsbHelp, "tsbHelp"); this.tsbHelp.Name = "tsbHelp"; // // tsbAbout // - resources.ApplyResources(this.tsbAbout, "tsbAbout"); this.tsbAbout.Name = "tsbAbout"; + resources.ApplyResources(this.tsbAbout, "tsbAbout"); this.tsbAbout.Click += new System.EventHandler(this.tsbAbout_Click); // // tsbV2rayWebsite // - resources.ApplyResources(this.tsbV2rayWebsite, "tsbV2rayWebsite"); this.tsbV2rayWebsite.Name = "tsbV2rayWebsite"; + resources.ApplyResources(this.tsbV2rayWebsite, "tsbV2rayWebsite"); this.tsbV2rayWebsite.Click += new System.EventHandler(this.tsbV2rayWebsite_Click); // // toolStripSeparator12 // - resources.ApplyResources(this.toolStripSeparator12, "toolStripSeparator12"); this.toolStripSeparator12.Name = "toolStripSeparator12"; + resources.ApplyResources(this.toolStripSeparator12, "toolStripSeparator12"); // // tsbLanguageDef // - resources.ApplyResources(this.tsbLanguageDef, "tsbLanguageDef"); this.tsbLanguageDef.Name = "tsbLanguageDef"; + resources.ApplyResources(this.tsbLanguageDef, "tsbLanguageDef"); this.tsbLanguageDef.Click += new System.EventHandler(this.tsbLanguageDef_Click); // // tsbLanguageZhHans // - resources.ApplyResources(this.tsbLanguageZhHans, "tsbLanguageZhHans"); this.tsbLanguageZhHans.Name = "tsbLanguageZhHans"; + resources.ApplyResources(this.tsbLanguageZhHans, "tsbLanguageZhHans"); this.tsbLanguageZhHans.Click += new System.EventHandler(this.tsbLanguageZhHans_Click); // // tsbPromotion // - resources.ApplyResources(this.tsbPromotion, "tsbPromotion"); this.tsbPromotion.ForeColor = System.Drawing.Color.Black; this.tsbPromotion.Image = global::v2rayN.Properties.Resources.promotion; + resources.ApplyResources(this.tsbPromotion, "tsbPromotion"); this.tsbPromotion.Name = "tsbPromotion"; this.tsbPromotion.Click += new System.EventHandler(this.tsbPromotion_Click); // // toolStripSeparator11 // - resources.ApplyResources(this.toolStripSeparator11, "toolStripSeparator11"); this.toolStripSeparator11.Name = "toolStripSeparator11"; + resources.ApplyResources(this.toolStripSeparator11, "toolStripSeparator11"); // // tsbClose // + this.tsbClose.Image = global::v2rayN.Properties.Resources.minimize; resources.ApplyResources(this.tsbClose, "tsbClose"); this.tsbClose.Name = "tsbClose"; this.tsbClose.Click += new System.EventHandler(this.tsbClose_Click); @@ -1067,6 +1083,8 @@ private System.Windows.Forms.ToolStripMenuItem menuUpdateSubViaProxy; private System.Windows.Forms.ToolStripMenuItem menuMsgBoxClear; private System.Windows.Forms.ToolStripMenuItem tsbGlobalHotkeySetting; + private System.Windows.Forms.TabControl tabGroup; + private System.Windows.Forms.ToolStripMenuItem tsbGroupSetting; } } diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 15733e9c..820ffae2 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -11,15 +11,18 @@ using v2rayN.Base; using v2rayN.Handler; using v2rayN.Mode; using v2rayN.Tool; +using System.Linq; namespace v2rayN.Forms { public partial class MainForm : BaseForm { private V2rayHandler v2rayHandler; - private List lvSelecteds = new List(); + private List lvSelecteds = new List(); private StatisticsHandler statistics = null; private string MsgFilter = string.Empty; + private List lstVmess = null; + private string groupId = string.Empty; #region Window 事件 @@ -46,6 +49,7 @@ namespace v2rayN.Forms Environment.Exit(0); return; } + ConfigHandler.InitBuiltinRouting(ref config); MainFormHandler.Instance.BackupGuiNConfig(config, true); v2rayHandler = new V2rayHandler(); @@ -72,6 +76,7 @@ namespace v2rayN.Forms private void MainForm_Shown(object sender, EventArgs e) { + InitGroupView(); InitServersView(); RefreshServers(); RefreshRoutingsMenu(); @@ -196,8 +201,10 @@ namespace v2rayN.Forms /// private void RefreshServers() { + lstVmess = config.vmess.Where(it => it.groupId == groupId).OrderBy(it => it.sort).ToList(); + + ConfigHandler.SetDefaultServer(config, lstVmess); RefreshServersView(); - //lvServers.AutoResizeColumns(); RefreshServersMenu(); } @@ -247,24 +254,24 @@ namespace v2rayN.Forms lvServers.BeginUpdate(); lvServers.Items.Clear(); - for (int k = 0; k < config.vmess.Count; k++) + for (int k = 0; k < lstVmess.Count; k++) { string def = string.Empty; string totalUp = string.Empty, totalDown = string.Empty, todayUp = string.Empty, todayDown = string.Empty; - if (config.index.Equals(k)) + + VmessItem item = lstVmess[k]; + if (config.IsActiveNode(item)) { def = "√"; } - VmessItem item = config.vmess[k]; - bool stats = statistics != null && statistics.Enable; if (stats) { - ServerStatItem sItem = statistics.Statistic.Find(item_ => item_.itemId == item.getItemId()); + ServerStatItem sItem = statistics.Statistic.Find(item_ => item_.itemId == item.indexId); if (sItem != null) { totalUp = Utils.HumanFy(sItem.totalUp); @@ -295,7 +302,7 @@ namespace v2rayN.Forms { lvItem.BackColor = Color.WhiteSmoke; } - if (config.index.Equals(k)) + if (config.IsActiveNode(item)) { //lvItem.Checked = true; lvItem.ForeColor = Color.DodgerBlue; @@ -324,37 +331,37 @@ namespace v2rayN.Forms menuServers.Visible = false; menuServers2.Visible = false; - if (config.vmess.Count > 20) + if (lstVmess.Count > 20) { - for (int k = 0; k < config.vmess.Count; k++) + for (int k = 0; k < lstVmess.Count; k++) { - VmessItem item = config.vmess[k]; + VmessItem item = lstVmess[k]; string name = item.getSummary(); - if (config.index.Equals(k)) + if (config.IsActiveNode(item)) { name = $"√ {name}"; } menuServers2.Items.Add(name); } - menuServers2.SelectedIndex = config.index; + menuServers2.SelectedIndex = lstVmess.FindIndex(it => it.indexId == config.indexId); menuServers2.SelectedIndexChanged += MenuServers2_SelectedIndexChanged; menuServers2.Visible = true; } else { List lst = new List(); - for (int k = 0; k < config.vmess.Count; k++) + for (int k = 0; k < lstVmess.Count; k++) { - VmessItem item = config.vmess[k]; + VmessItem item = lstVmess[k]; string name = item.getSummary(); ToolStripMenuItem ts = new ToolStripMenuItem(name) { Tag = k }; - if (config.index.Equals(k)) + if (config.IsActiveNode(item)) { ts.Checked = true; } @@ -439,7 +446,7 @@ namespace v2rayN.Forms var tag = lvServers.Columns[e.Column].Tag?.ToString(); bool asc = Utils.IsNullOrEmpty(tag) ? true : !Convert.ToBoolean(tag); - if (ConfigHandler.SortServers(ref config, (EServerColName)e.Column, asc) != 0) + if (ConfigHandler.SortServers(ref config, ref lstVmess, (EServerColName)e.Column, asc) != 0) { return; } @@ -457,6 +464,40 @@ namespace v2rayN.Forms } } + + private void InitGroupView() + { + tabGroup.TabPages.Clear(); + + foreach (var item in config.groupItem) + { + var tabPage2 = new TabPage($" {item.remarks} "); + tabPage2.Name = item.id; + tabGroup.TabPages.Add(tabPage2); + } + + string title = $" {UIRes.I18N("UngroupedServers")} "; + var tabPage = new TabPage(title); + tabPage.Name = "Ungrouped"; + tabGroup.TabPages.Add(tabPage); + + tabGroup.SelectedIndex = tabGroup.TabPages.Count - 1; + } + + private void tabGroup_SelectedIndexChanged(object sender, EventArgs e) + { + if (tabGroup.SelectedIndex < 0) + { + return; + } + groupId = string.Empty; + if (tabGroup.SelectedIndex < config.groupItem.Count) + { + groupId = config.groupItem[tabGroup.SelectedIndex].id; + } + + RefreshServers(); + } #endregion #region v2ray 操作 @@ -520,7 +561,7 @@ namespace v2rayN.Forms { return; } - qrCodeControl.showQRCode(index, config); + qrCodeControl.showQRCode(lstVmess[index]); } private void lvServers_DoubleClick(object sender, EventArgs e) @@ -530,7 +571,7 @@ namespace v2rayN.Forms { return; } - ShowServerForm(config.vmess[index].configType, index); + ShowServerForm(lstVmess[index].configType, index); } private void ShowServerForm(int configType, int index) { @@ -556,7 +597,8 @@ namespace v2rayN.Forms fm = new AddServer2Form(); break; } - fm.EditIndex = index; + fm.vmessItem = index >= 0 ? lstVmess[index] : null; + fm.groupId = groupId; if (fm.ShowDialog() == DialogResult.OK) { RefreshServers(); @@ -646,7 +688,7 @@ namespace v2rayN.Forms return; } - ConfigHandler.RemoveServer(ref config, lvSelecteds); + ConfigHandler.RemoveServer(config, lvSelecteds); RefreshServers(); LoadV2ray(); @@ -654,9 +696,9 @@ namespace v2rayN.Forms private void menuRemoveDuplicateServer_Click(object sender, EventArgs e) { - int oldCount = config.vmess.Count; - ConfigHandler.DedupServerList(ref config); - int newCount = config.vmess.Count; + int oldCount = lstVmess.Count; + ConfigHandler.DedupServerList(ref config, ref lstVmess); + int newCount = lstVmess.Count; RefreshServers(); LoadV2ray(); UI.Show(string.Format(UIRes.I18N("RemoveDuplicateServerResult"), oldCount, newCount)); @@ -669,7 +711,7 @@ namespace v2rayN.Forms { return; } - if (ConfigHandler.CopyServer(ref config, index) == 0) + if (ConfigHandler.CopyServer(ref config, lstVmess[index]) == 0) { RefreshServers(); } @@ -745,13 +787,13 @@ namespace v2rayN.Forms private void menuExport2ClientConfig_Click(object sender, EventArgs e) { int index = GetLvSelectedIndex(); - MainFormHandler.Instance.Export2ClientConfig(index, config); + MainFormHandler.Instance.Export2ClientConfig(lstVmess[index], config); } private void menuExport2ServerConfig_Click(object sender, EventArgs e) { int index = GetLvSelectedIndex(); - MainFormHandler.Instance.Export2ServerConfig(index, config); + MainFormHandler.Instance.Export2ServerConfig(lstVmess[index], config); } private void menuExport2ShareUrl_Click(object sender, EventArgs e) @@ -759,9 +801,9 @@ namespace v2rayN.Forms GetLvSelectedIndex(); StringBuilder sb = new StringBuilder(); - foreach (int v in lvSelecteds) + foreach (var v in lvSelecteds) { - string url = ShareHandler.GetShareUrl(config, v); + string url = ShareHandler.GetShareUrl(v); if (Utils.IsNullOrEmpty(url)) { continue; @@ -782,9 +824,9 @@ namespace v2rayN.Forms GetLvSelectedIndex(); StringBuilder sb = new StringBuilder(); - foreach (int v in lvSelecteds) + foreach (var v in lvSelecteds) { - string url = ShareHandler.GetShareUrl(config, v); + string url = ShareHandler.GetShareUrl(v); if (Utils.IsNullOrEmpty(url)) { continue; @@ -832,6 +874,17 @@ namespace v2rayN.Forms } + private void tsbGroupSetting_Click(object sender, EventArgs e) + { + var fm = new GroupSettingForm(); + if (fm.ShowDialog() == DialogResult.OK) + { + InitGroupView(); + RefreshServers(); + } + + } + private void tsbReload_Click(object sender, EventArgs e) { Global.reloadV2ray = true; @@ -857,7 +910,7 @@ namespace v2rayN.Forms UI.Show(UIRes.I18N("PleaseSelectServer")); return -1; } - if (ConfigHandler.SetDefaultServer(ref config, index) == 0) + if (ConfigHandler.SetDefaultServer(ref config, lstVmess[index]) == 0) { RefreshServers(); LoadV2ray(); @@ -884,7 +937,7 @@ namespace v2rayN.Forms index = lvServers.SelectedIndices[0]; foreach (int i in lvServers.SelectedIndices) { - lvSelecteds.Add(i); + lvSelecteds.Add(lstVmess[i]); } return index; } @@ -913,7 +966,7 @@ namespace v2rayN.Forms return; } - if (ConfigHandler.AddCustomServer(ref config, fileName) == 0) + if (ConfigHandler.AddCustomServer(ref config, fileName, groupId) == 0) { RefreshServers(); //LoadV2ray(); @@ -946,7 +999,7 @@ namespace v2rayN.Forms private void menuAddServers_Click(object sender, EventArgs e) { string clipboardData = Utils.GetClipboardData(); - int ret = MainFormHandler.Instance.AddBatchServers(config, clipboardData); + int ret = MainFormHandler.Instance.AddBatchServers(config, clipboardData, "", groupId); if (ret > 0) { RefreshServers(); @@ -1114,27 +1167,35 @@ namespace v2rayN.Forms #endregion #region 后台测速 - + private void SetTestResult(string indexId, string txt) + { + int k = lstVmess.FindIndex(it => it.indexId == indexId); + if (k >= 0 && k < lvServers.Items.Count) + { + lstVmess[k].testResult = txt; + lvServers.Items[k].SubItems["testResult"].Text = txt; + } + } private void SetTestResult(int k, string txt) { if (k < lvServers.Items.Count) { - config.vmess[k].testResult = txt; + lstVmess[k].testResult = txt; lvServers.Items[k].SubItems["testResult"].Text = txt; } } private void ClearTestResult() { - foreach (int s in lvSelecteds) + foreach (var s in lvSelecteds) { - SetTestResult(s, ""); + SetTestResult(s.indexId, ""); } } - private void UpdateSpeedtestHandler(int index, string msg) + private void UpdateSpeedtestHandler(string indexId, string msg) { lvServers.Invoke((MethodInvoker)delegate { - SetTestResult(index, msg); + SetTestResult(indexId, msg); }); } @@ -1147,9 +1208,9 @@ namespace v2rayN.Forms toolSslServerSpeed.Text = string.Format("{0}/s↑ | {1}/s↓", Utils.HumanFy(up), Utils.HumanFy(down)); List datas = new List(); - for (int i = 0; i < config.vmess.Count; i++) + for (int i = 0; i < lstVmess.Count; i++) { - int index = statistics.FindIndex(item_ => item_.itemId == config.vmess[i].getItemId()); + int index = statistics.FindIndex(item_ => item_.itemId == lstVmess[i].indexId); if (index != -1) { lvServers.Invoke((MethodInvoker)delegate @@ -1213,7 +1274,7 @@ namespace v2rayN.Forms UI.Show(UIRes.I18N("PleaseSelectServer")); return; } - if (ConfigHandler.MoveServer(ref config, index, eMove) == 0) + if (ConfigHandler.MoveServer(ref config, ref lstVmess, index, eMove) == 0) { //TODO: reload is not good. RefreshServers(); @@ -1381,7 +1442,7 @@ namespace v2rayN.Forms } else { - int ret = MainFormHandler.Instance.AddBatchServers(config, result); + int ret = MainFormHandler.Instance.AddBatchServers(config, result, "", groupId); if (ret > 0) { RefreshServers(); diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index 82b8d55d..b7d19fed 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -117,785 +117,215 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Remove duplicate servers + + + Fill - + + 3, 17 + + + 327, 17 + + 355, 22 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Add [VMess] server - - 355, 22 - - - 97, 53 - - + 355, 22 Add [VLESS] server - - 0 + + 355, 22 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Add [Shadowsocks] server - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Restart service - - - 200, 25 - - - tsbSubSetting - - - 264, 22 - - - toolSslInboundInfo - - - gbMsgTitle - - - menuMoveUp + + 355, 22 Add [Socks] server - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuUpdateSubViaProxy - - - - ImageAboveText - - - 227, 22 - - - 语言-[中文简体] - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Settings - - - tsbHelp - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator6 - 355, 22 - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 99, 53 - - - Update subscriptions - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 187, 22 - - - 67, 53 - - - tsbSetting - - - toolSslBlank2 - - - 355, 22 - - - 355, 22 - - - tsbCheckUpdateN - - - 45, 53 - - - Do not change system proxy - - - tsbCheckUpdateGeoSite - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator7 - - - Update v2flyCore - - - Update GeoSite - - - Magenta - - - menuMsgBoxAddRoutingRule - - - 355, 22 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuExport2SubContent - - - Share - - - 227, 22 - - - tsbQRCodeSwitch - - - Add Routing Rule (Ctrl+V) - - - 355, 22 - - - Horizontal - - - Export selected server for client configuration - - - tsbRoutingSetting - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 227, 22 - - - Export selected server for server configuration - - - splitContainer1 - - - System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 128, 53 - - - System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - Test servers real delay (Ctrl+R) - - - menuTcpingServer - - - ImageAboveText - - - toolSslRoutingRule - - - 356, 622 - - - tsbGlobalHotkeySetting - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - v2rayN - - - 355, 22 - - - toolStripSeparator1 - - - 355, 22 - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 203, 22 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMsgBoxCopy - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbClose - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuPingServer - - - 200, 6 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbLanguageDef - - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wwAADsMBx2+oZAAAATdJREFUWEftloENAiEMRW8ER3AEN9ANdARHcAPdwBF0A91AN9INtC+5JvUCJwWM - mvCTFw3QUiiU65qa/lUTYT6Ato9rJZyERwT6GFNdU+EihCYNwVhsqmgm3AR1fheOAitd9PCfNvp0HDbY - FolV2MmZZCzX9J0FG0TRTlwFdbahIVE7Qe1IR5bYVnXCyr2yO5F1MNUBec25YtjomcCXSxhr9DmrV2Gr - flyL4GSrYcm9tmnEZ7JsAC7DgWr5ydbXA8hOAcVjG8FTD6ocQgvXKrW8MqFWUfc1DAXgmRwVFaJQAHsh - VbYUU87diqWA934sl/TZ7wV2Lesx0gBwsO5/1Sl5PQhLQb+G+E+bfTm9KXsRAVgHrMK+jO9gbNEzzMSh - 6DlM9nANoa+kdCeLXLNLFtc9b2r6EXXdE4e4mdByNuG1AAAAAElFTkSuQmCC - - - - System.Windows.Forms.ToolStripComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Export subscription (base64) share to clipboard - - - 3, 17 - - - 355, 22 - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill - - - 6, 56 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 250, 21 - - - menuAddCustomServer - - - menuMoveDown - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Import bulk URL from clipboard - - - gbMsgTitle - - - Move to bottom (B) - - - Move to top (T) - - - 6, 12 - - - 48, 53 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Copy All - - - System.ComponentModel.BackgroundWorker, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel1 - - - Fill - - - 0 - - - 686, 280 - - - toolStripSeparator4 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 195, 22 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - scMain.Panel2 - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuAddServers2 - - - Fill - - - tsbServer - - - Add [VMess] server - - - $this - - - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - tsbAbout - - - 300, 21 - - - toolStripSeparator5 - - - 182, 22 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - True - - - 352, 6 - - - tsbPromotion - - - 256, 280 - - - 355, 22 - - - 4, 4, 4, 4 - - - Test servers with tcping (Ctrl+O) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 6, 56 - - - 352, 6 - - - groupBox1 - - - 300, 21 - - - 2 - - - 182, 22 - - - Clear all service statistics - - - scMain.Panel2 - - - 195, 22 - - - 3 - - - 187, 22 - - - 6, 56 - - - Test servers download speed (Ctrl+T) - - - ssMain - - - 686 - - - splitContainer1 - - - 265, 221 - - - 243, 22 - - - menuUpdateSubscriptions - - - scMain - - - Check for updates - - - tsbCheckUpdateXrayCore - - - Copy (Ctrl+C) - - - toolSslServerSpeed - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4 - - - 182, 22 - - - GlobalHotkeySetting - - - scMain - - - 203, 22 - - - 2 - - - 952, 56 - - - tsbReload - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - Help - - - menuMsgBoxSelectAll - - - menuSelectAll - - - splitContainer1.Panel1 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Vertical - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Scan QR code on the screen (Ctrl+S) - - - ImageAboveText - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 187, 22 - - - menuAddServers - - - menuServers2 - - - 50 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbLanguageZhHans - - - menuRemoveDuplicateServer - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - BottomCenter - - - menuExport2ShareUrl - - - menuMsgBoxClear - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3 - - - v2rayN (this software) - - - tsbOptionSetting - - - Magenta - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - splitContainer1.Panel1 - - - 0, 0 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Server - - - v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - menuAddShadowsocksServer - - - txtMsgBox - - - toolSslBlank4 - - - menuAddTrojanServer - - - 355, 22 - - - 80, 21 - - - v2rayN - - - Language-[English] - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 264, 22 - - - menuScanScreen2 - - - 0 - - - Fill - - - Routing - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - Add [Trojan] server - - 195, 22 + + 355, 22 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Add a custom configuration server - - ImageAboveText + + 355, 22 - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Import bulk URL from clipboard (Ctrl+V) - - Set message filters + + 355, 22 - - 952, 593 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Scan QR code on the screen (Ctrl+S) 352, 6 - + + 355, 22 + + + Remove selected servers (Delete) + + + 355, 22 + + + Remove duplicate servers + + + 355, 22 + + + Clone selected server + + + 355, 22 + + + Set as active server (Enter) + + + 352, 6 + + + 355, 22 + + + Move to top (T) + + + 355, 22 + + + Up (U) + + + 355, 22 + + + Down (D) + + + 355, 22 + + + Move to bottom (B) + + + 355, 22 + + + Select All (Ctrl+A) + + + 352, 6 + + + 355, 22 + + + Test servers ping (Ctrl+P) + + + 355, 22 + + + Test servers with tcping (Ctrl+O) + + + 355, 22 + + + Test servers real delay (Ctrl+R) + + + 355, 22 + + + Test servers download speed (Ctrl+T) + + + 355, 22 + + + Test current service status + + + 355, 22 + + + Clear all service statistics + + + 352, 6 + + + 355, 22 + + + Export selected server for client configuration + + + 355, 22 + + + Export selected server for server configuration + + + 355, 22 + + + Export share URLs to clipboard (Ctrl+C) + + + 355, 22 + + + Export subscription (base64) share to clipboard + + + Magenta + + + 64, 53 + + + Servers + + + ImageAboveText + + + 356, 622 + + + cmsLv + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - V2Ray Website - - + Fill - - No - - - 1 - - - cmsMsgBox - - - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - OptionSetting - - - menuMoveTop - - - tsbCheckUpdateCore - AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w @@ -913,770 +343,1355 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - 952, 300 + + 0, 20 - - tsbCheckUpdateGeoIP + + 686, 260 - - menuScanScreen - - - ImageAboveText - - - cmsLv - - - toolStripSeparator12 - - - 6, 56 - - - Fill - - - toolSslBlank1 - - - tsbSubUpdate - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsMain - - - 5 - - - SPEED Disabled - - - 355, 22 - - - Promotion - - - menuSysAgentMode - - - menuKeepNothing - - - 952, 527 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ImageAboveText - - - 227, 22 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 1 - - - cmsMain - - - 264, 22 - - - menuServers - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator13 - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMsgBoxFilter - - - 203, 22 - - - RoutingSetting - - - Standard - - - Update GeoIP - - - 3, 194 - - - True - - - 355, 22 - - - 195, 22 - - - Subscriptions - - - 952, 10 - - - Updates - - - 264, 22 - - - toolStripSeparator14 - - + + 0 - - toolStripSeparator8 - - - menuMsgBoxCopyAll - - - menuExport2ServerConfig - - - 89, 53 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - BottomCenter - - - Test servers ping (Ctrl+P) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - gbMsgTitle - - - 264, 22 - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Top - - - menuSetDefaultServer - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 203, 22 - - - Settings - - - menuCopyServer - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System proxy - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 355, 22 - - - groupBox1 - - - MainForm - - - toolStripSeparator9 - - - menuExit - - - 227, 22 - - - tsbSubUpdateViaProxy - - - False - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Servers list - lvServers - - menuRealPingServer - - - Magenta - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuGlobal - - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbV2rayWebsite - - - Magenta - - - 4, 4, 4, 4 - - - Magenta - - - 355, 22 - - - v2rayN Project - - - Servers - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Select All (Ctrl+A) - - - menuRoutings - - - 3 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuSpeedServer - - - 355, 22 - - - menuRemoveServer - - - tsbBackupGuiNConfig - - - tsbTestMe - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - 946, 177 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuAddVmessServer - - - scMain - - - Down (D) - - - 0 - - - 352, 6 - - - Magenta - - - 243, 22 - - - Remove selected servers (Delete) - - - 952, 223 - - - 355, 22 - - - tsbSub - - - Magenta - - - toolStripSeparator11 - - - ImageAboveText - - - Clone selected server - - - 0, 0 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 355, 22 - - - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdate - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 227, 22 - - - Export share URLs to clipboard (Ctrl+C) - - - 243, 22 - - - 355, 22 - - - Server - - - v2rayN.Forms.QRCodeControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - 300 - - - System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Updates via proxy - - - 0 - - - $this - - - 0, 0 - - - qrCodeControl - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Update subscriptions via proxy - - - Clear system proxy - - - 355, 22 - - - 0 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ImageAboveText - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0, 21 - - - 203, 22 - - - 184, 6 - - - splitContainer1.Panel2 - - - 0, 0 + + v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null scMain.Panel1 - - Up (U) + + 0 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Top - - notifyMain + + 0, 0 - - Set system proxy + + 686, 20 - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0 - - MiddleRight + + tabGroup - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Select All (Ctrl+A) + + scMain.Panel1 - - 0, 66 - - - 100 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuAddSocksServer + + 1 scMain.Panel1 - - 微软雅黑, 8pt + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 64, 53 + + scMain - - 228, 136 + + 0 - - 946, 26 + + Fill - - 5 + + 0, 0 - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 4, 4, 4, 4 - - 355, 22 + + 256, 280 - - Set as active server (Enter) + + 2 - - menuAddVlessServer + + qrCodeControl + + + v2rayN.Forms.QRCodeControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + scMain.Panel2 + + + 0 + + + scMain.Panel2 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + scMain + + + 1 + + + 100 946, 280 - - 6, 56 + + 686 - - Add [Shadowsocks] server + + 0 - - 261, 6 + + scMain - - 微软雅黑, 8pt + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + groupBox1 + + + 0 + + + Fill + + + 0, 66 + + + Horizontal + + + Fill + + + 0, 0 + + + 952, 300 + + + 0 + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel1 + + + 0 + + + splitContainer1.Panel1 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + splitContainer1 0 - - 261, 6 + + 603, 17 + + + 227, 22 - - Test current service status + + Select All (Ctrl+A) - - NoControl + + 227, 22 - - toolStripSeparator10 + + Copy (Ctrl+C) - - menuMoveBottom + + 227, 22 - - 355, 22 + + Copy All - - 1 + + 227, 22 - - Magenta + + Clear All - - InboundInfo + + 227, 22 - - 355, 22 + + Add Routing Rule (Ctrl+V) - - menuExport2ClientConfig + + 227, 22 - - 187, 22 + + Set message filters - - Informations + + 228, 136 + + + cmsMsgBox + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill + + + 3, 17 0 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + True - - 264, 22 + + Vertical - - 6, 56 + + 946, 177 + + + 3 + + + txtMsgBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbMsgTitle + + + 0 + + + 228, 18 + + + 80, 21 + + + InboundInfo + + + 微软雅黑, 8pt + + + 300, 21 + + + 0, 21 + + + 300, 21 + + + False + + + 微软雅黑, 8pt + + + No + + + 250, 21 + + + SPEED Disabled + + + MiddleRight + + + 0, 21 + + + 3, 194 + + + 946, 26 + + + 0 + + + statusStrip1 + + + ssMain + + + System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbMsgTitle + + + 1 + + + Fill + + + 0, 0 + + + 952, 223 + + + 3 + + + Informations + + + gbMsgTitle + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1.Panel2 + + + 0 splitContainer1.Panel2 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1 + + + 1 + + + 952, 527 + + + 300 + + + 5 + + + splitContainer1 + + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + 17, 17 + + + 137, 17 + + + NoControl + + + 243, 22 + + + Clear system proxy + + + 243, 22 + + + Set system proxy + + + 243, 22 + + + Do not change system proxy + + + 264, 22 + + + System proxy + + + 264, 22 + + + Routing + + + 264, 22 + + + Server + + + Standard + + + 50 + + + 200, 25 + + + Server + + + 261, 6 + + + 264, 22 + + + Import bulk URL from clipboard + + + 264, 22 + + + Scan QR code on the screen + + + 264, 22 + + + Update subscriptions + + + 264, 22 + + + Update subscriptions via proxy + + + 261, 6 + + + 264, 22 + + + Exit + + + 265, 221 + + + cmsMain + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + v2rayN + + + True + + + 498, 17 + + + Top + + + 0, 56 + + + 952, 10 + + + 2 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + 409, 17 + + + 6, 56 + + + 182, 22 + + + Settings + + + 182, 22 + + + Updates + + + 182, 22 + + + Updates via proxy + + + Magenta + + + 99, 53 + + + Subscriptions + + + ImageAboveText + + + Magenta + + + 45, 53 + + + Share + + + BottomCenter + + + ImageAboveText + + + 6, 56 + + + 195, 22 + + + OptionSetting + + + 195, 22 + + + RoutingSetting + + + 195, 22 + + + GlobalHotkeySetting + + + 195, 22 + + + GroupSetting + + + 192, 6 + + + 195, 22 + + + BackupGuiConfig + + + Magenta + + + 67, 53 + + + Settings + + + ImageAboveText + + + 6, 56 + + + BottomCenter + + + Magenta + + + 97, 53 + + + Restart service + + + ImageAboveText + + + 6, 56 + + + 203, 22 + + + v2rayN (this software) + + + 203, 22 + + + Update v2flyCore + + + 203, 22 + + + Update XrayCore + + + 200, 6 + + + 203, 22 + + + Update GeoSite + + + 203, 22 + + + Update GeoIP + + + Magenta + + + 128, 53 + + + Check for updates + + + ImageAboveText + + + 6, 56 + + + 187, 22 + + + v2rayN Project + + + 187, 22 + + + V2Ray Website + + + 184, 6 + + + 187, 22 + + + Language-[English] + + + 187, 22 + + + 语言-[中文简体] Magenta + + 48, 53 + + + Help + + + ImageAboveText + + + Magenta + + + 89, 53 + + + Promotion + + + ImageAboveText + + + 6, 56 + + + Magenta + 52, 53 - - System.Windows.Forms.NotifyIcon, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Close + + + ImageAboveText + + + 0, 0 + + + 952, 56 + + + 1 + + + tsMain + + + System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 5 + + + True + + + 90 + + + 6, 12 + + + 952, 593 + + + 4, 4, 4, 4 + + + v2rayN + + + menuAddVmessServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddVlessServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddShadowsocksServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddSocksServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddTrojanServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddCustomServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddServers + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuScanScreen System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Exit + + toolStripSeparator1 - + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuRemoveServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuRemoveDuplicateServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuCopyServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuSetDefaultServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator3 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMoveTop + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMoveUp + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMoveDown + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMoveBottom + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuSelectAll + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator9 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuPingServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuTcpingServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuRealPingServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuSpeedServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbTestMe + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 menuClearServerStatistics - + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Scan QR code on the screen + + toolStripSeparator6 - - 0, 56 + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Close + + menuExport2ClientConfig - - 264, 22 - - - 0, 21 - - - 0 - - - Import bulk URL from clipboard (Ctrl+V) - - - $this - - - Update XrayCore - - - toolStripSeparator2 - - - Add a custom configuration server - - - 192, 6 - - - 1 - - - bgwScan - - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - statusStrip1 + + menuExport2ServerConfig - + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuExport2ShareUrl + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuExport2SubContent + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbServer + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0, 0 + + menuMsgBoxSelectAll - - Fill + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 3, 17 + + menuMsgBoxCopy - - Clear All + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - toolStripSeparator3 + + menuMsgBoxCopyAll - - BackupGuiConfig + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wwAADsMBx2+oZAAAADJJREFUWEftzrENACAIRUFGdVMdTZkAG4zFXfI68kMAAD8ap9lUbpfyaDV19QAA - 8FDEBl3RImu5VcdbAAAAAElFTkSuQmCC - + + menuMsgBoxClear - - 355, 22 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 355, 22 + + menuMsgBoxAddRoutingRule - - 264, 22 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - ImageAboveText + + menuMsgBoxFilter - - System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslInboundInfo + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslBlank1 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslRoutingRule + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslBlank2 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslServerSpeed + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslBlank4 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + notifyMain + + + System.Windows.Forms.NotifyIcon, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuSysAgentMode + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 menuKeepClear + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuGlobal + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuKeepNothing + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuRoutings + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuServers + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuServers2 + + + System.Windows.Forms.ToolStripComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator13 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddServers2 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuScanScreen2 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuUpdateSubscriptions + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuUpdateSubViaProxy + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator2 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuExit + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + bgwScan + + + System.ComponentModel.BackgroundWorker, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator4 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbSub + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbSubSetting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbSubUpdate + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbSubUpdateViaProxy + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbQRCodeSwitch + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator8 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbSetting + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbOptionSetting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbRoutingSetting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbGlobalHotkeySetting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbGroupSetting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator14 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbBackupGuiNConfig + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator5 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbReload + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator7 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdate + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateN + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateCore + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateXrayCore + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + toolStripSeparator15 - - 228, 18 - - - True - - - 327, 17 - - - 88 - - - 137, 17 - - - 498, 17 - - - 17, 17 - - - 409, 17 - - - 603, 17 - + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateGeoSite + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateGeoIP + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator10 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbHelp + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbAbout + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbV2rayWebsite + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator12 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbLanguageDef + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbLanguageZhHans + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbPromotion + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator11 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbClose + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MainForm + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx index c68b28d2..97a5be43 100644 --- a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx @@ -118,26 +118,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 301, 622 - - - - AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w - LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0 - ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu - PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA - BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5 - bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp - bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz - dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA - CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp - bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5 - bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3 - ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0 - ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - 300, 22 @@ -318,14 +298,25 @@ 服务器 - - 服务器列表 + + 301, 622 - - 信息 - - - 222, 136 + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0 + ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu + PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA + BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5 + bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp + bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz + dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA + CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp + bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5 + bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3 + ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0 + ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== + 221, 22 @@ -363,17 +354,14 @@ 设置信息过滤器 + + 222, 136 + 网速显示未启用 - - 261, 221 - - - 260, 22 - - - 系统代理 + + 信息 172, 22 @@ -393,6 +381,12 @@ 不改变系统代理 + + 260, 22 + + + 系统代理 + 260, 22 @@ -444,11 +438,8 @@ 退出 - - 61, 53 - - - 订阅 + + 261, 221 180, 22 @@ -468,18 +459,18 @@ 更新订阅(通过代理) + + 61, 53 + + + 订阅 + 52, 53 分享 - - 61, 53 - - - 设置 - 189, 22 @@ -498,6 +489,12 @@ 全局热键设置 + + 189, 22 + + + 服务器分组设置 + 186, 6 @@ -507,16 +504,11 @@ 备份v2rayN配置文件 - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAE3SURBVFhH7ZaBDQIhDEVvBEdwBDfQDXQER3AD3cARdAPd - QDfSDbQvuSb1AicFjJrwkxcN0FIolOuamv5VE2E+gLaPayWchEcE+hhTXVPhIoQmDcFYbKpoJtwEdX4X - jgIrXfTwnzb6dBw22BaJVdjJmWQs1/SdBRtE0U5cBXW2oSFRO0HtSEeW2FZ1wsq9sjuRdTDVAXnNuWLY - 6JnAl0sYa/Q5q1dhq35ci+Bkq2HJvbZpxGeybAAuw4Fq+cnW1wPITgHFYxvBUw+qHEIL1yq1vDKhVlH3 - NQwF4JkcFRWiUAB7IVW2FFPO3YqlgPd+LJf02e8Fdi3rMdIAcLDuf9UpeT0IS0G/hvhPm305vSl7EQFY - B6zCvozvYGzRM8zEoeg5TPZwDaGvpHQni1yzSxbXPW9q+hF13ROHuJnQcjbhtQAAAABJRU5ErkJggg== - + + 61, 53 + + + 设置 76, 53 @@ -524,12 +516,6 @@ 重启服务 - - 85, 53 - - - 检查更新 - 168, 22 @@ -557,11 +543,11 @@ 168, 22 - - 69, 53 + + 85, 53 - - 帮助 + + 检查更新 v2rayN 项目 @@ -569,19 +555,18 @@ V2Ray 官网 + + 69, 53 + + + 帮助 + 68, 53 推广 - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/ - GqfZVG6X8mg1dfUAAPBQxAZd0SJruVXHWwAAAABJRU5ErkJggg== - - 76, 53 diff --git a/v2rayN/v2rayN/Forms/QRCodeControl.cs b/v2rayN/v2rayN/Forms/QRCodeControl.cs index 855db30d..89e47cd1 100644 --- a/v2rayN/v2rayN/Forms/QRCodeControl.cs +++ b/v2rayN/v2rayN/Forms/QRCodeControl.cs @@ -12,7 +12,7 @@ namespace v2rayN.Forms } private void QRCodeControl_Load(object sender, System.EventArgs e) { - txtUrl.MouseUp += txtUrl_MouseUp; + txtUrl.MouseUp += txtUrl_MouseUp; } void txtUrl_MouseUp(object sender, MouseEventArgs e) @@ -20,11 +20,11 @@ namespace v2rayN.Forms txtUrl.SelectAll(); } - public void showQRCode(int Index, Config config) + public void showQRCode(VmessItem item) { - if (Index >= 0) + if (item != null) { - string url = ShareHandler.GetShareUrl(config, Index); + string url = ShareHandler.GetShareUrl(item); if (Utils.IsNullOrEmpty(url)) { picQRCode.Image = null; @@ -32,7 +32,7 @@ namespace v2rayN.Forms return; } txtUrl.Text = url; - picQRCode.Image = QRCodeHelper.GetQRCode(url); + picQRCode.Image = QRCodeHelper.GetQRCode(url); } } } diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs index d24ecee8..5deebb1a 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs @@ -45,6 +45,7 @@ this.menuRemove = new System.Windows.Forms.ToolStripMenuItem(); this.menuSelectAll = new System.Windows.Forms.ToolStripMenuItem(); this.menuSetDefaultRouting = new System.Windows.Forms.ToolStripMenuItem(); + this.menuImportAdvancedRules = new System.Windows.Forms.ToolStripMenuItem(); this.MenuItemAdvanced = new System.Windows.Forms.ToolStripMenuItem(); this.menuServer = new System.Windows.Forms.MenuStrip(); this.MenuItemBasic = new System.Windows.Forms.ToolStripMenuItem(); @@ -70,6 +71,7 @@ this.txtBlockDomain = new System.Windows.Forms.TextBox(); this.tabPageRuleList = new System.Windows.Forms.TabPage(); this.lvRoutings = new v2rayN.Base.ListViewFlickerFree(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.panel2.SuspendLayout(); this.panel1.SuspendLayout(); this.cmsLv.SuspendLayout(); @@ -92,24 +94,24 @@ // // btnClose // - resources.ApplyResources(this.btnClose, "btnClose"); this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; + resources.ApplyResources(this.btnClose, "btnClose"); this.btnClose.Name = "btnClose"; this.btnClose.UseVisualStyleBackColor = true; this.btnClose.Click += new System.EventHandler(this.btnClose_Click); // // panel2 // - resources.ApplyResources(this.panel2, "panel2"); this.panel2.Controls.Add(this.labRoutingTips); this.panel2.Controls.Add(this.btnClose); this.panel2.Controls.Add(this.btnOK); + resources.ApplyResources(this.panel2, "panel2"); this.panel2.Name = "panel2"; // // labRoutingTips // - resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); this.labRoutingTips.ForeColor = System.Drawing.Color.Brown; + resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); this.labRoutingTips.Name = "labRoutingTips"; // // btnOK @@ -121,22 +123,22 @@ // // panel1 // - resources.ApplyResources(this.panel1, "panel1"); this.panel1.Controls.Add(this.cmbdomainMatcher); this.panel1.Controls.Add(this.label6); this.panel1.Controls.Add(this.chkenableRoutingAdvanced); this.panel1.Controls.Add(this.linkLabelRoutingDoc); this.panel1.Controls.Add(this.cmbdomainStrategy); + resources.ApplyResources(this.panel1, "panel1"); this.panel1.Name = "panel1"; // // cmbdomainMatcher // - resources.ApplyResources(this.cmbdomainMatcher, "cmbdomainMatcher"); this.cmbdomainMatcher.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbdomainMatcher.FormattingEnabled = true; this.cmbdomainMatcher.Items.AddRange(new object[] { resources.GetString("cmbdomainMatcher.Items"), resources.GetString("cmbdomainMatcher.Items1")}); + resources.ApplyResources(this.cmbdomainMatcher, "cmbdomainMatcher"); this.cmbdomainMatcher.Name = "cmbdomainMatcher"; // // label6 @@ -160,107 +162,115 @@ // // cmbdomainStrategy // - resources.ApplyResources(this.cmbdomainStrategy, "cmbdomainStrategy"); this.cmbdomainStrategy.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbdomainStrategy.FormattingEnabled = true; this.cmbdomainStrategy.Items.AddRange(new object[] { resources.GetString("cmbdomainStrategy.Items"), resources.GetString("cmbdomainStrategy.Items1"), resources.GetString("cmbdomainStrategy.Items2")}); + resources.ApplyResources(this.cmbdomainStrategy, "cmbdomainStrategy"); this.cmbdomainStrategy.Name = "cmbdomainStrategy"; // // cmsLv // - resources.ApplyResources(this.cmsLv, "cmsLv"); this.cmsLv.ImageScalingSize = new System.Drawing.Size(20, 20); this.cmsLv.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuAdd, this.menuRemove, this.menuSelectAll, - this.menuSetDefaultRouting}); + this.menuSetDefaultRouting, + this.toolStripSeparator1, + this.menuImportAdvancedRules}); this.cmsLv.Name = "cmsLv"; this.cmsLv.OwnerItem = this.MenuItemAdvanced; + resources.ApplyResources(this.cmsLv, "cmsLv"); // // menuAdd // - resources.ApplyResources(this.menuAdd, "menuAdd"); this.menuAdd.Name = "menuAdd"; + resources.ApplyResources(this.menuAdd, "menuAdd"); this.menuAdd.Click += new System.EventHandler(this.menuAdd_Click); // // menuRemove // - resources.ApplyResources(this.menuRemove, "menuRemove"); this.menuRemove.Name = "menuRemove"; + resources.ApplyResources(this.menuRemove, "menuRemove"); this.menuRemove.Click += new System.EventHandler(this.menuRemove_Click); // // menuSelectAll // - resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); this.menuSelectAll.Name = "menuSelectAll"; + resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click); // // menuSetDefaultRouting // - resources.ApplyResources(this.menuSetDefaultRouting, "menuSetDefaultRouting"); this.menuSetDefaultRouting.Name = "menuSetDefaultRouting"; + resources.ApplyResources(this.menuSetDefaultRouting, "menuSetDefaultRouting"); this.menuSetDefaultRouting.Click += new System.EventHandler(this.menuSetDefaultRouting_Click); // + // menuImportAdvancedRules + // + this.menuImportAdvancedRules.Name = "menuImportAdvancedRules"; + resources.ApplyResources(this.menuImportAdvancedRules, "menuImportAdvancedRules"); + this.menuImportAdvancedRules.Click += new System.EventHandler(this.menuImportAdvancedRules_Click); + // // MenuItemAdvanced // - resources.ApplyResources(this.MenuItemAdvanced, "MenuItemAdvanced"); this.MenuItemAdvanced.DropDown = this.cmsLv; this.MenuItemAdvanced.Name = "MenuItemAdvanced"; + resources.ApplyResources(this.MenuItemAdvanced, "MenuItemAdvanced"); // // menuServer // - resources.ApplyResources(this.menuServer, "menuServer"); this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.MenuItemBasic, this.MenuItemAdvanced}); + resources.ApplyResources(this.menuServer, "menuServer"); this.menuServer.Name = "menuServer"; // // MenuItemBasic // - resources.ApplyResources(this.MenuItemBasic, "MenuItemBasic"); this.MenuItemBasic.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuImportBasicRules}); this.MenuItemBasic.Name = "MenuItemBasic"; + resources.ApplyResources(this.MenuItemBasic, "MenuItemBasic"); // // menuImportBasicRules // - resources.ApplyResources(this.menuImportBasicRules, "menuImportBasicRules"); this.menuImportBasicRules.Name = "menuImportBasicRules"; + resources.ApplyResources(this.menuImportBasicRules, "menuImportBasicRules"); this.menuImportBasicRules.Click += new System.EventHandler(this.menuImportBasicRules_Click); // // tabNormal // - resources.ApplyResources(this.tabNormal, "tabNormal"); this.tabNormal.Controls.Add(this.tabPageProxy); this.tabNormal.Controls.Add(this.tabPageDirect); this.tabNormal.Controls.Add(this.tabPageBlock); this.tabNormal.Controls.Add(this.tabPageRuleList); + resources.ApplyResources(this.tabNormal, "tabNormal"); this.tabNormal.Name = "tabNormal"; this.tabNormal.SelectedIndex = 0; this.tabNormal.Selecting += new System.Windows.Forms.TabControlCancelEventHandler(this.tabNormal_Selecting); // // tabPageProxy // - resources.ApplyResources(this.tabPageProxy, "tabPageProxy"); this.tabPageProxy.Controls.Add(this.panel5); + resources.ApplyResources(this.tabPageProxy, "tabPageProxy"); this.tabPageProxy.Name = "tabPageProxy"; this.tabPageProxy.UseVisualStyleBackColor = true; // // panel5 // - resources.ApplyResources(this.panel5, "panel5"); this.panel5.Controls.Add(this.groupBox5); this.panel5.Controls.Add(this.groupBox6); + resources.ApplyResources(this.panel5, "panel5"); this.panel5.Name = "panel5"; // // groupBox5 // - resources.ApplyResources(this.groupBox5, "groupBox5"); this.groupBox5.Controls.Add(this.txtProxyIp); + resources.ApplyResources(this.groupBox5, "groupBox5"); this.groupBox5.Name = "groupBox5"; this.groupBox5.TabStop = false; // @@ -271,8 +281,8 @@ // // groupBox6 // - resources.ApplyResources(this.groupBox6, "groupBox6"); this.groupBox6.Controls.Add(this.txtProxyDomain); + resources.ApplyResources(this.groupBox6, "groupBox6"); this.groupBox6.Name = "groupBox6"; this.groupBox6.TabStop = false; // @@ -283,22 +293,22 @@ // // tabPageDirect // - resources.ApplyResources(this.tabPageDirect, "tabPageDirect"); this.tabPageDirect.Controls.Add(this.panel4); + resources.ApplyResources(this.tabPageDirect, "tabPageDirect"); this.tabPageDirect.Name = "tabPageDirect"; this.tabPageDirect.UseVisualStyleBackColor = true; // // panel4 // - resources.ApplyResources(this.panel4, "panel4"); this.panel4.Controls.Add(this.groupBox3); this.panel4.Controls.Add(this.groupBox4); + resources.ApplyResources(this.panel4, "panel4"); this.panel4.Name = "panel4"; // // groupBox3 // - resources.ApplyResources(this.groupBox3, "groupBox3"); this.groupBox3.Controls.Add(this.txtDirectIp); + resources.ApplyResources(this.groupBox3, "groupBox3"); this.groupBox3.Name = "groupBox3"; this.groupBox3.TabStop = false; // @@ -309,8 +319,8 @@ // // groupBox4 // - resources.ApplyResources(this.groupBox4, "groupBox4"); this.groupBox4.Controls.Add(this.txtDirectDomain); + resources.ApplyResources(this.groupBox4, "groupBox4"); this.groupBox4.Name = "groupBox4"; this.groupBox4.TabStop = false; // @@ -321,22 +331,22 @@ // // tabPageBlock // - resources.ApplyResources(this.tabPageBlock, "tabPageBlock"); this.tabPageBlock.Controls.Add(this.panel3); + resources.ApplyResources(this.tabPageBlock, "tabPageBlock"); this.tabPageBlock.Name = "tabPageBlock"; this.tabPageBlock.UseVisualStyleBackColor = true; // // panel3 // - resources.ApplyResources(this.panel3, "panel3"); this.panel3.Controls.Add(this.groupBox2); this.panel3.Controls.Add(this.groupBox1); + resources.ApplyResources(this.panel3, "panel3"); this.panel3.Name = "panel3"; // // groupBox2 // - resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Controls.Add(this.txtBlockIp); + resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Name = "groupBox2"; this.groupBox2.TabStop = false; // @@ -347,8 +357,8 @@ // // groupBox1 // - resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Controls.Add(this.txtBlockDomain); + resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // @@ -359,15 +369,15 @@ // // tabPageRuleList // - resources.ApplyResources(this.tabPageRuleList, "tabPageRuleList"); this.tabPageRuleList.Controls.Add(this.lvRoutings); + resources.ApplyResources(this.tabPageRuleList, "tabPageRuleList"); this.tabPageRuleList.Name = "tabPageRuleList"; this.tabPageRuleList.UseVisualStyleBackColor = true; // // lvRoutings // - resources.ApplyResources(this.lvRoutings, "lvRoutings"); this.lvRoutings.ContextMenuStrip = this.cmsLv; + resources.ApplyResources(this.lvRoutings, "lvRoutings"); this.lvRoutings.FullRowSelect = true; this.lvRoutings.GridLines = true; this.lvRoutings.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; @@ -380,6 +390,11 @@ this.lvRoutings.View = System.Windows.Forms.View.Details; this.lvRoutings.DoubleClick += new System.EventHandler(this.lvRoutings_DoubleClick); // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); + // // RoutingSettingForm // resources.ApplyResources(this, "$this"); @@ -464,5 +479,7 @@ private System.Windows.Forms.ToolStripMenuItem menuImportBasicRules; private System.Windows.Forms.ComboBox cmbdomainMatcher; private System.Windows.Forms.Label label6; + private System.Windows.Forms.ToolStripMenuItem menuImportAdvancedRules; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs index 4628d16e..b1c6755a 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs @@ -304,6 +304,14 @@ namespace v2rayN.Forms UI.Show(UIRes.I18N("OperationSuccess")); } + private void menuImportAdvancedRules_Click(object sender, EventArgs e) + { + if (ConfigHandler.InitBuiltinRouting(ref config, true) == 0) + { + RefreshRoutingsView(); + } + } + #endregion } diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.resx b/v2rayN/v2rayN/Forms/RoutingSettingForm.resx index 707462c4..c3346803 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.resx +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.resx @@ -117,10 +117,579 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + + 753, 17 + + + 75, 23 + + + 4 + + + &Cancel + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + + labRoutingTips + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 2 + + + Bottom + + + 0, 613 + + + 853, 60 + 7 + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + NoControl + + + 5, 22 + + + 562, 16 + + + 34 + + + *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA> + + + labRoutingTips + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + NoControl + + + 660, 17 + + + 75, 23 + + + 5 + + + &OK + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 2 + + + cmbdomainMatcher + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 0 + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 1 + + + chkenableRoutingAdvanced + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 2 + + + linkLabelRoutingDoc + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 3 + + + cmbdomainStrategy + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 4 + + + Top + + + 0, 25 + + + 853, 51 + + + 11 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + linear + + + mph + + + 681, 17 + + + 116, 20 + + + 28 + + + cmbdomainMatcher + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 0 + + + True + + + NoControl + + + 575, 21 + + + 89, 12 + + + 27 + + + Domain Matcher + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 1 + + + True + + + NoControl + + + 318, 17 + + + 216, 16 + + + 26 + + + Enable advanced routing function + + + chkenableRoutingAdvanced + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 2 + + + True + + + NoControl + + + 6, 21 + + + 0, 0, 0, 0 + + + 95, 12 + + + 19 + + + Domain strategy + + + linkLabelRoutingDoc + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 3 + + + AsIs + + + IPIfNonMatch + + + IPOnDemand + + + 116, 17 + + + 165, 20 + + + 16 + + + cmbdomainStrategy + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 4 + + + 17, 17 + + + 212, 22 + + + Add + + + 212, 22 + + + Remove selected + + + 212, 22 + + + Select All (Ctrl+A) + + + 212, 22 + + + Set as active routing + + + 209, 6 + + + 212, 22 + + + Import Advanced Rules + + + 129, 21 + + + Advanced Function + + + 213, 142 + + + cmsLv + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 139, 17 + + + 0, 0 + + + 853, 25 + + + 15 + + + menuServer + + + System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + 102, 21 + + + Basic Function + + + 185, 22 + + + Import Basic Rules + + + panel5 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageProxy + + + 0 + + + 4, 22 + + + 3, 3, 3, 3 + + + 845, 511 + + + 0 + + + 1.Proxy Domain or IP + + + tabPageProxy + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabNormal + + + 0 + + + panel4 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageDirect + + + 0 + + + 4, 22 + + + 3, 3, 3, 3 + + + 845, 511 + + + 1 + + + 2.Direct Domain or IP + + + tabPageDirect + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabNormal + + + 1 + + + panel3 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageBlock + + + 0 + + + 4, 22 + + + 3, 3, 3, 3 + + + 845, 511 + + + 2 + + + 3.Block Domain or IP + + + tabPageBlock + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabNormal + + + 2 + + + Fill + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w @@ -138,352 +707,548 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - + + 3, 3 + + + 839, 505 + + + 15 + + + lvRoutings + + + v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + tabPageRuleList + + 0 - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 4, 22 - + + 3, 3, 3, 3 + + + 845, 511 + + + 3 + + + Pre-defined Rule Set List + + + tabPageRuleList + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabNormal + + + 3 + + + Fill + + + 0, 76 + + + 853, 537 + + + 16 + + + tabNormal + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + 1 - + + groupBox5 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel5 + + + 0 + + + groupBox6 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel5 + + 1 - - txtBlockIp + + Fill + + + 3, 3 + + + 839, 505 + + + 12 + + + panel5 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageProxy + + + 0 + + + txtProxyIp + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox5 + + + 0 + + + Fill + + + 392, 0 + + + 447, 505 + + + 4 + + + IP + + + groupBox5 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel5 + + + 0 + + + Fill + + + 3, 17 + + + True + + + Vertical + + + 441, 485 + + + 25 + + + txtProxyIp + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox5 + + + 0 + + + txtProxyDomain + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox6 + + + 0 + + + Left + + + 0, 0 + + + 392, 505 + + + 3 + + + Domain + + + groupBox6 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel5 + + + 1 + + + Fill + + + 3, 17 + + + True + + + Vertical + + + 386, 485 + + + 24 + + + txtProxyDomain + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox6 + + + 0 + + + groupBox3 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 0 + + + groupBox4 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 1 + + + Fill + + + 3, 3 + + + 839, 505 + + + 12 + + + panel4 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageDirect + + + 0 + + + txtDirectIp + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 0 + + + Fill + + + 392, 0 + + + 447, 505 + + + 4 + + + IP + + + groupBox3 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 0 + + + Fill + + + 3, 17 + + + True + + + Vertical + + + 441, 485 + + + 25 + + + txtDirectIp + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 0 + + + txtDirectDomain + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + + 0 + + + Left + + + 0, 0 + + + 392, 505 + + + 3 + + + Domain + + + groupBox4 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 1 + + + Fill + + + 3, 17 + + + True + + + Vertical - 386, 485 24 - - 15 + + txtDirectDomain - + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + 0 - - linkLabelRoutingDoc - - - - Top - groupBox2 - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3 - - - tabNormal - - - 25 - - - 839, 505 - - - 0 - - - True - - - 562, 16 - - - 441, 485 - - - panel2 - - - tabNormal - - + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Fill - - - NoControl - - - Fill - - - 12 - - - 5, 22 - - - mph - - - groupBox5 - - - 392, 505 - - - Basic Function - - - cmbdomainStrategy - - - 3, 3, 3, 3 - - - groupBox3 - - - 386, 485 - - - 2 - - - panel5 - - - tabPageRuleList - - - groupBox3 - - - 1 - - - 447, 505 - - - $this - - - 575, 21 - - - &Cancel - - - 447, 505 - - - 4 - - - 195, 92 - - - Fill - - - System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - 0, 0 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 853, 537 - - - menuAdd - - - 0 - - - 24 - - - 4 - - - txtBlockDomain - - - 3, 17 - - - tabNormal - - - 5 - - - 441, 485 - - - Vertical - - - 2.Direct Domain or IP - - - 447, 505 - - - 2 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 1 - - - NoControl - - - linear - - + panel3 - - Fill - - - 4, 22 - - - Left - - - 392, 505 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel1 - - - tabPageBlock - - - 392, 0 - - - 3, 3, 3, 3 - - - 16 - - - 165, 20 - - - 3, 17 - - - 6, 12 - - - 16 - - - 2 - - - Fill - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill - - - panel1 - - - panel5 - - - Fill - - - 0, 0 - - - 753, 17 - - - Fill - - - Left - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 392, 505 - - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - 681, 17 - - - panel2 - - - tabPageProxy - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuRemove - - - 318, 17 - - + 0 - - btnClose - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - groupBox1 - + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 1 + + + Fill + + + 3, 3 + + + 839, 505 + + + 12 + + + panel3 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageBlock + + + 0 + + + txtBlockIp + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + groupBox2 + + + 0 + + + Fill + + + 392, 0 + + + 447, 505 + + + 4 + + + IP + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 0 + + + Fill + + + 3, 17 + + True - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Vertical 441, 485 @@ -491,640 +1256,157 @@ 25 - - 12 + + txtBlockIp - - 28 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - NoControl + + groupBox2 - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabNormal - - - NoControl - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Vertical - - - *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA> - - - 2 - - - 26 - - - Vertical - - - panel3 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3.Block Domain or IP - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox4 - - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + 0 - - tabNormal + + txtBlockDomain - - 3, 3 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - labRoutingTips + + groupBox1 - + 0 - - 89, 12 - - - 845, 511 - - - panel1 + + Left 0, 0 - - 853, 60 + + 392, 505 - - txtDirectIp + + 3 + + + Domain + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 1 + + + Fill + + + 3, 17 + + + True + + + Vertical + + + 386, 485 + + + 24 + + + txtBlockDomain + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + True + + + 6, 12 + + + 853, 673 + + + Routing Settings + + + menuAdd System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + menuRemove + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuSelectAll + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuSetDefaultRouting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuImportAdvancedRules + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MenuItemAdvanced + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + MenuItemBasic - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel1 - - - chkenableRoutingAdvanced - - - Fill - - - 185, 22 - - - label6 - - - 3, 3 - - - 25 - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 392, 0 - - - 194, 22 - - - Remove selected - - - panel4 - - - Domain strategy - - - Bottom - - - groupBox4 - - - 102, 21 - - - 0 - - - Vertical - - - cmsLv - - - Left - - - Add - - - 3 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 392, 0 - - - 24 - - - tabPageBlock - - - 12 - - - 3 - - - lvRoutings - - - groupBox6 - - - 2 - - - panel4 - - - Fill - - - panel3 - - - tabPageDirect - - - 0, 613 - - + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - True - - - tabPageProxy - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - 6, 21 - - - Import Basic Rules - - - 853, 51 - - - Fill - - - 116, 20 - - - 0, 0, 0, 0 - - - 3, 3, 3, 3 - - - v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - 3, 17 - - - groupBox6 - - - panel2 - - - 0 - - - Domain - - - 1 - - - 95, 12 - - - 386, 485 - - - 0 - - - 845, 511 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Advanced Function - - - AsIs - - - tabPageRuleList - - - 3 - - - groupBox5 - - - 660, 17 - - - 34 - - - 11 - - - 19 - - - MenuItemAdvanced - - - 194, 22 - - - Vertical - - - Select All (Ctrl+A) - - - IP - - - 839, 505 - - - txtProxyIp - - - True - - - Fill - - - 1 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Set as active routing - - - 4, 22 - - - 1 - - - NoControl - - - Domain Matcher - - - 4 - - - RoutingSettingForm - - - 194, 22 - - - &OK - - - 4, 22 - - - IP - - - panel2 - - - 116, 17 - - - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4, 22 - - - Pre-defined Rule Set List - - - 845, 511 - - - menuServer - - - True - - - IPIfNonMatch - - - menuSetDefaultRouting - - - Domain - - - Vertical - - - 4 - - - 0 - - - NoControl - - - $this - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 194, 22 - - - panel1 - - - $this - - - txtProxyDomain - - - groupBox1 - - - 0 - - - 3, 17 - - - txtDirectDomain - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4 - - - IP - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - menuImportBasicRules - - 0 - - - True - - - 129, 21 - - - 0, 76 - - - 839, 505 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel4 - - - cmbdomainMatcher - - - 0 - - - 3, 17 - - - Domain - - - panel5 - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Enable advanced routing function + + toolStripSeparator1 - - 839, 505 + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + RoutingSettingForm - - 75, 23 + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - 216, 16 - - - 853, 673 - - - True - - - IPOnDemand - - - 3 - - - 3 - - - 0, 0 - - - Routing Settings - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3, 3, 3, 3 - - - panel1 - - - menuSelectAll - - - 4 - - - 3 - - - 0 - - - btnOK - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 15 - - - 3, 3 - - - 0, 25 - - - 0 - - - 75, 23 - - - 845, 511 - - - 1 - - - True - - - 3, 3 - - - Fill - - - 1.Proxy Domain or IP - - - groupBox2 - - - $this - - - tabPageDirect - - - Fill - - - 3, 17 - - - 27 - - - 853, 25 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - zh-Hans - - - True - - - 17, 17 - - - 139, 17 - \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx index 8b98b506..fe451130 100644 --- a/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx @@ -124,6 +124,12 @@ 取消(&C) + + 0, 545 + + + 817, 60 + 518, 16 @@ -136,11 +142,8 @@ 确定(&O) - - 0, 545 - - - 817, 60 + + 817, 51 77, 12 @@ -160,8 +163,8 @@ 域名解析策略 - - 817, 51 + + 149, 114 148, 22 @@ -193,14 +196,8 @@ 高级功能 - - 149, 92 - - - 172, 22 - - - 一键导入基础规则 + + 817, 25 68, 21 @@ -208,23 +205,14 @@ 基础功能 - - 817, 25 + + 180, 22 - - 405, 417 + + 一键导入基础规则 - - 411, 437 - - - 386, 417 - - - 392, 437 - - - 803, 437 + + 817, 469 809, 443 @@ -232,20 +220,20 @@ 1.代理的Domain或IP - - 405, 417 + + 803, 437 - + 411, 437 - - 386, 417 + + 405, 417 - + 392, 437 - - 803, 437 + + 386, 417 809, 443 @@ -253,20 +241,20 @@ 2.直连的Domain或IP - - 405, 417 + + 803, 437 - + 411, 437 - - 386, 417 + + 405, 417 - + 392, 437 - - 803, 437 + + 386, 417 809, 443 @@ -274,6 +262,27 @@ 3.阻止的Domain或IP + + 803, 437 + + + 411, 437 + + + 405, 417 + + + 392, 437 + + + 386, 417 + + + 809, 443 + + + 预定义规则集列表 + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w @@ -294,14 +303,8 @@ 803, 437 - - 809, 443 - - - 预定义规则集列表 - - - 817, 469 + + 一键导入高级规则 817, 605 diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs b/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs index e1a31157..bff96482 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs +++ b/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs @@ -30,6 +30,8 @@ { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SubSettingControl)); this.grbMain = new System.Windows.Forms.GroupBox(); + this.label4 = new System.Windows.Forms.Label(); + this.cmbGroup = new System.Windows.Forms.ComboBox(); this.txtUserAgent = new System.Windows.Forms.TextBox(); this.label1 = new System.Windows.Forms.Label(); this.btnShare = new System.Windows.Forms.Button(); @@ -47,6 +49,8 @@ // grbMain // resources.ApplyResources(this.grbMain, "grbMain"); + this.grbMain.Controls.Add(this.label4); + this.grbMain.Controls.Add(this.cmbGroup); this.grbMain.Controls.Add(this.txtUserAgent); this.grbMain.Controls.Add(this.label1); this.grbMain.Controls.Add(this.btnShare); @@ -59,6 +63,19 @@ this.grbMain.Name = "grbMain"; this.grbMain.TabStop = false; // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + // + // cmbGroup + // + resources.ApplyResources(this.cmbGroup, "cmbGroup"); + this.cmbGroup.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbGroup.FormattingEnabled = true; + this.cmbGroup.Name = "cmbGroup"; + this.cmbGroup.Leave += new System.EventHandler(this.txtRemarks_Leave); + // // txtUserAgent // resources.ApplyResources(this.txtUserAgent, "txtUserAgent"); @@ -147,5 +164,7 @@ private System.Windows.Forms.PictureBox picQRCode; private System.Windows.Forms.TextBox txtUserAgent; private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.ComboBox cmbGroup; } } diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.cs b/v2rayN/v2rayN/Forms/SubSettingControl.cs index 3d816c10..cfa29848 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.cs +++ b/v2rayN/v2rayN/Forms/SubSettingControl.cs @@ -3,6 +3,8 @@ using System.Windows.Forms; using v2rayN.Base; using v2rayN.Handler; using v2rayN.Mode; +using System.Linq; +using System.Collections.Generic; namespace v2rayN.Forms { @@ -10,7 +12,7 @@ namespace v2rayN.Forms public partial class SubSettingControl : UserControl { public event ChangeEventHandler OnButtonClicked; - + private List groupItem; public SubItem subItem { @@ -25,6 +27,12 @@ namespace v2rayN.Forms private void SubSettingControl_Load(object sender, EventArgs e) { this.Height = grbMain.Height; + + groupItem = LazyConfig.Instance.GetConfig().groupItem; + + cmbGroup.Items.AddRange(groupItem.Select(t => t.remarks).ToArray()); + cmbGroup.Items.Add(string.Empty); + BindingSub(); } @@ -36,6 +44,12 @@ namespace v2rayN.Forms txtUrl.Text = subItem.url.ToString(); chkEnabled.Checked = subItem.enabled; txtUserAgent.Text = subItem.userAgent; + + var index = groupItem.FindIndex(t => t.id == subItem.groupId); + if (index >= 0) + { + cmbGroup.SelectedIndex = index; + } } } private void EndBindingSub() @@ -46,6 +60,12 @@ namespace v2rayN.Forms subItem.url = txtUrl.Text.TrimEx(); subItem.enabled = chkEnabled.Checked; subItem.userAgent = txtUserAgent.Text.TrimEx(); + + var index = groupItem.FindIndex(t => t.remarks == cmbGroup.Text); + if (index >= 0) + { + subItem.groupId = groupItem[index].id; + } } } private void txtRemarks_Leave(object sender, EventArgs e) diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.resx b/v2rayN/v2rayN/Forms/SubSettingControl.resx index 71c5a7f5..d750067b 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.resx +++ b/v2rayN/v2rayN/Forms/SubSettingControl.resx @@ -131,17 +131,20 @@ 619, 162 - - 0 + + 127, 147 60, 16 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + txtUrl - - 8 + + grbMain picQRCode @@ -177,6 +180,9 @@ 26 + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -186,12 +192,18 @@ grbMain + + 36 + 434, 21 83, 12 + + cmbGroup + 232, 21 @@ -213,17 +225,20 @@ Share + + 10 + grbMain - 3 + 5 12, 53 - 1 + 3 Fill @@ -231,14 +246,17 @@ 27 - - 10 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 473, 21 125, 12 - - 25 + + label4 127, 53 @@ -250,14 +268,23 @@ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 5 + 7 - - Zoom + + grbMain + + + 232, 20 + + + 2 1 + + NoControl + 47, 12 @@ -276,11 +303,20 @@ chkEnabled - - 6 + + Zoom - - NoControl + + 8 + + + 25 + + + Belong to Group + + + 35 txtRemarks @@ -288,14 +324,11 @@ NoControl - - 0, 148 - 75, 23 - 4 + 6 grbMain @@ -303,20 +336,26 @@ 25 + + 0 + grbMain - - 10 + + 1 2 + + 10 + grbMain - - 473, 21 + + grbMain 368, 23 @@ -333,9 +372,6 @@ True - - grbMain - True @@ -351,20 +387,23 @@ $this - - grbMain + + True - 619, 148 + 619, 188 btnShare + + 619, 350 + - 2 + 4 - 7 + 9 NoControl @@ -372,8 +411,8 @@ 12, 115 - - 619, 310 + + 0, 188 txtUserAgent @@ -381,8 +420,8 @@ Remarks - - 0 + + grbMain NoControl @@ -396,7 +435,13 @@ 75, 23 - + + 12, 151 + + + 95, 12 + + grbMain @@ -411,6 +456,9 @@ System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0 + System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -420,8 +468,8 @@ grbMain - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + NoControl System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -432,6 +480,9 @@ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 10 + True diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx index 71226592..27cc0315 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx @@ -118,6 +118,12 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 53, 12 + + + 所属分组 + 101, 12 diff --git a/v2rayN/v2rayN/Forms/SubSettingForm.resx b/v2rayN/v2rayN/Forms/SubSettingForm.resx index 923a69e4..316b8ff2 100644 --- a/v2rayN/v2rayN/Forms/SubSettingForm.resx +++ b/v2rayN/v2rayN/Forms/SubSettingForm.resx @@ -157,7 +157,7 @@ 0, 0 - 614, 351 + 634, 401 10 @@ -232,10 +232,10 @@ Bottom - 0, 351 + 0, 401 - 614, 60 + 634, 60 7 @@ -259,7 +259,7 @@ 6, 12 - 614, 411 + 634, 461 Subscription settings diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 45284b21..42d78b9b 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -45,7 +45,6 @@ namespace v2rayN.Handler { config = new Config { - index = -1, logEnabled = false, loglevel = "warning", vmess = new List(), @@ -53,9 +52,6 @@ namespace v2rayN.Handler //Mux muxEnabled = false, - ////默认监听端口 - //config.pacPort = 8888; - // 默认不开启统计 enableStatistics = false, @@ -89,7 +85,6 @@ namespace v2rayN.Handler } else { - //http协议不由core提供,只保留socks if (config.inbound.Count > 0) { config.inbound[0].protocol = Global.InboundSocks; @@ -157,11 +152,14 @@ namespace v2rayN.Handler { config.subItem = new List(); } + if (config.groupItem == null) + { + config.groupItem = new List(); + } + if (config == null - || config.index < 0 || config.vmess.Count <= 0 - || config.index > config.vmess.Count - 1 ) { Global.reloadV2ray = false; @@ -196,9 +194,8 @@ namespace v2rayN.Handler /// /// /// - /// /// - public static int AddServer(ref Config config, VmessItem vmessItem, int index, bool toFile = true) + public static int AddServer(ref Config config, VmessItem vmessItem, bool toFile = true) { vmessItem.configType = (int)EConfigType.Vmess; @@ -216,19 +213,7 @@ namespace v2rayN.Handler return -1; } - if (index >= 0) - { - //修改 - config.vmess[index] = vmessItem; - if (config.index.Equals(index)) - { - Global.reloadV2ray = true; - } - } - else - { - AddServerCommon(ref config, vmessItem); - } + AddServerCommon(ref config, vmessItem); if (toFile) { @@ -241,25 +226,19 @@ namespace v2rayN.Handler /// 移除服务器 /// /// - /// + /// /// - public static int RemoveServer(ref Config config, List indexs) + public static int RemoveServer(Config config, List indexs) { - var indexId = config.indexId(); - - for (int k = indexs.Count - 1; k >= 0; k--) + foreach (var item in indexs) { - var index = indexs[k]; - if (index < 0 || index > config.vmess.Count - 1) + var index = config.FindIndexId(item.indexId); + if (index >= 0) { - continue; + config.vmess.RemoveAt(index); } - - config.vmess.RemoveAt(index); } - SetIndex(ref config, indexId); - ToJsonFile(config); return 0; @@ -271,34 +250,33 @@ namespace v2rayN.Handler /// /// /// - public static int CopyServer(ref Config config, int index) + public static int CopyServer(ref Config config, VmessItem item) { - if (index < 0 || index > config.vmess.Count - 1) + if (item == null) { return -1; } VmessItem vmessItem = new VmessItem { - configVersion = config.vmess[index].configVersion, - address = config.vmess[index].address, - port = config.vmess[index].port, - id = config.vmess[index].id, - alterId = config.vmess[index].alterId, - security = config.vmess[index].security, - network = config.vmess[index].network, - remarks = string.Format("{0}-clone", config.vmess[index].remarks), - headerType = config.vmess[index].headerType, - requestHost = config.vmess[index].requestHost, - path = config.vmess[index].path, - streamSecurity = config.vmess[index].streamSecurity, - allowInsecure = config.vmess[index].allowInsecure, - configType = config.vmess[index].configType, - flow = config.vmess[index].flow, - sni = config.vmess[index].sni + configVersion = item.configVersion, + address = item.address, + port = item.port, + id = item.id, + alterId = item.alterId, + security = item.security, + network = item.network, + remarks = string.Format("{0}-clone", item.remarks), + headerType = item.headerType, + requestHost = item.requestHost, + path = item.path, + streamSecurity = item.streamSecurity, + allowInsecure = item.allowInsecure, + configType = item.configType, + flow = item.flow, + sni = item.sni }; - //config.vmess.Insert(index + 1, vmessItem); // 插入到下一项 AddServerCommon(ref config, vmessItem); ToJsonFile(config); @@ -310,21 +288,16 @@ namespace v2rayN.Handler /// 设置活动服务器 /// /// - /// + /// /// - public static int SetDefaultServer(ref Config config, int index) + public static int SetDefaultServer(ref Config config, VmessItem item) { - if (index < 0 || index > config.vmess.Count - 1) + if (item == null) { return -1; } - ////和现在相同 - //if (config.index.Equals(index)) - //{ - // return -1; - //} - config.index = index; + config.indexId = item.indexId; Global.reloadV2ray = true; ToJsonFile(config); @@ -332,6 +305,42 @@ namespace v2rayN.Handler return 0; } + public static int SetDefaultServer(Config config, List lstVmess) + { + if (lstVmess.Exists(t => t.indexId == config.indexId)) + { + return 0; + } + if (config.vmess.Exists(t => t.indexId == config.indexId)) + { + return 0; + } + if (lstVmess.Count > 0) + { + return SetDefaultServer(ref config, lstVmess[0]); + } + if (config.vmess.Count > 0) + { + return SetDefaultServer(ref config, config.vmess[0]); + } + return -1; + } + public static VmessItem GetDefaultServer(ref Config config) + { + if (config.vmess.Count <= 0) + { + return null; + } + var index = config.FindIndexId(config.indexId); + if (index < 0) + { + SetDefaultServer(ref config, config.vmess[0]); + return config.vmess[0]; + } + + return config.vmess[index]; + } + /// /// 保参数 /// @@ -359,16 +368,23 @@ namespace v2rayN.Handler /// 移动服务器 /// /// + /// /// /// /// - public static int MoveServer(ref Config config, int index, EMove eMove) + public static int MoveServer(ref Config config, ref List lstVmess, int index, EMove eMove) { - int count = config.vmess.Count; - if (index < 0 || index > config.vmess.Count - 1) + int count = lstVmess.Count; + if (index < 0 || index > lstVmess.Count - 1) { return -1; } + + for (int i = 0; i < lstVmess.Count; i++) + { + lstVmess[i].sort = (i + 1) * 10; + } + switch (eMove) { case EMove.Top: @@ -377,21 +393,8 @@ namespace v2rayN.Handler { return 0; } - VmessItem vmess = Utils.DeepCopy(config.vmess[index]); - config.vmess.RemoveAt(index); - config.vmess.Insert(0, vmess); - if (index < config.index) - { - // - } - else if (config.index == index) - { - config.index = 0; - } - else - { - config.index++; - } + lstVmess[index].sort = lstVmess[0].sort - 1; + break; } case EMove.Up: @@ -400,17 +403,8 @@ namespace v2rayN.Handler { return 0; } - VmessItem vmess = Utils.DeepCopy(config.vmess[index]); - config.vmess.RemoveAt(index); - config.vmess.Insert(index - 1, vmess); - if (index == config.index + 1) - { - config.index++; - } - else if (config.index == index) - { - config.index--; - } + lstVmess[index].sort = lstVmess[index - 1].sort - 1; + break; } @@ -420,17 +414,8 @@ namespace v2rayN.Handler { return 0; } - VmessItem vmess = Utils.DeepCopy(config.vmess[index]); - config.vmess.RemoveAt(index); - config.vmess.Insert(index + 1, vmess); - if (index == config.index - 1) - { - config.index--; - } - else if (config.index == index) - { - config.index++; - } + lstVmess[index].sort = lstVmess[index + 1].sort + 1; + break; } case EMove.Bottom: @@ -439,26 +424,11 @@ namespace v2rayN.Handler { return 0; } - VmessItem vmess = Utils.DeepCopy(config.vmess[index]); - config.vmess.RemoveAt(index); - config.vmess.Add(vmess); - if (index < config.index) - { - config.index--; - } - else if (config.index == index) - { - config.index = count - 1; - } - else - { - // - } + lstVmess[index].sort = lstVmess[lstVmess.Count - 1].sort + 1; + break; } - } - Global.reloadV2ray = true; ToJsonFile(config); @@ -471,7 +441,7 @@ namespace v2rayN.Handler /// /// /// - public static int AddCustomServer(ref Config config, string fileName) + public static int AddCustomServer(ref Config config, string fileName, string groupId) { string newFileName = string.Format("{0}.json", Utils.GetGUID()); //newFileName = Path.Combine(Utils.GetTempPath(), newFileName); @@ -487,17 +457,13 @@ namespace v2rayN.Handler VmessItem vmessItem = new VmessItem { + groupId = groupId, address = newFileName, configType = (int)EConfigType.Custom, remarks = string.Format("import custom@{0}", DateTime.Now.ToShortDateString()) }; - config.vmess.Add(vmessItem); - if (config.vmess.Count == 1) - { - config.index = 0; - Global.reloadV2ray = true; - } + AddServerCommon(ref config, vmessItem); ToJsonFile(config); @@ -509,17 +475,9 @@ namespace v2rayN.Handler /// /// /// - /// /// - public static int EditCustomServer(ref Config config, VmessItem vmessItem, int index) + public static int EditCustomServer(ref Config config, VmessItem vmessItem) { - //修改 - config.vmess[index] = vmessItem; - if (config.index.Equals(index)) - { - Global.reloadV2ray = true; - } - ToJsonFile(config); return 0; @@ -530,9 +488,8 @@ namespace v2rayN.Handler /// /// /// - /// /// - public static int AddShadowsocksServer(ref Config config, VmessItem vmessItem, int index, bool toFile = true) + public static int AddShadowsocksServer(ref Config config, VmessItem vmessItem, bool toFile = true) { vmessItem.configType = (int)EConfigType.Shadowsocks; @@ -545,19 +502,7 @@ namespace v2rayN.Handler return -1; } - if (index >= 0) - { - //修改 - config.vmess[index] = vmessItem; - if (config.index.Equals(index)) - { - Global.reloadV2ray = true; - } - } - else - { - AddServerCommon(ref config, vmessItem); - } + AddServerCommon(ref config, vmessItem); if (toFile) { @@ -572,27 +517,14 @@ namespace v2rayN.Handler /// /// /// - /// /// - public static int AddSocksServer(ref Config config, VmessItem vmessItem, int index, bool toFile = true) + public static int AddSocksServer(ref Config config, VmessItem vmessItem, bool toFile = true) { vmessItem.configType = (int)EConfigType.Socks; vmessItem.address = vmessItem.address.TrimEx(); - if (index >= 0) - { - //修改 - config.vmess[index] = vmessItem; - if (config.index.Equals(index)) - { - Global.reloadV2ray = true; - } - } - else - { - AddServerCommon(ref config, vmessItem); - } + AddServerCommon(ref config, vmessItem); if (toFile) { @@ -608,9 +540,8 @@ namespace v2rayN.Handler /// /// /// - /// /// - public static int AddTrojanServer(ref Config config, VmessItem vmessItem, int index, bool toFile = true) + public static int AddTrojanServer(ref Config config, VmessItem vmessItem, bool toFile = true) { vmessItem.configType = (int)EConfigType.Trojan; @@ -625,19 +556,7 @@ namespace v2rayN.Handler vmessItem.allowInsecure = config.defAllowInsecure.ToString(); } - if (index >= 0) - { - //修改 - config.vmess[index] = vmessItem; - if (config.index.Equals(index)) - { - Global.reloadV2ray = true; - } - } - else - { - AddServerCommon(ref config, vmessItem); - } + AddServerCommon(ref config, vmessItem); if (toFile) { @@ -719,14 +638,13 @@ namespace v2rayN.Handler /// /// /// 成功导入的数量 - public static int AddBatchServers(ref Config config, string clipboardData, string subid = "") + public static int AddBatchServers(ref Config config, string clipboardData, string subid, string groupId) { if (Utils.IsNullOrEmpty(clipboardData)) { return -1; } - var indexId = config.indexId(); //copy sub items List lstOriSub = null; if (!Utils.IsNullOrEmpty(subid)) @@ -770,45 +688,46 @@ namespace v2rayN.Handler vmessItem.subid = subid; } + //groupId + vmessItem.groupId = groupId; + if (vmessItem.configType == (int)EConfigType.Vmess) { - if (AddServer(ref config, vmessItem, -1, false) == 0) + if (AddServer(ref config, vmessItem, false) == 0) { countServers++; } } else if (vmessItem.configType == (int)EConfigType.Shadowsocks) { - if (AddShadowsocksServer(ref config, vmessItem, -1, false) == 0) + if (AddShadowsocksServer(ref config, vmessItem, false) == 0) { countServers++; } } else if (vmessItem.configType == (int)EConfigType.Socks) { - if (AddSocksServer(ref config, vmessItem, -1, false) == 0) + if (AddSocksServer(ref config, vmessItem, false) == 0) { countServers++; } } else if (vmessItem.configType == (int)EConfigType.Trojan) { - if (AddTrojanServer(ref config, vmessItem, -1, false) == 0) + if (AddTrojanServer(ref config, vmessItem, false) == 0) { countServers++; } } else if (vmessItem.configType == (int)EConfigType.VLESS) { - if (AddVlessServer(ref config, vmessItem, -1, false) == 0) + if (AddVlessServer(ref config, vmessItem, false) == 0) { countServers++; } } } - SetIndex(ref config, indexId); - ToJsonFile(config); return countServers; } @@ -850,11 +769,11 @@ namespace v2rayN.Handler return -1; } - foreach (SubItem sub in config.subItem) + foreach (SubItem item in config.subItem) { - if (Utils.IsNullOrEmpty(sub.id)) + if (Utils.IsNullOrEmpty(item.id)) { - sub.id = Utils.GetGUID(false); + item.id = Utils.GetGUID(false); } } @@ -870,7 +789,6 @@ namespace v2rayN.Handler /// public static int RemoveServerViaSubid(ref Config config, string subid) { - var indexId = config.indexId(); if (Utils.IsNullOrEmpty(subid) || config.vmess.Count <= 0) { return -1; @@ -883,15 +801,13 @@ namespace v2rayN.Handler } } - SetIndex(ref config, indexId); - ToJsonFile(config); return 0; } - public static int SortServers(ref Config config, EServerColName name, bool asc) + public static int SortServers(ref Config config, ref List lstVmess, EServerColName name, bool asc) { - if (config.vmess.Count <= 0) + if (lstVmess.Count <= 0) { return -1; } @@ -915,19 +831,20 @@ namespace v2rayN.Handler return -1; } - var indexId = config.indexId(); - var items = config.vmess.AsQueryable(); + var items = lstVmess.AsQueryable(); if (asc) { - config.vmess = items.OrderBy(propertyName).ToList(); + lstVmess = items.OrderBy(propertyName).ToList(); } else { - config.vmess = items.OrderByDescending(propertyName).ToList(); + lstVmess = items.OrderByDescending(propertyName).ToList(); + } + for (int i = 0; i < lstVmess.Count; i++) + { + lstVmess[i].sort = (i + 1) * 10; } - - SetIndex(ref config, indexId); ToJsonFile(config); return 0; @@ -938,9 +855,8 @@ namespace v2rayN.Handler /// /// /// - /// /// - public static int AddVlessServer(ref Config config, VmessItem vmessItem, int index, bool toFile = true) + public static int AddVlessServer(ref Config config, VmessItem vmessItem, bool toFile = true) { vmessItem.configType = (int)EConfigType.VLESS; @@ -953,19 +869,7 @@ namespace v2rayN.Handler vmessItem.path = vmessItem.path.TrimEx(); vmessItem.streamSecurity = vmessItem.streamSecurity.TrimEx(); - if (index >= 0) - { - //修改 - config.vmess[index] = vmessItem; - if (config.index.Equals(index)) - { - Global.reloadV2ray = true; - } - } - else - { - AddServerCommon(ref config, vmessItem); - } + AddServerCommon(ref config, vmessItem); if (toFile) { @@ -975,11 +879,9 @@ namespace v2rayN.Handler return 0; } - public static int DedupServerList(ref Config config) + public static int DedupServerList(ref Config config, ref List lstVmess) { - var indexId = config.indexId(); - - List source = config.vmess; + List source = lstVmess; bool keepOlder = config.keepOlderDedupl; List list = new List(); @@ -991,21 +893,23 @@ namespace v2rayN.Handler { list.Add(item); } + else + { + var index = config.FindIndexId(item.indexId); + if (index >= 0) + { + config.vmess.RemoveAt(index); + } + } } - if (!keepOlder) list.Reverse(); - config.vmess = list; - - SetIndex(ref config, indexId); + //if (!keepOlder) list.Reverse(); + //config.vmess = list; return 0; } public static int AddServerCommon(ref Config config, VmessItem vmessItem) { - if (Utils.IsNullOrEmpty(vmessItem.indexId)) - { - vmessItem.indexId = Utils.GetGUID(false); - } vmessItem.configVersion = 2; if (Utils.IsNullOrEmpty(vmessItem.allowInsecure)) { @@ -1016,39 +920,23 @@ namespace v2rayN.Handler vmessItem.network = Global.DefaultNetwork; } - config.vmess.Add(vmessItem); - if (config.vmess.Count == 1) + if (Utils.IsNullOrEmpty(vmessItem.indexId)) { - config.index = 0; - Global.reloadV2ray = true; + vmessItem.indexId = Utils.GetGUID(false); } - return 0; - } + if (!config.vmess.Exists(it => it.indexId == vmessItem.indexId)) + { + var maxSort = config.vmess.Max(t => t.sort); + vmessItem.sort = maxSort++; - public static int SetIndex(ref Config config, string indexId) - { - var index_ = config.FindIndexId(indexId); + config.vmess.Add(vmessItem); + } - if (config.index == index_) - { - return 0; - } - else if (index_ >= 0) - { - config.index = index_; - } - else - { - if (config.vmess.Count > 0) - { - config.index = 0; - } - else - { - config.index = -1; - } - } - Global.reloadV2ray = true; + //if (config.vmess.Count == 1) + //{ + // config.indexId = config.vmess[0].indexId; + // Global.reloadV2ray = true; + //} return 0; } @@ -1075,6 +963,55 @@ namespace v2rayN.Handler && (remarks ? o.remarks == n.remarks : true); } + /// + /// save Group + /// + /// + /// + public static int SaveGroupItem(ref Config config) + { + if (config.groupItem == null || config.groupItem.Count <= 0) + { + return -1; + } + + foreach (GroupItem item in config.groupItem) + { + if (Utils.IsNullOrEmpty(item.id)) + { + item.id = Utils.GetGUID(false); + } + } + + ToJsonFile(config); + return 0; + } + + public static int RemoveGroupItem(ref Config config, string groupId) + { + if (Utils.IsNullOrEmpty(groupId) || config.vmess.Count <= 0) + { + return -1; + } + + foreach (var item in config.vmess) + { + if (item.groupId.Equals(groupId)) + { + item.groupId = string.Empty; + } + } + foreach (var item in config.subItem) + { + if (item.groupId.Equals(groupId)) + { + item.groupId = string.Empty; + } + } + + ToJsonFile(config); + return 0; + } #endregion #region UI @@ -1290,14 +1227,14 @@ namespace v2rayN.Handler return 0; } - public static int InitBuiltinRouting(ref Config config) + public static int InitBuiltinRouting(ref Config config, bool blImportAdvancedRules = false) { if (config.routings == null) { config.routings = new List(); } - if (config.routings.Count(it => it.locked != true) <= 0) + if (blImportAdvancedRules || config.routings.Count(it => it.locked != true) <= 0) { //Bypass the mainland var item2 = new RoutingItem() @@ -1326,7 +1263,10 @@ namespace v2rayN.Handler AddBatchRoutingRules(ref item1, Utils.GetEmbedText(Global.CustomRoutingFileName + "global")); config.routings.Add(item1); - config.routingIndex = 0; + if (!blImportAdvancedRules) + { + config.routingIndex = 0; + } } if (GetLockedRoutingItem(ref config) == null) diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index 1895fcbb..f81bb165 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -77,15 +77,14 @@ namespace v2rayN.Handler } } - public void Export2ClientConfig(int index, Config config) + public void Export2ClientConfig(VmessItem item, Config config) { - //int index = GetLvSelectedIndex(); - if (index < 0) + if (item == null) { return; } - if (config.vmess[index].configType != (int)EConfigType.Vmess - && config.vmess[index].configType != (int)EConfigType.VLESS) + if (item.configType != (int)EConfigType.Vmess + && item.configType != (int)EConfigType.VLESS) { UI.Show(UIRes.I18N("NonVmessService")); return; @@ -106,9 +105,9 @@ namespace v2rayN.Handler { return; } - Config configCopy = Utils.DeepCopy(config); - configCopy.index = index; - if (V2rayConfigHandler.Export2ClientConfig(configCopy, fileName, out string msg) != 0) + //Config configCopy = Utils.DeepCopy(config); + //configCopy.index = index; + if (V2rayConfigHandler.Export2ClientConfig(item, fileName, out string msg) != 0) { UI.Show(msg); } @@ -118,15 +117,14 @@ namespace v2rayN.Handler } } - public void Export2ServerConfig(int index, Config config) + public void Export2ServerConfig(VmessItem item, Config config) { - //int index = GetLvSelectedIndex(); - if (index < 0) + if (item == null) { return; } - if (config.vmess[index].configType != (int)EConfigType.Vmess - && config.vmess[index].configType != (int)EConfigType.VLESS) + if (item.configType != (int)EConfigType.Vmess + && item.configType != (int)EConfigType.VLESS) { UI.Show(UIRes.I18N("NonVmessService")); return; @@ -147,9 +145,9 @@ namespace v2rayN.Handler { return; } - Config configCopy = Utils.DeepCopy(config); - configCopy.index = index; - if (V2rayConfigHandler.Export2ServerConfig(configCopy, fileName, out string msg) != 0) + //Config configCopy = Utils.DeepCopy(config); + //configCopy.index = index; + if (V2rayConfigHandler.Export2ServerConfig(item, fileName, out string msg) != 0) { UI.Show(msg); } @@ -159,12 +157,12 @@ namespace v2rayN.Handler } } - public int AddBatchServers(Config config, string clipboardData, string subid = "") + public int AddBatchServers(Config config, string clipboardData, string subid, string groupId) { int counter; int _Add() { - return ConfigHandler.AddBatchServers(ref config, clipboardData, subid); + return ConfigHandler.AddBatchServers(ref config, clipboardData, subid, groupId); } counter = _Add(); if (counter < 1) @@ -227,12 +225,12 @@ namespace v2rayN.Handler var updateHandle = new UpdateHandle(); while (true) { - Utils.SaveLog("UpdateTaskRun"); Thread.Sleep(60000); if (config.autoUpdateInterval <= 0) { continue; } + Utils.SaveLog("UpdateTaskRun"); updateHandle.UpdateGeoFile("geosite", config, (bool success, string msg) => { diff --git a/v2rayN/v2rayN/Handler/ShareHandler.cs b/v2rayN/v2rayN/Handler/ShareHandler.cs index 93cf78fe..badd9812 100644 --- a/v2rayN/v2rayN/Handler/ShareHandler.cs +++ b/v2rayN/v2rayN/Handler/ShareHandler.cs @@ -20,16 +20,14 @@ namespace v2rayN.Handler /// /// GetShareUrl /// - /// - /// + /// /// - public static string GetShareUrl(Config config, int index) + public static string GetShareUrl(VmessItem item) { try { string url = string.Empty; - VmessItem item = config.vmess[index]; switch (item.configType) { case (int)EConfigType.Vmess: @@ -297,7 +295,7 @@ namespace v2rayN.Handler } return 0; } - + #endregion #region ImportShareUrl @@ -635,7 +633,7 @@ namespace v2rayN.Handler Match details; try { - details = DetailsParser.Match(Utils.Base64Decode(base64)); + details = DetailsParser.Match(Utils.Base64Decode(base64)); } catch (FormatException) { @@ -726,7 +724,7 @@ namespace v2rayN.Handler { server.security = userInfoParts[0]; server.id = userInfoParts[1]; - } + } return server; } @@ -775,7 +773,7 @@ namespace v2rayN.Handler private static int ResolveStdTransport(NameValueCollection query, ref VmessItem item) { - item.flow = query["flow"] ?? ""; + item.flow = query["flow"] ?? ""; item.streamSecurity = query["security"] ?? ""; item.sni = query["sni"] ?? ""; item.alpn = Utils.String2List(Utils.UrlDecode(query["alpn"] ?? "")); diff --git a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs index 57ca1456..1783782b 100644 --- a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs +++ b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs @@ -14,14 +14,14 @@ namespace v2rayN.Handler private Config _config; private V2rayHandler _v2rayHandler; private List _selecteds; - Action _updateFunc; + Action _updateFunc; public SpeedtestHandler(ref Config config) { _config = config; } - public SpeedtestHandler(ref Config config, ref V2rayHandler v2rayHandler, List selecteds, string actionType, Action update) + public SpeedtestHandler(ref Config config, ref V2rayHandler v2rayHandler, List selecteds, string actionType, Action update) { _config = config; _v2rayHandler = v2rayHandler; @@ -33,11 +33,10 @@ namespace v2rayN.Handler { _selecteds.Add(new ServerTestItem() { - selected = it, - indexId = config.vmess[it].indexId, - address = config.vmess[it].address, - port = config.vmess[it].port, - configType = config.vmess[it].configType + indexId = it.indexId, + address = it.address, + port = it.port, + configType = it.configType }); } @@ -93,9 +92,8 @@ namespace v2rayN.Handler RunPingSub((ServerTestItem it) => { long time = Utils.Ping(it.address); - var index = _config.FindIndexId(it.indexId); - if (index < 0) return; - _updateFunc(index, FormatOut(time, "ms")); + + _updateFunc(it.indexId, FormatOut(time, "ms")); }); } @@ -104,9 +102,8 @@ namespace v2rayN.Handler RunPingSub((ServerTestItem it) => { int time = GetTcpingTime(it.address, it.port); - var index = _config.FindIndexId(it.indexId); - if (index < 0) return; - _updateFunc(index, FormatOut(time, "ms")); + + _updateFunc(it.indexId, FormatOut(time, "ms")); }); } @@ -120,7 +117,7 @@ namespace v2rayN.Handler pid = _v2rayHandler.LoadV2rayConfigString(_config, _selecteds); if (pid < 0) { - _updateFunc(_selecteds[0].selected, UIRes.I18N("OperationFailed")); + _updateFunc(_selecteds[0].indexId, UIRes.I18N("OperationFailed")); return; } @@ -144,9 +141,8 @@ namespace v2rayN.Handler int responseTime = -1; string status = GetRealPingTime(_config.constItem.speedPingTestUrl, webProxy, out responseTime); string output = Utils.IsNullOrEmpty(status) ? FormatOut(responseTime, "ms") : status; - var index = _config.FindIndexId(it.indexId); - if (index < 0) return; - _updateFunc(index, output); + + _updateFunc(it.indexId, output); } catch (Exception ex) { @@ -203,15 +199,10 @@ namespace v2rayN.Handler string testIndexId = string.Empty; int pid = -1; - if (_config.vmess.Count <= 0) - { - return; - } - pid = _v2rayHandler.LoadV2rayConfigString(_config, _selecteds); if (pid < 0) { - _updateFunc(_selecteds[0].selected, UIRes.I18N("OperationFailed")); + _updateFunc(_selecteds[0].indexId, UIRes.I18N("OperationFailed")); return; } @@ -219,15 +210,11 @@ namespace v2rayN.Handler DownloadHandle downloadHandle2 = new DownloadHandle(); downloadHandle2.UpdateCompleted += (sender2, args) => { - var index = _config.FindIndexId(testIndexId); - if (index < 0) return; - _updateFunc(index, args.Msg); + _updateFunc(testIndexId, args.Msg); }; downloadHandle2.Error += (sender2, args) => { - var index = _config.FindIndexId(testIndexId); - if (index < 0) return; - _updateFunc(index, args.GetException().Message); + _updateFunc(testIndexId, args.GetException().Message); }; var timeout = 10; @@ -243,7 +230,7 @@ namespace v2rayN.Handler } testIndexId = it.indexId; if (_config.FindIndexId(it.indexId) < 0) continue; - + WebProxy webProxy = new WebProxy(Global.Loopback, it.port); var ws = downloadHandle2.DownloadDataAsync(url, webProxy, timeout - 2); diff --git a/v2rayN/v2rayN/Handler/StatisticsHandler.cs b/v2rayN/v2rayN/Handler/StatisticsHandler.cs index 988cc7c8..0cdcb98f 100644 --- a/v2rayN/v2rayN/Handler/StatisticsHandler.cs +++ b/v2rayN/v2rayN/Handler/StatisticsHandler.cs @@ -116,7 +116,7 @@ namespace v2rayN.Handler if (res != null) { - string itemId = config_.getItemId(); + string itemId = config_.indexId; ServerStatItem serverStatItem = GetServerStatItem(itemId); //TODO: parse output diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs index ee3e8188..5688b797 100644 --- a/v2rayN/v2rayN/Handler/UpdateHandle.cs +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -180,6 +180,7 @@ namespace v2rayN.Handler string id = config.subItem[k - 1].id.Trim(); string url = config.subItem[k - 1].url.Trim(); string userAgent = config.subItem[k - 1].userAgent.Trim(); + string groupId = config.subItem[k - 1].groupId.Trim(); string hashCode = $"{k}->"; if (config.subItem[k - 1].enabled == false) { @@ -207,7 +208,7 @@ namespace v2rayN.Handler //ConfigHandler.RemoveServerViaSubid(ref config, id); //_updateFunc(false, $"{hashCode}{UIRes.I18N("MsgClearSubscription")}"); // RefreshServers(); - int ret = MainFormHandler.Instance.AddBatchServers(config, result, id); + int ret = MainFormHandler.Instance.AddBatchServers(config, result, id, groupId); if (ret > 0) { // RefreshServers(); diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 7af5ea3f..27021a16 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -4,6 +4,7 @@ using System.IO; using System.Linq; using System.Net; using System.Net.NetworkInformation; +using v2rayN.Base; using v2rayN.Mode; namespace v2rayN.Handler @@ -21,29 +22,24 @@ namespace v2rayN.Handler /// /// 生成v2ray的客户端配置文件 /// - /// + /// /// /// /// - public static int GenerateClientConfig(Config config, string fileName, bool blExport, out string msg) + public static int GenerateClientConfig(VmessItem node, string fileName, bool blExport, out string msg) { try { - //检查GUI设置 - if (config == null - || config.index < 0 - || config.vmess.Count <= 0 - || config.index > config.vmess.Count - 1 - ) + if (node == null) { msg = UIRes.I18N("CheckServerSettings"); return -1; } msg = UIRes.I18N("InitialConfiguration"); - if (config.configType() == (int)EConfigType.Custom) + if (node.configType == (int)EConfigType.Custom) { - return GenerateClientCustomConfig(config, fileName, out msg); + return GenerateClientCustomConfig(node, fileName, out msg); } //取得默认配置 @@ -62,6 +58,8 @@ namespace v2rayN.Handler return -1; } + var config = LazyConfig.Instance.GetConfig(); + //开始修改配置 log(config, ref v2rayConfig, blExport); @@ -72,7 +70,7 @@ namespace v2rayN.Handler routing(config, ref v2rayConfig); //outbound - outbound(config, ref v2rayConfig); + outbound(node, ref v2rayConfig); //dns dns(config, ref v2rayConfig); @@ -82,7 +80,7 @@ namespace v2rayN.Handler Utils.ToJsonFile(v2rayConfig, fileName, false); - msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), config.getSummary()); + msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), $"[{config.GetGroupRemarks(node.groupId)}] {node.getSummary()}"); } catch { @@ -327,15 +325,16 @@ namespace v2rayN.Handler /// /// vmess协议服务器配置 /// - /// + /// /// /// - private static int outbound(Config config, ref V2rayConfig v2rayConfig) + private static int outbound(VmessItem node, ref V2rayConfig v2rayConfig) { try { + var config = LazyConfig.Instance.GetConfig(); Outbounds outbound = v2rayConfig.outbounds[0]; - if (config.configType() == (int)EConfigType.Vmess) + if (node.configType == (int)EConfigType.Vmess) { VnextItem vnextItem; if (outbound.settings.vnext.Count <= 0) @@ -348,8 +347,8 @@ namespace v2rayN.Handler vnextItem = outbound.settings.vnext[0]; } //远程服务器地址和端口 - vnextItem.address = config.address(); - vnextItem.port = config.port(); + vnextItem.address = node.address; + vnextItem.port = node.port; UsersItem usersItem; if (vnextItem.users.Count <= 0) @@ -362,12 +361,12 @@ namespace v2rayN.Handler usersItem = vnextItem.users[0]; } //远程服务器用户ID - usersItem.id = config.id(); - usersItem.alterId = config.alterId(); + usersItem.id = node.id; + usersItem.alterId = node.alterId; usersItem.email = Global.userEMail; - if (Global.vmessSecuritys.Contains(config.security())) + if (Global.vmessSecuritys.Contains(node.security)) { - usersItem.security = config.security(); + usersItem.security = node.security; } else { @@ -380,12 +379,12 @@ namespace v2rayN.Handler //远程服务器底层传输配置 StreamSettings streamSettings = outbound.streamSettings; - boundStreamSettings(config, "out", ref streamSettings); + boundStreamSettings(node, "out", ref streamSettings); outbound.protocol = Global.vmessProtocolLite; outbound.settings.servers = null; } - else if (config.configType() == (int)EConfigType.Shadowsocks) + else if (node.configType == (int)EConfigType.Shadowsocks) { ServersItem serversItem; if (outbound.settings.servers.Count <= 0) @@ -398,12 +397,12 @@ namespace v2rayN.Handler serversItem = outbound.settings.servers[0]; } //远程服务器地址和端口 - serversItem.address = config.address(); - serversItem.port = config.port(); - serversItem.password = config.id(); - if (config.GetShadowsocksSecuritys().Contains(config.security())) + serversItem.address = node.address; + serversItem.port = node.port; + serversItem.password = node.id; + if (config.GetShadowsocksSecuritys().Contains(node.security)) { - serversItem.method = config.security(); + serversItem.method = node.security; } else { @@ -421,7 +420,7 @@ namespace v2rayN.Handler outbound.protocol = Global.ssProtocolLite; outbound.settings.vnext = null; } - else if (config.configType() == (int)EConfigType.Socks) + else if (node.configType == (int)EConfigType.Socks) { ServersItem serversItem; if (outbound.settings.servers.Count <= 0) @@ -434,18 +433,18 @@ namespace v2rayN.Handler serversItem = outbound.settings.servers[0]; } //远程服务器地址和端口 - serversItem.address = config.address(); - serversItem.port = config.port(); + serversItem.address = node.address; + serversItem.port = node.port; serversItem.method = null; serversItem.password = null; - if (!Utils.IsNullOrEmpty(config.security()) - && !Utils.IsNullOrEmpty(config.id())) + if (!Utils.IsNullOrEmpty(node.security) + && !Utils.IsNullOrEmpty(node.id)) { SocksUsersItem socksUsersItem = new SocksUsersItem { - user = config.security(), - pass = config.id(), + user = node.security, + pass = node.id, level = 1 }; @@ -458,7 +457,7 @@ namespace v2rayN.Handler outbound.protocol = Global.socksProtocolLite; outbound.settings.vnext = null; } - else if (config.configType() == (int)EConfigType.VLESS) + else if (node.configType == (int)EConfigType.VLESS) { VnextItem vnextItem; if (outbound.settings.vnext.Count <= 0) @@ -471,8 +470,8 @@ namespace v2rayN.Handler vnextItem = outbound.settings.vnext[0]; } //远程服务器地址和端口 - vnextItem.address = config.address(); - vnextItem.port = config.port(); + vnextItem.address = node.address; + vnextItem.port = node.port; UsersItem usersItem; if (vnextItem.users.Count <= 0) @@ -485,10 +484,10 @@ namespace v2rayN.Handler usersItem = vnextItem.users[0]; } //远程服务器用户ID - usersItem.id = config.id(); + usersItem.id = node.id; usersItem.flow = string.Empty; usersItem.email = Global.userEMail; - usersItem.encryption = config.security(); + usersItem.encryption = node.security; //Mux outbound.mux.enabled = config.muxEnabled; @@ -496,18 +495,18 @@ namespace v2rayN.Handler //远程服务器底层传输配置 StreamSettings streamSettings = outbound.streamSettings; - boundStreamSettings(config, "out", ref streamSettings); + boundStreamSettings(node, "out", ref streamSettings); //if xtls - if (config.streamSecurity() == Global.StreamSecurityX) + if (node.streamSecurity == Global.StreamSecurityX) { - if (Utils.IsNullOrEmpty(config.flow())) + if (Utils.IsNullOrEmpty(node.flow)) { usersItem.flow = Global.xtlsFlows[1]; } else { - usersItem.flow = config.flow().Replace("splice", "direct"); + usersItem.flow = node.flow.Replace("splice", "direct"); } outbound.mux.enabled = false; @@ -517,7 +516,7 @@ namespace v2rayN.Handler outbound.protocol = Global.vlessProtocolLite; outbound.settings.servers = null; } - else if (config.configType() == (int)EConfigType.Trojan) + else if (node.configType == (int)EConfigType.Trojan) { ServersItem serversItem; if (outbound.settings.servers.Count <= 0) @@ -530,24 +529,24 @@ namespace v2rayN.Handler serversItem = outbound.settings.servers[0]; } //远程服务器地址和端口 - serversItem.address = config.address(); - serversItem.port = config.port(); - serversItem.password = config.id(); + serversItem.address = node.address; + serversItem.port = node.port; + serversItem.password = node.id; serversItem.flow = string.Empty; serversItem.ota = false; serversItem.level = 1; //if xtls - if (config.streamSecurity() == Global.StreamSecurityX) + if (node.streamSecurity == Global.StreamSecurityX) { - if (Utils.IsNullOrEmpty(config.flow())) + if (Utils.IsNullOrEmpty(node.flow)) { serversItem.flow = Global.xtlsFlows[1]; } else { - serversItem.flow = config.flow().Replace("splice", "direct"); + serversItem.flow = node.flow.Replace("splice", "direct"); } outbound.mux.enabled = false; @@ -560,7 +559,7 @@ namespace v2rayN.Handler //远程服务器底层传输配置 StreamSettings streamSettings = outbound.streamSettings; - boundStreamSettings(config, "out", ref streamSettings); + boundStreamSettings(node, "out", ref streamSettings); outbound.protocol = Global.trojanProtocolLite; outbound.settings.vnext = null; @@ -575,28 +574,29 @@ namespace v2rayN.Handler /// /// vmess协议远程服务器底层传输配置 /// - /// + /// /// /// /// - private static int boundStreamSettings(Config config, string iobound, ref StreamSettings streamSettings) + private static int boundStreamSettings(VmessItem node, string iobound, ref StreamSettings streamSettings) { try { + var config = LazyConfig.Instance.GetConfig(); //远程服务器底层传输配置 - streamSettings.network = config.network(); - string host = config.requestHost(); - string sni = config.sni(); + streamSettings.network = node.getNetwork(); + string host = node.requestHost.TrimEx(); + string sni = node.sni; //if tls - if (config.streamSecurity() == Global.StreamSecurity) + if (node.streamSecurity == Global.StreamSecurity) { - streamSettings.security = config.streamSecurity(); + streamSettings.security = node.streamSecurity; TlsSettings tlsSettings = new TlsSettings { - allowInsecure = config.allowInsecure(), - alpn = config.alpn() + allowInsecure = Utils.ToBool(node.allowInsecure), + alpn = node.getAlpn() }; if (!string.IsNullOrWhiteSpace(sni)) { @@ -610,14 +610,14 @@ namespace v2rayN.Handler } //if xtls - if (config.streamSecurity() == Global.StreamSecurityX) + if (node.streamSecurity == Global.StreamSecurityX) { - streamSettings.security = config.streamSecurity(); + streamSettings.security = node.streamSecurity; TlsSettings xtlsSettings = new TlsSettings { - allowInsecure = config.allowInsecure(), - alpn = config.alpn() + allowInsecure = Utils.ToBool(node.allowInsecure), + alpn = node.getAlpn() }; if (!string.IsNullOrWhiteSpace(sni)) { @@ -631,7 +631,7 @@ namespace v2rayN.Handler } //streamSettings - switch (config.network()) + switch (node.getNetwork()) { //kcp基本配置暂时是默认值,用户能自己设置伪装类型 case "kcp": @@ -661,11 +661,11 @@ namespace v2rayN.Handler kcpSettings.writeBufferSize = config.kcpItem.writeBufferSize; kcpSettings.header = new Header { - type = config.headerType() + type = node.headerType }; - if (!Utils.IsNullOrEmpty(config.path())) + if (!Utils.IsNullOrEmpty(node.path)) { - kcpSettings.seed = config.path(); + kcpSettings.seed = node.path; } streamSettings.kcpSettings = kcpSettings; break; @@ -675,7 +675,7 @@ namespace v2rayN.Handler { }; - string path = config.path(); + string path = node.path; if (!string.IsNullOrWhiteSpace(host)) { wsSettings.headers = new Headers @@ -705,7 +705,7 @@ namespace v2rayN.Handler { httpSettings.host = Utils.String2List(host); } - httpSettings.path = config.path(); + httpSettings.path = node.path; streamSettings.httpSettings = httpSettings; @@ -718,14 +718,14 @@ namespace v2rayN.Handler QuicSettings quicsettings = new QuicSettings { security = host, - key = config.path(), + key = node.path, header = new Header { - type = config.headerType() + type = node.headerType } }; streamSettings.quicSettings = quicsettings; - if (config.streamSecurity() == Global.StreamSecurity) + if (node.streamSecurity == Global.StreamSecurity) { if (!string.IsNullOrWhiteSpace(sni)) { @@ -733,26 +733,26 @@ namespace v2rayN.Handler } else { - streamSettings.tlsSettings.serverName = config.address(); + streamSettings.tlsSettings.serverName = node.address; } } break; case "grpc": var grpcSettings = new GrpcSettings(); - grpcSettings.serviceName = config.path(); - grpcSettings.multiMode = (config.headerType() == Global.GrpcmultiMode ? true : false); + grpcSettings.serviceName = node.path; + grpcSettings.multiMode = (node.headerType == Global.GrpcmultiMode ? true : false); streamSettings.grpcSettings = grpcSettings; break; default: //tcp带http伪装 - if (config.headerType().Equals(Global.TcpHeaderHttp)) + if (node.headerType.Equals(Global.TcpHeaderHttp)) { TcpSettings tcpSettings = new TcpSettings { header = new Header { - type = config.headerType() + type = node.headerType } }; @@ -767,9 +767,9 @@ namespace v2rayN.Handler //填入自定义Path string pathHttp = @"/"; - if (!Utils.IsNullOrEmpty(config.path())) + if (!Utils.IsNullOrEmpty(node.path)) { - string[] arrPath = config.path().Split(','); + string[] arrPath = node.path.Split(','); pathHttp = string.Join("\",\"", arrPath); } request = request.Replace("$requestPath$", string.Format("\"{0}\"", pathHttp)); @@ -837,7 +837,7 @@ namespace v2rayN.Handler return 0; } - public static int statistic(Config config, ref V2rayConfig v2rayConfig) + private static int statistic(Config config, ref V2rayConfig v2rayConfig) { if (config.enableStatistics) { @@ -889,20 +889,16 @@ namespace v2rayN.Handler /// /// 生成v2ray的客户端配置文件(自定义配置) /// - /// + /// /// /// /// - public static int GenerateClientCustomConfig(Config config, string fileName, out string msg) + private static int GenerateClientCustomConfig(VmessItem node, string fileName, out string msg) { try { //检查GUI设置 - if (config == null - || config.index < 0 - || config.vmess.Count <= 0 - || config.index > config.vmess.Count - 1 - ) + if (node == null) { msg = UIRes.I18N("CheckServerSettings"); return -1; @@ -913,7 +909,7 @@ namespace v2rayN.Handler File.Delete(fileName); } - string addressFileName = config.address(); + string addressFileName = node.address; if (!File.Exists(addressFileName)) { addressFileName = Path.Combine(Utils.GetTempPath(), addressFileName); @@ -925,7 +921,7 @@ namespace v2rayN.Handler } File.Copy(addressFileName, fileName); - msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), config.getSummary()); + msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), $"[{LazyConfig.Instance.GetConfig().GetGroupRemarks(node.groupId)}] {node.getSummary()}"); } catch { @@ -942,20 +938,16 @@ namespace v2rayN.Handler /// /// 生成v2ray的客户端配置文件 /// - /// + /// /// /// /// - public static int GenerateServerConfig(Config config, string fileName, out string msg) + public static int GenerateServerConfig(VmessItem node, string fileName, out string msg) { try { //检查GUI设置 - if (config == null - || config.index < 0 - || config.vmess.Count <= 0 - || config.index > config.vmess.Count - 1 - ) + if (node == null) { msg = UIRes.I18N("CheckServerSettings"); return -1; @@ -979,18 +971,20 @@ namespace v2rayN.Handler return -1; } + var config = LazyConfig.Instance.GetConfig(); + ////开始修改配置 log(config, ref v2rayConfig, true); //vmess协议服务器配置 - ServerInbound(config, ref v2rayConfig); + ServerInbound(node, ref v2rayConfig); //传出设置 ServerOutbound(config, ref v2rayConfig); Utils.ToJsonFile(v2rayConfig, fileName, false); - msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), config.getSummary()); + msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), node.getSummary()); } catch { @@ -1003,10 +997,10 @@ namespace v2rayN.Handler /// /// vmess协议服务器配置 /// - /// + /// /// /// - private static int ServerInbound(Config config, ref V2rayConfig v2rayConfig) + private static int ServerInbound(VmessItem node, ref V2rayConfig v2rayConfig) { try { @@ -1022,28 +1016,28 @@ namespace v2rayN.Handler usersItem = inbound.settings.clients[0]; } //远程服务器端口 - inbound.port = config.port(); + inbound.port = node.port; //远程服务器用户ID - usersItem.id = config.id(); + usersItem.id = node.id; usersItem.email = Global.userEMail; - if (config.configType() == (int)EConfigType.Vmess) + if (node.configType == (int)EConfigType.Vmess) { inbound.protocol = Global.vmessProtocolLite; - usersItem.alterId = config.alterId(); + usersItem.alterId = node.alterId; } - else if (config.configType() == (int)EConfigType.VLESS) + else if (node.configType == (int)EConfigType.VLESS) { inbound.protocol = Global.vlessProtocolLite; - usersItem.flow = config.flow(); - inbound.settings.decryption = config.security(); + usersItem.flow = node.flow; + inbound.settings.decryption = node.security; } //远程服务器底层传输配置 StreamSettings streamSettings = inbound.streamSettings; - boundStreamSettings(config, "in", ref streamSettings); + boundStreamSettings(node, "in", ref streamSettings); } catch { @@ -1054,7 +1048,7 @@ namespace v2rayN.Handler /// /// 传出设置 /// - /// + /// /// /// private static int ServerOutbound(Config config, ref V2rayConfig v2rayConfig) @@ -1368,25 +1362,25 @@ namespace v2rayN.Handler /// /// 导出为客户端配置 /// - /// + /// /// /// /// - public static int Export2ClientConfig(Config config, string fileName, out string msg) + public static int Export2ClientConfig(VmessItem node, string fileName, out string msg) { - return GenerateClientConfig(config, fileName, true, out msg); + return GenerateClientConfig(node, fileName, true, out msg); } /// /// 导出为服务端配置 /// - /// + /// /// /// /// - public static int Export2ServerConfig(Config config, string fileName, out string msg) + public static int Export2ServerConfig(VmessItem node, string fileName, out string msg) { - return GenerateServerConfig(config, fileName, out msg); + return GenerateServerConfig(node, fileName, out msg); } #endregion @@ -1398,11 +1392,7 @@ namespace v2rayN.Handler { try { - if (config == null - || config.index < 0 - || config.vmess.Count <= 0 - || config.index > config.vmess.Count - 1 - ) + if (config == null) { msg = UIRes.I18N("CheckServerSettings"); return ""; @@ -1470,7 +1460,6 @@ namespace v2rayN.Handler { continue; } - configCopy.index = it.selected; it.port = port; Inbounds inbound = new Inbounds @@ -1482,9 +1471,9 @@ namespace v2rayN.Handler inbound.tag = Global.InboundHttp + inbound.port.ToString(); v2rayConfig.inbounds.Add(inbound); - + var index = configCopy.FindIndexId(it.indexId); V2rayConfig v2rayConfigCopy = Utils.FromJson(result); - outbound(configCopy, ref v2rayConfigCopy); + outbound(configCopy.vmess[index], ref v2rayConfigCopy); v2rayConfigCopy.outbounds[0].tag = Global.agentTag + inbound.port.ToString(); v2rayConfig.outbounds.Add(v2rayConfigCopy.outbounds[0]); @@ -1497,7 +1486,7 @@ namespace v2rayN.Handler v2rayConfig.routing.rules.Add(rule); } - msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), configCopy.getSummary()); + //msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), node.getSummary()); return Utils.ToJson(v2rayConfig); } catch diff --git a/v2rayN/v2rayN/Handler/V2rayHandler.cs b/v2rayN/v2rayN/Handler/V2rayHandler.cs index 1b0b99b8..b3d2df98 100644 --- a/v2rayN/v2rayN/Handler/V2rayHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayHandler.cs @@ -56,8 +56,9 @@ namespace v2rayN.Handler if (Global.reloadV2ray) { + var item = ConfigHandler.GetDefaultServer(ref config); string fileName = Utils.GetPath(v2rayConfigRes); - if (V2rayConfigHandler.GenerateClientConfig(config, fileName, false, out string msg) != 0) + if (V2rayConfigHandler.GenerateClientConfig(item, fileName, false, out string msg) != 0) { ShowMsg(false, msg); } diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index 834deb1c..727eb0e5 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Windows.Forms; using v2rayN.Base; +using System.Linq; namespace v2rayN.Mode @@ -30,10 +31,7 @@ namespace v2rayN.Mode get; set; } - /// - /// 活动配置序号 - /// - public int index + public string indexId { get; set; } @@ -206,111 +204,13 @@ namespace v2rayN.Mode get; set; } + public List groupItem + { + get; set; + } #endregion - #region function - - public string address() - { - if (index < 0) - { - return string.Empty; - } - return vmess[index].address.TrimEx(); - } - - public int port() - { - if (index < 0) - { - return 10808; - } - return vmess[index].port; - } - - public string id() - { - if (index < 0) - { - return string.Empty; - } - return vmess[index].id.TrimEx(); - } - - public int alterId() - { - if (index < 0) - { - return 0; - } - return vmess[index].alterId; - } - - public string security() - { - if (index < 0) - { - return string.Empty; - } - return vmess[index].security.TrimEx(); - } - - public string remarks() - { - if (index < 0) - { - return string.Empty; - } - return vmess[index].remarks.TrimEx(); - } - public string network() - { - if (index < 0 || Utils.IsNullOrEmpty(vmess[index].network) || !Global.networks.Contains(vmess[index].network)) - { - return Global.DefaultNetwork; - } - return vmess[index].network.TrimEx(); - } - public string headerType() - { - if (index < 0 || Utils.IsNullOrEmpty(vmess[index].headerType)) - { - return Global.None; - } - return vmess[index].headerType.Replace(" ", "").TrimEx(); - } - public string requestHost() - { - if (index < 0 || Utils.IsNullOrEmpty(vmess[index].requestHost)) - { - return string.Empty; - } - return vmess[index].requestHost.Replace(" ", "").TrimEx(); - } - public string path() - { - if (index < 0 || Utils.IsNullOrEmpty(vmess[index].path)) - { - return string.Empty; - } - return vmess[index].path.Replace(" ", "").TrimEx(); - } - public string streamSecurity() - { - if (index < 0 || Utils.IsNullOrEmpty(vmess[index].streamSecurity)) - { - return string.Empty; - } - return vmess[index].streamSecurity; - } - public bool allowInsecure() - { - if (index < 0 || Utils.IsNullOrEmpty(vmess[index].allowInsecure)) - { - return defAllowInsecure; - } - return Convert.ToBoolean(vmess[index].allowInsecure); - } + #region function public int GetLocalPort(string protocol) { @@ -336,79 +236,13 @@ namespace v2rayN.Mode return localPort; } - public int configType() + public int FindIndexId(string id) { - if (index < 0) - { - return 0; - } - return vmess[index].configType; - } - - public string getSummary() - { - if (index < 0) - { - return string.Empty; - } - return vmess[index].getSummary(); - } - - public string getItemId() - { - if (index < 0) - { - return string.Empty; - } - - return vmess[index].getItemId(); - } - public string flow() - { - if (index < 0) - { - return string.Empty; - } - return vmess[index].flow.TrimEx(); - } - public string sni() - { - if (index < 0) - { - return string.Empty; - } - return vmess[index].sni.TrimEx(); - } - public List alpn() - { - if (index < 0) - { - return null; - } - if (vmess[index].alpn != null && vmess[index].alpn.Count > 0) - { - return vmess[index].alpn; - } - else - { - return null; - } - } - public string indexId() - { - if (index < 0) - { - return string.Empty; - } - return vmess[index].indexId.TrimEx(); - } - public int FindIndexId(string indexId) - { - if (string.IsNullOrEmpty(indexId)) + if (string.IsNullOrEmpty(id)) { return -1; } - return vmess.FindIndex(it => it.indexId == indexId); + return vmess.FindIndex(it => it.indexId == id); } public List GetShadowsocksSecuritys() @@ -420,7 +254,26 @@ namespace v2rayN.Mode return Global.ssSecuritysInXray; } - + + public bool IsActiveNode(VmessItem item) + { + if (!Utils.IsNullOrEmpty(item.indexId) && item.indexId == indexId) + { + return true; + } + + return false; + } + + public string GetGroupRemarks(string groupId) + { + if (string.IsNullOrEmpty(groupId)) + { + return string.Empty; + } + return groupItem.Where(it => it.id == groupId).FirstOrDefault()?.remarks; + } + #endregion } @@ -431,7 +284,9 @@ namespace v2rayN.Mode public VmessItem() { indexId = string.Empty; - configVersion = 1; + configType = (int)EConfigType.Vmess; + configVersion = 2; + sort = 0; address = string.Empty; port = 0; id = string.Empty; @@ -444,12 +299,13 @@ namespace v2rayN.Mode path = string.Empty; streamSecurity = string.Empty; allowInsecure = string.Empty; - configType = (int)EConfigType.Vmess; testResult = string.Empty; subid = string.Empty; flow = string.Empty; + groupId = string.Empty; } + #region function public string getSummary() { string summary = string.Format("[{0}] ", ((EConfigType)configType).ToString()); @@ -470,23 +326,33 @@ namespace v2rayN.Mode switch (configType) { case (int)EConfigType.Vmess: - summary += string.Format("{0}({1}:{2})", remarks, addr, port); - break; case (int)EConfigType.Shadowsocks: - summary += string.Format("{0}({1}:{2})", remarks, addr, port); - break; case (int)EConfigType.Socks: - summary += string.Format("{0}({1}:{2})", remarks, addr, port); - break; case (int)EConfigType.VLESS: - summary += string.Format("{0}({1}:{2})", remarks, addr, port); - break; case (int)EConfigType.Trojan: summary += string.Format("{0}({1}:{2})", remarks, addr, port); break; default: summary += string.Format("{0}", remarks); break; + //case (int)EConfigType.Vmess: + // summary += string.Format("{0}({1}:{2})", remarks, addr, port); + // break; + //case (int)EConfigType.Shadowsocks: + // summary += string.Format("{0}({1}:{2})", remarks, addr, port); + // break; + //case (int)EConfigType.Socks: + // summary += string.Format("{0}({1}:{2})", remarks, addr, port); + // break; + //case (int)EConfigType.VLESS: + // summary += string.Format("{0}({1}:{2})", remarks, addr, port); + // break; + //case (int)EConfigType.Trojan: + // summary += string.Format("{0}({1}:{2})", remarks, addr, port); + // break; + //default: + // summary += string.Format("{0}", remarks); + // break; } return summary; } @@ -511,17 +377,40 @@ namespace v2rayN.Mode return subid.Substring(0, 4); } - public string getItemId() + public List getAlpn() { - string itemId = $"{address}{port}{requestHost}{path}"; - itemId = Utils.Base64Encode(itemId); - return itemId; + if (alpn != null && alpn.Count > 0) + { + return alpn; + } + else + { + return null; + } } + public string getNetwork() + { + if (Utils.IsNullOrEmpty(network) || !Global.networks.Contains(network)) + { + return Global.DefaultNetwork; + } + return network.TrimEx(); + } + #endregion + public string indexId { get; set; } + /// + /// config type(1=normal,2=custom) + /// + public int configType + { + get; set; + } + /// /// 版本(现在=2) /// @@ -530,6 +419,11 @@ namespace v2rayN.Mode get; set; } + public int sort + { + get; set; + } + /// /// 远程服务器地址 /// @@ -620,15 +514,6 @@ namespace v2rayN.Mode get; set; } - - /// - /// config type(1=normal,2=custom) - /// - public int configType - { - get; set; - } - /// /// /// @@ -666,6 +551,11 @@ namespace v2rayN.Mode { get; set; } + + public string groupId + { + get; set; + } } [Serializable] @@ -795,6 +685,11 @@ namespace v2rayN.Mode { get; set; } = string.Empty; + + public string groupId + { + get; set; + } } [Serializable] @@ -853,4 +748,24 @@ namespace v2rayN.Mode public Keys? KeyCode { get; set; } } + + [Serializable] + public class GroupItem + { + /// + /// + /// + public string id + { + get; set; + } + + /// + /// + /// + public string remarks + { + get; set; + } + } } diff --git a/v2rayN/v2rayN/Mode/ServerTestItem.cs b/v2rayN/v2rayN/Mode/ServerTestItem.cs index 8c4651f3..c15aa9ea 100644 --- a/v2rayN/v2rayN/Mode/ServerTestItem.cs +++ b/v2rayN/v2rayN/Mode/ServerTestItem.cs @@ -5,10 +5,6 @@ namespace v2rayN.Mode [Serializable] class ServerTestItem { - public int selected - { - get; set; - } public string indexId { get; set; diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index 53145d83..cdb60dff 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -1041,5 +1041,14 @@ namespace v2rayN.Resx { return ResourceManager.GetString("TransportRequestHostTip4", resourceCulture); } } + + /// + /// 查找类似 Ungrouped 的本地化字符串。 + /// + internal static string UngroupedServers { + get { + return ResourceManager.GetString("UngroupedServers", resourceCulture); + } + } } } diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index 4c3ca750..81897dae 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -445,4 +445,7 @@ Global hotkey {0} registered successfully + + Ungrouped + \ No newline at end of file diff --git a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx index db8c9970..e0fc1b08 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -445,4 +445,7 @@ 注册全局热键 {0} 成功 + + 未分组服务器 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Sample/SampleServerConfig.txt b/v2rayN/v2rayN/Sample/SampleServerConfig.txt index 29186903..3aa0bb76 100644 --- a/v2rayN/v2rayN/Sample/SampleServerConfig.txt +++ b/v2rayN/v2rayN/Sample/SampleServerConfig.txt @@ -18,7 +18,7 @@ "network": "tcp" } }], - "outbound": [{ + "outbounds": [{ "protocol": "freedom", "settings": {} }, { diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index 97e1934d..7de1c760 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -284,6 +284,18 @@ namespace v2rayN return 0; } } + public static bool ToBool(object obj) + { + try + { + return Convert.ToBoolean(obj); + } + catch (Exception ex) + { + SaveLog(ex.Message, ex); + return false; + } + } public static string ToString(object obj) { diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index 70b76468..6cb109d8 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -85,6 +85,7 @@ + @@ -155,6 +156,18 @@ ServerTransportControl.cs + + UserControl + + + GroupSettingControl.cs + + + Form + + + GroupSettingForm.cs + @@ -364,6 +377,14 @@ ServerTransportControl.cs + + GroupSettingControl.cs + Designer + + + GroupSettingControl.cs + Designer + SubSettingControl.cs Designer @@ -378,6 +399,13 @@ RoutingSettingForm.cs + + GroupSettingForm.cs + Designer + + + GroupSettingForm.cs + SubSettingForm.cs Designer