diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index bf61cc5b..e3992473 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -390,6 +390,11 @@ namespace v2rayN.Forms bool asc = Utils.IsNullOrEmpty(tag) ? true : !Convert.ToBoolean(tag); if (ConfigHandler.SortServers(ref config, (EServerColName)e.Column, asc) != 0) { + ConfigHandler.SortByStat(ref config, statistics.Statistic, (EServerColName) e.Column, asc); + + lvServers.Columns[e.Column].Tag = Convert.ToString(asc); + RefreshServers(); + return; } lvServers.Columns[e.Column].Tag = Convert.ToString(asc); diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index fefad821..b2ae71e3 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -960,5 +960,53 @@ namespace v2rayN.Handler ToJsonFile(config); return 0; } + + public static void SortByStat(ref Config config, List statistic, EServerColName col, bool asc) + { + Comparison comparison = delegate(VmessItem x, VmessItem y) + { + ServerStatItem sItemA = statistic.Find(item_ => item_.itemId == x.getItemId()); + ServerStatItem sItemB = statistic.Find(item_ => item_.itemId == y.getItemId()); + ulong vala = 0; + ulong valb = 0; + + var i4 = (asc ? 1 : -1); + + switch (col) + { + case EServerColName.todayDown: + if (sItemA != null) vala = sItemA.todayDown; + if (sItemB != null) valb = sItemB.todayDown; + break; + case EServerColName.todayUp: + if (sItemA != null) vala = sItemA.todayUp; + if (sItemB != null) valb = sItemB.todayUp; + break; + case EServerColName.totalDown: + if (sItemA != null) vala = sItemA.totalDown; + if (sItemB != null) valb = sItemB.totalDown; + break; + case EServerColName.totalUp: + if (sItemA != null) vala = sItemA.totalUp; + if (sItemB != null) valb = sItemB.totalUp; + break; + } + + return (int) (vala - valb) * i4; + }; + if (config.vmess.Count > 0) + { + string itemId = config.getItemId(); + config.vmess.Sort(comparison); + + var index_ = config.vmess.FindIndex(it => it.getItemId() == itemId); + if (index_ >= 0) + { + config.index = index_; + } + + ToJsonFile(config); + } + } } }