Compare commits

...

9 Commits
5.5 ... 5.8

Author SHA1 Message Date
2dust
cdc83bc9d7 Update AssemblyInfo.cs 2022-03-28 19:09:27 +08:00
2dust
70feacd276 Add hysteria support 2022-03-28 19:08:54 +08:00
2dust
ece4572058 Refactor and improve 2022-03-28 18:54:05 +08:00
2dust
4d16a5e801 Update AssemblyInfo.cs 2022-03-24 19:09:15 +08:00
2dust
1493a8b03f add drag to sort 2022-03-24 19:07:45 +08:00
2dust
d20791bf73 Update AssemblyInfo.cs 2022-03-23 18:56:01 +08:00
2dust
7bb91f57ac Custom configuration overwrite port 2022-03-23 18:49:28 +08:00
2dust
b7a6004830 some improvements 2022-03-23 18:48:57 +08:00
2dust
dee5613f2f add move servers to group 2022-03-23 18:47:59 +08:00
20 changed files with 393 additions and 137 deletions

View File

@@ -1,10 +1,13 @@
using System.Drawing; using System;
using System.Drawing;
using System.Windows.Forms; using System.Windows.Forms;
namespace v2rayN.Base namespace v2rayN.Base
{ {
class ListViewFlickerFree : ListView class ListViewFlickerFree : ListView
{ {
Action<int, int> _updateFunc;
public ListViewFlickerFree() public ListViewFlickerFree()
{ {
SetStyle(ControlStyles.OptimizedDoubleBuffer SetStyle(ControlStyles.OptimizedDoubleBuffer
@@ -13,40 +16,82 @@ namespace v2rayN.Base
UpdateStyles(); UpdateStyles();
} }
public void RegisterDragEvent(Action<int, int> _update)
public void AutoResizeColumns()
{ {
try _updateFunc = _update;
{ this.AllowDrop = true;
this.SuspendLayout();
Graphics graphics = this.CreateGraphics();
// 原生 ColumnHeaderAutoResizeStyle.ColumnContent 将忽略列头宽度 this.ItemDrag += new ItemDragEventHandler(this.lv_ItemDrag);
this.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); this.DragDrop += new DragEventHandler(this.lv_DragDrop);
this.DragEnter += new DragEventHandler(this.lv_DragEnter);
for (int i = 0; i < this.Columns.Count; i++) this.DragOver += new DragEventHandler(this.lv_DragOver);
{ this.DragLeave += new EventHandler(this.lv_DragLeave);
ColumnHeader c = this.Columns[i];
int cWidth = c.Width;
string MaxStr = "";
Font font = this.Items[0].SubItems[0].Font;
foreach (ListViewItem item in this.Items)
{
// 整行视作相同字形,不单独计算每个单元格
font = item.SubItems[i].Font;
string str = item.SubItems[i].Text;
if (str.Length > MaxStr.Length) // 未考虑非等宽问题
MaxStr = str;
} }
int strWidth = (int)graphics.MeasureString(MaxStr, font).Width;
c.Width = System.Math.Max(cWidth, strWidth); private void lv_DragDrop(object sender, DragEventArgs e)
{
int targetIndex = this.InsertionMark.Index;
if (targetIndex == -1)
{
return;
} }
this.ResumeLayout(); if (this.InsertionMark.AppearsAfterItem)
} {
catch { } targetIndex++;
} }
if (this.SelectedIndices.Count <= 0)
{
return;
}
_updateFunc(this.SelectedIndices[0], targetIndex);
//ListViewItem draggedItem = (ListViewItem)e.Data.GetData(typeof(ListViewItem));
//this.BeginUpdate();
//this.Items.Insert(targetIndex, (ListViewItem)draggedItem.Clone());
//this.Items.Remove(draggedItem);
//this.EndUpdate();
}
private void lv_DragEnter(object sender, DragEventArgs e)
{
e.Effect = e.AllowedEffect;
}
private void lv_DragLeave(object sender, EventArgs e)
{
this.InsertionMark.Index = -1;
}
private void lv_DragOver(object sender, DragEventArgs e)
{
Point targetPoint = this.PointToClient(new Point(e.X, e.Y));
int targetIndex = this.InsertionMark.NearestIndex(targetPoint);
if (targetIndex > -1)
{
Rectangle itemBounds = this.GetItemRect(targetIndex);
this.EnsureVisible(targetIndex);
if (targetPoint.Y > itemBounds.Top + (itemBounds.Height / 2))
{
this.InsertionMark.AppearsAfterItem = true;
}
else
{
this.InsertionMark.AppearsAfterItem = false;
}
}
this.InsertionMark.Index = targetIndex;
}
private void lv_ItemDrag(object sender, ItemDragEventArgs e)
{
this.DoDragDrop(e.Item, DragDropEffects.Move);
this.InsertionMark.Index = -1;
}
} }
} }

View File

@@ -19,6 +19,7 @@ namespace v2rayN.Forms
{ {
cmbCoreType.Items.AddRange(Global.coreTypes.ToArray()); cmbCoreType.Items.AddRange(Global.coreTypes.ToArray());
cmbCoreType.Items.Add("clash"); cmbCoreType.Items.Add("clash");
cmbCoreType.Items.Add("hysteria");
cmbCoreType.Items.Add(string.Empty); cmbCoreType.Items.Add(string.Empty);
txtAddress.ReadOnly = true; txtAddress.ReadOnly = true;

View File

@@ -47,6 +47,7 @@
this.menuCopyServer = new System.Windows.Forms.ToolStripMenuItem(); this.menuCopyServer = new System.Windows.Forms.ToolStripMenuItem();
this.menuSetDefaultServer = new System.Windows.Forms.ToolStripMenuItem(); this.menuSetDefaultServer = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
this.menuMoveToGroup = new System.Windows.Forms.ToolStripMenuItem();
this.menuMoveTop = new System.Windows.Forms.ToolStripMenuItem(); this.menuMoveTop = new System.Windows.Forms.ToolStripMenuItem();
this.menuMoveUp = new System.Windows.Forms.ToolStripMenuItem(); this.menuMoveUp = new System.Windows.Forms.ToolStripMenuItem();
this.menuMoveDown = new System.Windows.Forms.ToolStripMenuItem(); this.menuMoveDown = new System.Windows.Forms.ToolStripMenuItem();
@@ -64,9 +65,9 @@
this.menuExport2ServerConfig = new System.Windows.Forms.ToolStripMenuItem(); this.menuExport2ServerConfig = new System.Windows.Forms.ToolStripMenuItem();
this.menuExport2ShareUrl = new System.Windows.Forms.ToolStripMenuItem(); this.menuExport2ShareUrl = new System.Windows.Forms.ToolStripMenuItem();
this.menuExport2SubContent = 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.tabGroup = new System.Windows.Forms.TabControl();
this.qrCodeControl = new v2rayN.Forms.QRCodeControl(); this.qrCodeControl = new v2rayN.Forms.QRCodeControl();
this.tsbServer = new System.Windows.Forms.ToolStripDropDownButton();
this.splitContainer1 = new System.Windows.Forms.SplitContainer(); this.splitContainer1 = new System.Windows.Forms.SplitContainer();
this.groupBox1 = new System.Windows.Forms.GroupBox(); this.groupBox1 = new System.Windows.Forms.GroupBox();
this.gbMsgTitle = new System.Windows.Forms.GroupBox(); this.gbMsgTitle = new System.Windows.Forms.GroupBox();
@@ -208,6 +209,7 @@
this.menuCopyServer, this.menuCopyServer,
this.menuSetDefaultServer, this.menuSetDefaultServer,
this.toolStripSeparator3, this.toolStripSeparator3,
this.menuMoveToGroup,
this.menuMoveTop, this.menuMoveTop,
this.menuMoveUp, this.menuMoveUp,
this.menuMoveDown, this.menuMoveDown,
@@ -226,6 +228,7 @@
this.menuExport2ShareUrl, this.menuExport2ShareUrl,
this.menuExport2SubContent}); this.menuExport2SubContent});
this.cmsLv.Name = "cmsLv"; this.cmsLv.Name = "cmsLv";
this.cmsLv.OwnerItem = this.tsbServer;
resources.ApplyResources(this.cmsLv, "cmsLv"); resources.ApplyResources(this.cmsLv, "cmsLv");
// //
// menuAddVmessServer // menuAddVmessServer
@@ -310,6 +313,12 @@
this.toolStripSeparator3.Name = "toolStripSeparator3"; this.toolStripSeparator3.Name = "toolStripSeparator3";
resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3"); resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3");
// //
// menuMoveToGroup
//
this.menuMoveToGroup.Name = "menuMoveToGroup";
resources.ApplyResources(this.menuMoveToGroup, "menuMoveToGroup");
this.menuMoveToGroup.Click += new System.EventHandler(this.menuMoveToGroup_Click);
//
// menuMoveTop // menuMoveTop
// //
this.menuMoveTop.Name = "menuMoveTop"; this.menuMoveTop.Name = "menuMoveTop";
@@ -410,6 +419,13 @@
resources.ApplyResources(this.menuExport2SubContent, "menuExport2SubContent"); resources.ApplyResources(this.menuExport2SubContent, "menuExport2SubContent");
this.menuExport2SubContent.Click += new System.EventHandler(this.menuExport2SubContent_Click); this.menuExport2SubContent.Click += new System.EventHandler(this.menuExport2SubContent_Click);
// //
// tsbServer
//
this.tsbServer.DropDown = this.cmsLv;
this.tsbServer.Image = global::v2rayN.Properties.Resources.server;
resources.ApplyResources(this.tsbServer, "tsbServer");
this.tsbServer.Name = "tsbServer";
//
// tabGroup // tabGroup
// //
resources.ApplyResources(this.tabGroup, "tabGroup"); resources.ApplyResources(this.tabGroup, "tabGroup");
@@ -422,13 +438,6 @@
resources.ApplyResources(this.qrCodeControl, "qrCodeControl"); resources.ApplyResources(this.qrCodeControl, "qrCodeControl");
this.qrCodeControl.Name = "qrCodeControl"; this.qrCodeControl.Name = "qrCodeControl";
// //
// tsbServer
//
this.tsbServer.DropDown = this.cmsLv;
this.tsbServer.Image = global::v2rayN.Properties.Resources.server;
resources.ApplyResources(this.tsbServer, "tsbServer");
this.tsbServer.Name = "tsbServer";
//
// splitContainer1 // splitContainer1
// //
resources.ApplyResources(this.splitContainer1, "splitContainer1"); resources.ApplyResources(this.splitContainer1, "splitContainer1");
@@ -1076,6 +1085,7 @@
private System.Windows.Forms.ToolStripMenuItem tsbGlobalHotkeySetting; private System.Windows.Forms.ToolStripMenuItem tsbGlobalHotkeySetting;
private System.Windows.Forms.TabControl tabGroup; private System.Windows.Forms.TabControl tabGroup;
private System.Windows.Forms.ToolStripMenuItem tsbGroupSetting; private System.Windows.Forms.ToolStripMenuItem tsbGroupSetting;
private System.Windows.Forms.ToolStripMenuItem menuMoveToGroup;
} }
} }

View File

@@ -225,6 +225,7 @@ namespace v2rayN.Forms
lvServers.Scrollable = true; lvServers.Scrollable = true;
lvServers.MultiSelect = true; lvServers.MultiSelect = true;
lvServers.HeaderStyle = ColumnHeaderStyle.Clickable; lvServers.HeaderStyle = ColumnHeaderStyle.Clickable;
lvServers.RegisterDragEvent(UpdateDragEventHandler);
lvServers.Columns.Add("", 30); lvServers.Columns.Add("", 30);
lvServers.Columns.Add(UIRes.I18N("LvServiceType"), 80); lvServers.Columns.Add(UIRes.I18N("LvServiceType"), 80);
@@ -247,6 +248,18 @@ namespace v2rayN.Forms
lvServers.EndUpdate(); lvServers.EndUpdate();
} }
private void UpdateDragEventHandler(int index, int targetIndex)
{
if (index < 0 || targetIndex < 0)
{
return;
}
if (ConfigHandler.MoveServer(ref config, ref lstVmess, index, EMove.Position, targetIndex) == 0)
{
RefreshServers();
}
}
/// <summary> /// <summary>
/// 刷新服务器列表 /// 刷新服务器列表
/// </summary> /// </summary>
@@ -485,6 +498,23 @@ namespace v2rayN.Forms
} }
tabGroup.SelectedIndex = 0; tabGroup.SelectedIndex = 0;
//menuMoveToGroup
menuMoveToGroup.DropDownItems.Clear();
List<ToolStripMenuItem> lst = new List<ToolStripMenuItem>();
foreach (var item in config.groupItem)
{
string name = item.remarks;
ToolStripMenuItem ts = new ToolStripMenuItem(name)
{
Tag = item.id,
};
ts.Click += new EventHandler(ts_Group_Click);
lst.Add(ts);
}
menuMoveToGroup.DropDownItems.AddRange(lst.ToArray());
} }
private void tabGroup_SelectedIndexChanged(object sender, EventArgs e) private void tabGroup_SelectedIndexChanged(object sender, EventArgs e)
@@ -501,6 +531,29 @@ namespace v2rayN.Forms
lvServers.Focus(); lvServers.Focus();
} }
private void ts_Group_Click(object sender, EventArgs e)
{
try
{
ToolStripItem ts = (ToolStripItem)sender;
var groupIdSelected = Utils.ToString(ts.Tag);
int index = GetLvSelectedIndex();
if (index < 0)
{
return;
}
if (ConfigHandler.MoveServerToGroup(config, lstSelecteds, groupIdSelected) == 0)
{
RefreshServers();
}
}
catch
{
}
}
#endregion #endregion
#region v2ray #region v2ray
@@ -720,11 +773,11 @@ namespace v2rayN.Forms
private void menuPingServer_Click(object sender, EventArgs e) private void menuPingServer_Click(object sender, EventArgs e)
{ {
Speedtest("ping"); Speedtest(ESpeedActionType.Ping);
} }
private void menuTcpingServer_Click(object sender, EventArgs e) private void menuTcpingServer_Click(object sender, EventArgs e)
{ {
Speedtest("tcping"); Speedtest(ESpeedActionType.Tcping);
} }
private void menuRealPingServer_Click(object sender, EventArgs e) private void menuRealPingServer_Click(object sender, EventArgs e)
@@ -737,7 +790,7 @@ namespace v2rayN.Forms
//UI.Show(UIRes.I18N("SpeedServerTips")); //UI.Show(UIRes.I18N("SpeedServerTips"));
Speedtest("realping"); Speedtest(ESpeedActionType.Realping);
} }
private void menuSpeedServer_Click(object sender, EventArgs e) private void menuSpeedServer_Click(object sender, EventArgs e)
@@ -750,13 +803,13 @@ namespace v2rayN.Forms
//UI.Show(UIRes.I18N("SpeedServerTips")); //UI.Show(UIRes.I18N("SpeedServerTips"));
Speedtest("speedtest"); Speedtest(ESpeedActionType.Speedtest);
} }
private void Speedtest(string actionType) private void Speedtest(ESpeedActionType actionType)
{ {
if (GetLvSelectedIndex() < 0) return; if (GetLvSelectedIndex() < 0) return;
ClearTestResult(); ClearTestResult();
SpeedtestHandler statistics = new SpeedtestHandler(ref config, ref v2rayHandler, lstSelecteds, actionType, UpdateSpeedtestHandler); SpeedtestHandler statistics = new SpeedtestHandler(ref config, v2rayHandler, lstSelecteds, actionType, UpdateSpeedtestHandler);
} }
private void tsbTestMe_Click(object sender, EventArgs e) private void tsbTestMe_Click(object sender, EventArgs e)
@@ -1280,7 +1333,9 @@ namespace v2rayN.Forms
item.Selected = true; item.Selected = true;
} }
} }
private void menuMoveToGroup_Click(object sender, EventArgs e)
{
}
#endregion #endregion
#region #region
@@ -1337,15 +1392,15 @@ namespace v2rayN.Forms
private void tsbCheckUpdateCore_Click(object sender, EventArgs e) private void tsbCheckUpdateCore_Click(object sender, EventArgs e)
{ {
CheckUpdateCore("v2fly"); CheckUpdateCore(ECoreType.v2fly);
} }
private void tsbCheckUpdateXrayCore_Click(object sender, EventArgs e) private void tsbCheckUpdateXrayCore_Click(object sender, EventArgs e)
{ {
CheckUpdateCore("xray"); CheckUpdateCore(ECoreType.Xray);
} }
private void CheckUpdateCore(string type) private void CheckUpdateCore(ECoreType type)
{ {
void _updateUI(bool success, string msg) void _updateUI(bool success, string msg)
{ {

View File

@@ -206,6 +206,12 @@
<data name="toolStripSeparator3.Size" type="System.Drawing.Size, System.Drawing"> <data name="toolStripSeparator3.Size" type="System.Drawing.Size, System.Drawing">
<value>352, 6</value> <value>352, 6</value>
</data> </data>
<data name="menuMoveToGroup.Size" type="System.Drawing.Size, System.Drawing">
<value>355, 22</value>
</data>
<data name="menuMoveToGroup.Text" xml:space="preserve">
<value>Move to Group</value>
</data>
<data name="menuMoveTop.Size" type="System.Drawing.Size, System.Drawing"> <data name="menuMoveTop.Size" type="System.Drawing.Size, System.Drawing">
<value>355, 22</value> <value>355, 22</value>
</data> </data>
@@ -302,8 +308,20 @@
<data name="menuExport2SubContent.Text" xml:space="preserve"> <data name="menuExport2SubContent.Text" xml:space="preserve">
<value>Export subscription (base64) share to clipboard</value> <value>Export subscription (base64) share to clipboard</value>
</data> </data>
<data name="tsbServer.ImageTransparentColor" type="System.Drawing.Color, System.Drawing">
<value>Magenta</value>
</data>
<data name="tsbServer.Size" type="System.Drawing.Size, System.Drawing">
<value>64, 53</value>
</data>
<data name="tsbServer.Text" xml:space="preserve">
<value>Servers</value>
</data>
<data name="tsbServer.TextImageRelation" type="System.Windows.Forms.TextImageRelation, System.Windows.Forms">
<value>ImageAboveText</value>
</data>
<data name="cmsLv.Size" type="System.Drawing.Size, System.Drawing"> <data name="cmsLv.Size" type="System.Drawing.Size, System.Drawing">
<value>356, 622</value> <value>356, 666</value>
</data> </data>
<data name="&gt;&gt;cmsLv.Name" xml:space="preserve"> <data name="&gt;&gt;cmsLv.Name" xml:space="preserve">
<value>cmsLv</value> <value>cmsLv</value>
@@ -452,18 +470,6 @@
<data name="&gt;&gt;scMain.ZOrder" xml:space="preserve"> <data name="&gt;&gt;scMain.ZOrder" xml:space="preserve">
<value>0</value> <value>0</value>
</data> </data>
<data name="tsbServer.ImageTransparentColor" type="System.Drawing.Color, System.Drawing">
<value>Magenta</value>
</data>
<data name="tsbServer.Size" type="System.Drawing.Size, System.Drawing">
<value>64, 53</value>
</data>
<data name="tsbServer.Text" xml:space="preserve">
<value>Servers</value>
</data>
<data name="tsbServer.TextImageRelation" type="System.Windows.Forms.TextImageRelation, System.Windows.Forms">
<value>ImageAboveText</value>
</data>
<data name="splitContainer1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms"> <data name="splitContainer1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value> <value>Fill</value>
</data> </data>
@@ -549,7 +555,7 @@
<value>Set message filters</value> <value>Set message filters</value>
</data> </data>
<data name="cmsMsgBox.Size" type="System.Drawing.Size, System.Drawing"> <data name="cmsMsgBox.Size" type="System.Drawing.Size, System.Drawing">
<value>228, 158</value> <value>228, 136</value>
</data> </data>
<data name="&gt;&gt;cmsMsgBox.Name" xml:space="preserve"> <data name="&gt;&gt;cmsMsgBox.Name" xml:space="preserve">
<value>cmsMsgBox</value> <value>cmsMsgBox</value>
@@ -1205,6 +1211,12 @@
<data name="&gt;&gt;toolStripSeparator3.Type" xml:space="preserve"> <data name="&gt;&gt;toolStripSeparator3.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data> </data>
<data name="&gt;&gt;menuMoveToGroup.Name" xml:space="preserve">
<value>menuMoveToGroup</value>
</data>
<data name="&gt;&gt;menuMoveToGroup.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;menuMoveTop.Name" xml:space="preserve"> <data name="&gt;&gt;menuMoveTop.Name" xml:space="preserve">
<value>menuMoveTop</value> <value>menuMoveTop</value>
</data> </data>

View File

@@ -573,4 +573,7 @@
<data name="tsbClose.Text" xml:space="preserve"> <data name="tsbClose.Text" xml:space="preserve">
<value> 关闭窗口 </value> <value> 关闭窗口 </value>
</data> </data>
<data name="menuMoveToGroup.Text" xml:space="preserve">
<value>移至分组</value>
</data>
</root> </root>

View File

@@ -54,6 +54,7 @@ namespace v2rayN.Forms
lvRoutings.View = View.Details; lvRoutings.View = View.Details;
lvRoutings.MultiSelect = true; lvRoutings.MultiSelect = true;
lvRoutings.HeaderStyle = ColumnHeaderStyle.Clickable; lvRoutings.HeaderStyle = ColumnHeaderStyle.Clickable;
lvRoutings.RegisterDragEvent(UpdateDragEventHandler);
lvRoutings.Columns.Add("", 30); lvRoutings.Columns.Add("", 30);
lvRoutings.Columns.Add("outboundTag", 80); lvRoutings.Columns.Add("outboundTag", 80);
@@ -66,6 +67,17 @@ namespace v2rayN.Forms
lvRoutings.EndUpdate(); lvRoutings.EndUpdate();
} }
private void UpdateDragEventHandler(int index, int targetIndex)
{
if (index < 0 || targetIndex < 0)
{
return;
}
if (ConfigHandler.MoveRoutingRule(ref routingItem, index, EMove.Position, targetIndex) == 0)
{
RefreshRoutingsView();
}
}
private void RefreshRoutingsView() private void RefreshRoutingsView()
{ {

View File

@@ -15,6 +15,7 @@ namespace v2rayN
public const string xrayCoreUrl = "https://github.com/XTLS/Xray-core/releases"; public const string xrayCoreUrl = "https://github.com/XTLS/Xray-core/releases";
public const string NUrl = @"https://github.com/2dust/v2rayN/releases"; public const string NUrl = @"https://github.com/2dust/v2rayN/releases";
public const string clashCoreUrl = "https://github.com/Dreamacro/clash/releases"; public const string clashCoreUrl = "https://github.com/Dreamacro/clash/releases";
public const string hysteriaCoreUrl = "https://github.com/HyNetwork/hysteria/releases";

View File

@@ -15,6 +15,7 @@ namespace v2rayN.Handler
class ConfigHandler class ConfigHandler
{ {
private static string configRes = Global.ConfigFileName; private static string configRes = Global.ConfigFileName;
private static object objLock = new object();
#region ConfigHandler #region ConfigHandler
@@ -203,9 +204,12 @@ namespace v2rayN.Handler
/// </summary> /// </summary>
/// <param name="config"></param> /// <param name="config"></param>
private static void ToJsonFile(Config config) private static void ToJsonFile(Config config)
{
lock (objLock)
{ {
Utils.ToJsonFile(config, Utils.GetPath(configRes)); Utils.ToJsonFile(config, Utils.GetPath(configRes));
} }
}
#endregion #endregion
@@ -353,7 +357,7 @@ namespace v2rayN.Handler
/// <param name="index"></param> /// <param name="index"></param>
/// <param name="eMove"></param> /// <param name="eMove"></param>
/// <returns></returns> /// <returns></returns>
public static int MoveServer(ref Config config, ref List<VmessItem> lstVmess, int index, EMove eMove) public static int MoveServer(ref Config config, ref List<VmessItem> lstVmess, int index, EMove eMove, int pos = -1)
{ {
int count = lstVmess.Count; int count = lstVmess.Count;
if (index < 0 || index > lstVmess.Count - 1) if (index < 0 || index > lstVmess.Count - 1)
@@ -409,6 +413,9 @@ namespace v2rayN.Handler
break; break;
} }
case EMove.Position:
lstVmess[index].sort = pos * 10 + 1;
break;
} }
ToJsonFile(config); ToJsonFile(config);
@@ -934,6 +941,15 @@ namespace v2rayN.Handler
vmessItem.address = fileName; vmessItem.address = fileName;
vmessItem.remarks = "clash_custom"; vmessItem.remarks = "clash_custom";
} }
//Is Other configuration
else
{
var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.txt");
File.WriteAllText(fileName, clipboardData);
vmessItem.address = fileName;
vmessItem.remarks = "other_custom";
}
if (!Utils.IsNullOrEmpty(subid)) if (!Utils.IsNullOrEmpty(subid))
{ {
@@ -1115,7 +1131,17 @@ namespace v2rayN.Handler
return 0; return 0;
} }
public static int MoveServerToGroup(Config config, List<VmessItem> indexs, string groupId)
{
foreach (var item in indexs)
{
item.groupId = groupId;
}
ToJsonFile(config);
return 0;
}
#endregion #endregion
#region UI #region UI
@@ -1248,7 +1274,7 @@ namespace v2rayN.Handler
/// <param name="index"></param> /// <param name="index"></param>
/// <param name="eMove"></param> /// <param name="eMove"></param>
/// <returns></returns> /// <returns></returns>
public static int MoveRoutingRule(ref RoutingItem routingItem, int index, EMove eMove) public static int MoveRoutingRule(ref RoutingItem routingItem, int index, EMove eMove, int pos = -1)
{ {
int count = routingItem.rules.Count; int count = routingItem.rules.Count;
if (index < 0 || index > routingItem.rules.Count - 1) if (index < 0 || index > routingItem.rules.Count - 1)
@@ -1306,6 +1332,14 @@ namespace v2rayN.Handler
break; break;
} }
case EMove.Position:
{
var removeItem = routingItem.rules[index];
var item = Utils.DeepCopy(routingItem.rules[index]);
routingItem.rules.Insert(pos, item);
routingItem.rules.Remove(removeItem);
break;
}
} }
return 0; return 0;

View File

@@ -9,6 +9,7 @@ namespace v2rayN.Handler
{ {
private static readonly Lazy<LazyConfig> _instance = new Lazy<LazyConfig>(() => new LazyConfig()); private static readonly Lazy<LazyConfig> _instance = new Lazy<LazyConfig>(() => new LazyConfig());
private Config _config; private Config _config;
private List<CoreInfo> coreInfos;
public static LazyConfig Instance public static LazyConfig Instance
{ {
@@ -51,5 +52,53 @@ namespace v2rayN.Handler
} }
return item.coreType; return item.coreType;
} }
public CoreInfo GetCoreInfo(ECoreType coreType)
{
if (coreInfos == null)
{
InitCoreInfo();
}
return coreInfos.Where(t => t.coreType == coreType).FirstOrDefault();
}
private void InitCoreInfo()
{
coreInfos = new List<CoreInfo>();
coreInfos.Add(new CoreInfo
{
coreType = ECoreType.v2fly,
coreExes = new List<string> { "wv2ray", "v2ray" },
arguments = "",
coreUrl = Global.v2flyCoreUrl
});
coreInfos.Add(new CoreInfo
{
coreType = ECoreType.Xray,
coreExes = new List<string> { "xray" },
arguments = "",
coreUrl = Global.xrayCoreUrl
});
coreInfos.Add(new CoreInfo
{
coreType = ECoreType.clash,
coreExes = new List<string> { "clash-windows-amd64", "clash-windows-386", "clash" },
arguments = "-f config.json",
coreUrl = Global.clashCoreUrl
});
coreInfos.Add(new CoreInfo
{
coreType = ECoreType.hysteria,
coreExes = new List<string> { "hysteria-tun-windows-6.0-amd64", "hysteria-tun-windows-6.0-386", "hysteria" },
arguments = "",
coreUrl = Global.hysteriaCoreUrl
});
}
} }
} }

View File

@@ -21,7 +21,7 @@ namespace v2rayN.Handler
_config = config; _config = config;
} }
public SpeedtestHandler(ref Config config, ref V2rayHandler v2rayHandler, List<VmessItem> selecteds, string actionType, Action<string, string> update) public SpeedtestHandler(ref Config config, V2rayHandler v2rayHandler, List<VmessItem> selecteds, ESpeedActionType actionType, Action<string, string> update)
{ {
_config = config; _config = config;
_v2rayHandler = v2rayHandler; _v2rayHandler = v2rayHandler;
@@ -40,19 +40,19 @@ namespace v2rayN.Handler
}); });
} }
if (actionType == "ping") if (actionType == ESpeedActionType.Ping)
{ {
Task.Run(() => RunPing()); Task.Run(() => RunPing());
} }
if (actionType == "tcping") else if (actionType == ESpeedActionType.Tcping)
{ {
Task.Run(() => RunTcping()); Task.Run(() => RunTcping());
} }
else if (actionType == "realping") else if (actionType == ESpeedActionType.Realping)
{ {
Task.Run(() => RunRealPing()); Task.Run(() => RunRealPing());
} }
else if (actionType == "speedtest") else if (actionType == ESpeedActionType.Speedtest)
{ {
Task.Run(() => RunSpeedTest()); Task.Run(() => RunSpeedTest());
} }

View File

@@ -104,11 +104,11 @@ namespace v2rayN.Handler
} }
}; };
_updateFunc(false, string.Format(UIRes.I18N("MsgStartUpdating"), "v2rayN")); _updateFunc(false, string.Format(UIRes.I18N("MsgStartUpdating"), "v2rayN"));
CheckUpdateAsync("v2rayN"); CheckUpdateAsync(ECoreType.v2rayN);
} }
public void CheckUpdateCore(string type, Config config, Action<bool, string> update) public void CheckUpdateCore(ECoreType type, Config config, Action<bool, string> update)
{ {
_config = config; _config = config;
_updateFunc = update; _updateFunc = update;
@@ -182,7 +182,7 @@ namespace v2rayN.Handler
string url = config.subItem[k - 1].url.TrimEx(); string url = config.subItem[k - 1].url.TrimEx();
string userAgent = config.subItem[k - 1].userAgent.TrimEx(); string userAgent = config.subItem[k - 1].userAgent.TrimEx();
string groupId = config.subItem[k - 1].groupId.TrimEx(); string groupId = config.subItem[k - 1].groupId.TrimEx();
string hashCode = $"{k}->"; string hashCode = $"{k}){config.subItem[k - 1].remarks}->";
if (config.subItem[k - 1].enabled == false) if (config.subItem[k - 1].enabled == false)
{ {
continue; continue;
@@ -292,7 +292,7 @@ namespace v2rayN.Handler
#region private #region private
private async void CheckUpdateAsync(string type) private async void CheckUpdateAsync(ECoreType type)
{ {
try try
{ {
@@ -310,15 +310,15 @@ namespace v2rayN.Handler
HttpClient httpClient = new HttpClient(webRequestHandler); HttpClient httpClient = new HttpClient(webRequestHandler);
string url; string url;
if (type == "v2fly") if (type == ECoreType.v2fly)
{ {
url = v2flyCoreLatestUrl; url = v2flyCoreLatestUrl;
} }
else if (type == "xray") else if (type == ECoreType.Xray)
{ {
url = xrayCoreLatestUrl; url = xrayCoreLatestUrl;
} }
else if (type == "v2rayN") else if (type == ECoreType.v2rayN)
{ {
url = nLatestUrl; url = nLatestUrl;
} }
@@ -347,18 +347,18 @@ namespace v2rayN.Handler
/// <summary> /// <summary>
/// 获取V2RayCore版本 /// 获取V2RayCore版本
/// </summary> /// </summary>
private string getCoreVersion(string type) private string getCoreVersion(ECoreType type)
{ {
try try
{ {
var core = string.Empty; var core = string.Empty;
var match = string.Empty; var match = string.Empty;
if (type == "v2fly") if (type == ECoreType.v2fly)
{ {
core = "v2ray.exe"; core = "v2ray.exe";
match = "V2Ray"; match = "V2Ray";
} }
else if (type == "xray") else if (type == ECoreType.Xray)
{ {
core = "xray.exe"; core = "xray.exe";
match = "Xray"; match = "Xray";
@@ -392,7 +392,7 @@ namespace v2rayN.Handler
return ""; return "";
} }
} }
private void responseHandler(string type, string redirectUrl) private void responseHandler(ECoreType type, string redirectUrl)
{ {
try try
{ {
@@ -401,21 +401,21 @@ namespace v2rayN.Handler
string curVersion; string curVersion;
string message; string message;
string url; string url;
if (type == "v2fly") if (type == ECoreType.v2fly)
{ {
curVersion = "v" + getCoreVersion(type); curVersion = "v" + getCoreVersion(type);
message = string.Format(UIRes.I18N("IsLatestCore"), curVersion); message = string.Format(UIRes.I18N("IsLatestCore"), curVersion);
string osBit = Environment.Is64BitProcess ? "64" : "32"; string osBit = Environment.Is64BitProcess ? "64" : "32";
url = string.Format(v2flyCoreUrl, version, osBit); url = string.Format(v2flyCoreUrl, version, osBit);
} }
else if (type == "xray") else if (type == ECoreType.Xray)
{ {
curVersion = "v" + getCoreVersion(type); curVersion = "v" + getCoreVersion(type);
message = string.Format(UIRes.I18N("IsLatestCore"), curVersion); message = string.Format(UIRes.I18N("IsLatestCore"), curVersion);
string osBit = Environment.Is64BitProcess ? "64" : "32"; string osBit = Environment.Is64BitProcess ? "64" : "32";
url = string.Format(xrayCoreUrl, version, osBit); url = string.Format(xrayCoreUrl, version, osBit);
} }
else if (type == "v2rayN") else if (type == ECoreType.v2rayN)
{ {
curVersion = FileVersionInfo.GetVersionInfo(Utils.GetExePath()).FileVersion.ToString(); curVersion = FileVersionInfo.GetVersionInfo(Utils.GetExePath()).FileVersion.ToString();
message = string.Format(UIRes.I18N("IsLatestN"), curVersion); message = string.Format(UIRes.I18N("IsLatestN"), curVersion);

View File

@@ -168,6 +168,7 @@ namespace v2rayN.Handler
inbound2.protocol = Global.InboundHttp; inbound2.protocol = Global.InboundHttp;
inbound2.listen = inbound.listen; inbound2.listen = inbound.listen;
inbound2.settings.allowTransparent = false; inbound2.settings.allowTransparent = false;
inbound2.sniffing.enabled = inbound.sniffing.enabled;
} }
catch catch
{ {
@@ -921,10 +922,33 @@ namespace v2rayN.Handler
} }
File.Copy(addressFileName, fileName); File.Copy(addressFileName, fileName);
//check again
if (!File.Exists(fileName))
{
msg = UIRes.I18N("FailedGenDefaultConfiguration");
return -1;
}
//overwrite port
var fileContent = File.ReadAllLines(fileName).ToList();
var coreType = LazyConfig.Instance.GetCoreType(node, node.configType);
switch (coreType)
{
case ECoreType.v2fly:
case ECoreType.Xray:
break;
case ECoreType.clash:
fileContent.Add($"port: {LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundHttp)}");
fileContent.Add($"socks-port: {LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundSocks)}");
break;
}
File.WriteAllLines(fileName, fileContent);
msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), $"[{LazyConfig.Instance.GetConfig().GetGroupRemarks(node.groupId)}] {node.GetSummary()}"); msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), $"[{LazyConfig.Instance.GetConfig().GetGroupRemarks(node.groupId)}] {node.GetSummary()}");
} }
catch catch (Exception ex)
{ {
Utils.SaveLog("GenerateClientCustomConfig", ex);
msg = UIRes.I18N("FailedGenDefaultConfiguration"); msg = UIRes.I18N("FailedGenDefaultConfiguration");
return -1; return -1;
} }

View File

@@ -21,9 +21,7 @@ namespace v2rayN.Handler
class V2rayHandler class V2rayHandler
{ {
private static string v2rayConfigRes = Global.v2rayConfigFileName; private static string v2rayConfigRes = Global.v2rayConfigFileName;
private List<string> lstV2ray; private CoreInfo coreInfo;
private string coreUrl;
private string coreArguments;
public event ProcessDelegate ProcessEvent; public event ProcessDelegate ProcessEvent;
//private int processId = 0; //private int processId = 0;
private Process _process; private Process _process;
@@ -46,7 +44,11 @@ namespace v2rayN.Handler
return; return;
} }
SetCore(config, item); if (SetCore(config, item) != 0)
{
ShowMsg(false, UIRes.I18N("CheckServerSettings"));
return;
}
string fileName = Utils.GetPath(v2rayConfigRes); string fileName = Utils.GetPath(v2rayConfigRes);
if (V2rayConfigHandler.GenerateClientConfig(item, fileName, false, out string msg) != 0) if (V2rayConfigHandler.GenerateClientConfig(item, fileName, false, out string msg) != 0)
{ {
@@ -106,7 +108,7 @@ namespace v2rayN.Handler
} }
else else
{ {
foreach (string vName in lstV2ray) foreach (string vName in coreInfo.coreExes)
{ {
Process[] existing = Process.GetProcessesByName(vName); Process[] existing = Process.GetProcessesByName(vName);
foreach (Process p in existing) foreach (Process p in existing)
@@ -163,12 +165,10 @@ namespace v2rayN.Handler
} }
} }
private string V2rayFindexe() private string V2rayFindexe(List<string> lstCoreTemp)
{ {
//查找v2ray文件是否存在
string fileName = string.Empty; string fileName = string.Empty;
//lstV2ray.Reverse(); foreach (string name in lstCoreTemp)
foreach (string name in lstV2ray)
{ {
string vName = string.Format("{0}.exe", name); string vName = string.Format("{0}.exe", name);
vName = Utils.GetPath(vName); vName = Utils.GetPath(vName);
@@ -180,7 +180,7 @@ namespace v2rayN.Handler
} }
if (Utils.IsNullOrEmpty(fileName)) if (Utils.IsNullOrEmpty(fileName))
{ {
string msg = string.Format(UIRes.I18N("NotFoundCore"), coreUrl); string msg = string.Format(UIRes.I18N("NotFoundCore"), coreInfo.coreUrl);
ShowMsg(false, msg); ShowMsg(false, msg);
} }
return fileName; return fileName;
@@ -195,7 +195,7 @@ namespace v2rayN.Handler
try try
{ {
string fileName = V2rayFindexe(); string fileName = V2rayFindexe(coreInfo.coreExes);
if (fileName == "") return; if (fileName == "") return;
Process p = new Process Process p = new Process
@@ -203,7 +203,7 @@ namespace v2rayN.Handler
StartInfo = new ProcessStartInfo StartInfo = new ProcessStartInfo
{ {
FileName = fileName, FileName = fileName,
Arguments = coreArguments, Arguments = coreInfo.arguments,
WorkingDirectory = Utils.StartupPath(), WorkingDirectory = Utils.StartupPath(),
UseShellExecute = false, UseShellExecute = false,
RedirectStandardOutput = true, RedirectStandardOutput = true,
@@ -249,7 +249,7 @@ namespace v2rayN.Handler
try try
{ {
string fileName = V2rayFindexe(); string fileName = V2rayFindexe(new List<string> { "xray" });
if (fileName == "") return -1; if (fileName == "") return -1;
Process p = new Process Process p = new Process
@@ -326,44 +326,21 @@ namespace v2rayN.Handler
} }
} }
private void SetCore(Config config, VmessItem item) private int SetCore(Config config, VmessItem item)
{ {
if (item == null) if (item == null)
{ {
return; return -1;
} }
var coreType = LazyConfig.Instance.GetCoreType(item, item.configType); var coreType = LazyConfig.Instance.GetCoreType(item, item.configType);
if (coreType == ECoreType.v2fly) coreInfo = LazyConfig.Instance.GetCoreInfo(coreType);
if (coreInfo == null)
{ {
lstV2ray = new List<string> return -1;
{
"wv2ray",
"v2ray"
};
coreUrl = Global.v2flyCoreUrl;
coreArguments = string.Empty;
}
else if (coreType == ECoreType.Xray)
{
lstV2ray = new List<string>
{
"xray"
};
coreUrl = Global.xrayCoreUrl;
coreArguments = string.Empty;
}
else if (coreType == ECoreType.clash)
{
lstV2ray = new List<string>
{
"clash-windows-amd64",
"clash-windows-386",
"clash"
};
coreUrl = Global.clashCoreUrl;
coreArguments = "-f config.json";
} }
return 0;
} }
} }
} }

View File

@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
namespace v2rayN.Mode
{
[Serializable]
public class CoreInfo
{
public ECoreType coreType { get; set; }
public List<string> coreExes { get; set; }
public string arguments { get; set; }
public string coreUrl { get; set; }
}
}

View File

@@ -5,6 +5,8 @@ namespace v2rayN.Mode
{ {
v2fly = 1, v2fly = 1,
Xray = 2, Xray = 2,
clash = 3 clash = 11,
hysteria = 21,
v2rayN = 99
} }
} }

View File

@@ -6,6 +6,7 @@ namespace v2rayN.Mode
Top = 1, Top = 1,
Up = 2, Up = 2,
Down = 3, Down = 3,
Bottom = 4 Bottom = 4,
Position = 5
} }
} }

View File

@@ -0,0 +1,11 @@

namespace v2rayN.Mode
{
public enum ESpeedActionType
{
Ping,
Tcping,
Realping,
Speedtest
}
}

View File

@@ -32,4 +32,4 @@ using System.Runtime.InteropServices;
// 方法是按如下所示使用“*”: // 方法是按如下所示使用“*”:
//[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.*")]
//[assembly: AssemblyVersion("1.0.0")] //[assembly: AssemblyVersion("1.0.0")]
[assembly: AssemblyFileVersion("5.5")] [assembly: AssemblyFileVersion("5.8")]

View File

@@ -199,6 +199,7 @@
<SubType>Component</SubType> <SubType>Component</SubType>
</Compile> </Compile>
<Compile Include="Handler\SysProxyHandle.cs" /> <Compile Include="Handler\SysProxyHandle.cs" />
<Compile Include="Mode\ESpeedActionType.cs" />
<Compile Include="Mode\EGlobalHotkey.cs" /> <Compile Include="Mode\EGlobalHotkey.cs" />
<Compile Include="Mode\ECoreType.cs" /> <Compile Include="Mode\ECoreType.cs" />
<Compile Include="Mode\ESysProxyType.cs" /> <Compile Include="Mode\ESysProxyType.cs" />
@@ -207,6 +208,7 @@
<Compile Include="Mode\RoutingItem.cs" /> <Compile Include="Mode\RoutingItem.cs" />
<Compile Include="Mode\RulesItem.cs" /> <Compile Include="Mode\RulesItem.cs" />
<Compile Include="Mode\ServerStatistics.cs" /> <Compile Include="Mode\ServerStatistics.cs" />
<Compile Include="Mode\CoreInfo.cs" />
<Compile Include="Mode\SysproxyConfig.cs" /> <Compile Include="Mode\SysproxyConfig.cs" />
<Compile Include="Mode\EConfigType.cs" /> <Compile Include="Mode\EConfigType.cs" />
<Compile Include="Mode\ServerTestItem.cs" /> <Compile Include="Mode\ServerTestItem.cs" />