using System;
using System.Threading.Tasks;
using Netch.Utils;
using Newtonsoft.Json;
namespace Netch.Models
{
public class Server : ICloneable
{
///
/// 延迟
///
[JsonIgnore]
public int Delay = -1;
///
/// 组
///
public string Group = "None";
///
/// 地址
///
public string Hostname;
///
/// 端口
///
public ushort Port;
///
/// 倍率
///
public double Rate = 1.0;
///
/// 备注
///
public string Remark;
///
/// 代理类型
///
public string Type;
public object Clone()
{
return MemberwiseClone();
}
///
/// 获取备注
///
/// 备注
public override string ToString()
{
var remark = string.IsNullOrWhiteSpace(Remark) ? $"{Hostname}:{Port}" : Remark;
if (Group.Equals("None") || Group.Equals(""))
Group = "NONE";
return $"[{ServerHelper.GetUtilByTypeName(Type)?.ShortName ?? "WTF"}][{Group}] {remark}";
}
///
/// 测试延迟
///
/// 延迟
public int Test()
{
try
{
var destination = DNS.Lookup(Hostname);
if (destination == null)
return Delay = -2;
var list = new Task[3];
for (var i = 0; i < 3; i++)
list[i] = Task.Run(async () =>
{
try
{
return Global.Settings.ServerTCPing
? await Utils.Utils.TCPingAsync(destination, Port)
: Utils.Utils.ICMPing(destination, Port);
}
catch (Exception)
{
return -4;
}
});
Task.WaitAll(list[0], list[1], list[2]);
var min = Math.Min(list[0].Result, list[1].Result);
min = Math.Min(min, list[2].Result);
return Delay = min;
}
catch (Exception)
{
return Delay = -4;
}
}
}
public static class ServerExtension
{
public static string AutoResolveHostname(this Server server)
{
return Global.Settings.ResolveServerHostname ? DNS.Lookup(server.Hostname).ToString() : server.Hostname;
}
}
}