using linker.libs.api;
using linker.libs.extends;
using System.Collections.Concurrent;
using linker.tunnel.connection;
using linker.messenger.signin;
using linker.libs;
namespace linker.messenger.socks5
{
public sealed class Socks5ClientApiController : IApiController
{
private readonly IMessengerSender messengerSender;
private readonly Socks5Transfer socks5Transfer;
private readonly SignInClientState signInClientState;
private readonly TunnelProxy tunnelProxy;
private readonly ISignInClientStore signInClientStore;
private readonly Socks5Decenter socks5Decenter;
private readonly ISerializer serializer;
public Socks5ClientApiController(IMessengerSender messengerSender, SignInClientState signInClientState, TunnelProxy tunnelProxy, Socks5Transfer socks5Transfer, ISignInClientStore signInClientStore, Socks5Decenter socks5Decenter, ISerializer serializer)
{
this.messengerSender = messengerSender;
this.socks5Transfer = socks5Transfer;
this.signInClientState = signInClientState;
this.tunnelProxy = tunnelProxy;
this.signInClientStore = signInClientStore;
this.socks5Decenter = socks5Decenter;
this.serializer = serializer;
}
public ConnectionListInfo Connections(ApiControllerParamsInfo param)
{
ulong hashCode = ulong.Parse(param.Content);
if (tunnelProxy.Version.Eq(hashCode, out ulong version) == false)
{
return new ConnectionListInfo
{
List = tunnelProxy.GetConnections(),
HashCode = version
};
}
return new ConnectionListInfo { HashCode = version };
}
public void RemoveConnection(ApiControllerParamsInfo param)
{
tunnelProxy.RemoveConnection(param.Content);
}
///
/// 获取所有客户端的信息
///
///
///
public Socks5ListInfo Get(ApiControllerParamsInfo param)
{
ulong hashCode = ulong.Parse(param.Content);
if (socks5Decenter.DataVersion.Eq(hashCode, out ulong version) == false)
{
return new Socks5ListInfo
{
List = socks5Decenter.Infos,
HashCode = version
};
}
return new Socks5ListInfo { HashCode = version };
}
///
/// 刷新信息
///
///
public void Refresh(ApiControllerParamsInfo param)
{
socks5Decenter.Refresh();
}
///
/// 运行网卡
///
///
///
public async Task Run(ApiControllerParamsInfo param)
{
//运行自己的
if (param.Content == signInClientStore.Id)
{
socks5Transfer.Retstart();
}
else
{
//运行别人的
await messengerSender.SendOnly(new MessageRequestWrap
{
Connection = signInClientState.Connection,
MessengerId = (ushort)Socks5MessengerIds.RunForward,
Payload = serializer.Serialize(param.Content)
}).ConfigureAwait(false);
}
return true;
}
///
/// 停止网卡
///
///
///
public async Task Stop(ApiControllerParamsInfo param)
{
//停止自己的
if (param.Content == signInClientStore.Id)
{
socks5Transfer.Stop();
}
else
{
//停止别人的
await messengerSender.SendOnly(new MessageRequestWrap
{
Connection = signInClientState.Connection,
MessengerId = (ushort)Socks5MessengerIds.StopForward,
Payload = serializer.Serialize(param.Content)
}).ConfigureAwait(false);
}
return true;
}
///
/// 更新网卡信息
///
///
///
public async Task Update(ApiControllerParamsInfo param)
{
Socks5Info info = param.Content.DeJson();
//更新自己的
if (info.MachineId == signInClientStore.Id)
{
socks5Transfer.UpdateConfig(info);
}
else
{
//更新别人的
await messengerSender.SendOnly(new MessageRequestWrap
{
Connection = signInClientState.Connection,
MessengerId = (ushort)Socks5MessengerIds.UpdateForward,
Payload = serializer.Serialize(info)
}).ConfigureAwait(false);
}
return true;
}
}
public sealed class Socks5ListInfo
{
public ConcurrentDictionary List { get; set; }
public ulong HashCode { get; set; }
}
public sealed class ConnectionListInfo
{
public ConcurrentDictionary List { get; set; }
public ulong HashCode { get; set; }
}
}