using linker.libs.api;
using linker.libs.extends;
using System.Net;
using linker.libs;
using linker.tunnel.connection;
using System.Collections.Concurrent;
using linker.messenger.signin;
using linker.messenger.forward.proxy;
using linker.messenger.api;
namespace linker.messenger.forward
{
public sealed class ForwardApiController : IApiController
{
private readonly ForwardTransfer forwardTransfer;
private readonly ForwardProxy forwardProxy;
private readonly IMessengerSender messengerSender;
private readonly SignInClientState signInClientState;
private readonly IAccessStore accessStore;
private readonly ISignInClientStore signInClientStore;
private readonly ForwardDecenter forwardDecenter;
private readonly ISerializer serializer;
public ForwardApiController(ForwardTransfer forwardTransfer, ForwardProxy forwardProxy, IMessengerSender messengerSender, SignInClientState signInClientState, IAccessStore accessStore, ISignInClientStore signInClientStore, ForwardDecenter forwardDecenter, ISerializer serializer)
{
this.forwardTransfer = forwardTransfer;
this.forwardProxy = forwardProxy;
this.messengerSender = messengerSender;
this.signInClientState = signInClientState;
this.accessStore = accessStore;
this.signInClientStore = signInClientStore;
this.forwardDecenter = forwardDecenter;
this.serializer = serializer;
}
public ConnectionListInfo Connections(ApiControllerParamsInfo param)
{
ulong hashCode = ulong.Parse(param.Content);
if (forwardProxy.Version.Eq(hashCode, out ulong version) == false)
{
return new ConnectionListInfo
{
List = forwardProxy.GetConnections(),
HashCode = version
};
}
return new ConnectionListInfo { HashCode = version };
}
[Access(AccessValue.TunnelRemove)]
public void RemoveConnection(ApiControllerParamsInfo param)
{
forwardProxy.RemoveConnection(param.Content);
}
public IPAddress[] BindIPs(ApiControllerParamsInfo param)
{
return NetworkHelper.GetIPV4();
}
public void Refresh(ApiControllerParamsInfo param)
{
forwardDecenter.Refresh();
}
public ForwardListInfo GetCount(ApiControllerParamsInfo param)
{
ulong hashCode = ulong.Parse(param.Content);
if (forwardDecenter.DataVersion.Eq(hashCode, out ulong version) == false)
{
return new ForwardListInfo
{
List = forwardDecenter.CountDic,
HashCode = version
};
}
return new ForwardListInfo { HashCode = version };
}
///
/// 获取列表
///
///
///
public async Task> Get(ApiControllerParamsInfo param)
{
if (param.Content == signInClientStore.Id)
{
if (accessStore.HasAccess(AccessValue.ForwardShowSelf) == false) return new List();
return forwardTransfer.Get();
}
if (accessStore.HasAccess(AccessValue.ForwardShowOther) == false) return new List();
var resp = await messengerSender.SendReply(new MessageRequestWrap
{
Connection = signInClientState.Connection,
MessengerId = (ushort)ForwardMessengerIds.GetForward,
Payload = serializer.Serialize(param.Content)
});
if (resp.Code == MessageResponeCodes.OK)
{
return serializer.Deserialize>(resp.Data.Span);
}
return new List();
}
///
/// 添加
///
///
///
public async Task Add(ApiControllerParamsInfo param)
{
ForwardAddForwardInfo info = param.Content.DeJson();
if (info.MachineId == signInClientStore.Id)
{
if (accessStore.HasAccess(AccessValue.ForwardSelf) == false) return false;
return forwardTransfer.Add(info.Data);
}
if (accessStore.HasAccess(AccessValue.ForwardOther) == false) return false;
return await messengerSender.SendOnly(new MessageRequestWrap
{
Connection = signInClientState.Connection,
MessengerId = (ushort)ForwardMessengerIds.AddClientForward,
Payload = serializer.Serialize(info)
});
}
///
/// 删除
///
///
///
public async Task Remove(ApiControllerParamsInfo param)
{
ForwardRemoveForwardInfo info = param.Content.DeJson();
if (info.MachineId == signInClientStore.Id)
{
if (accessStore.HasAccess(AccessValue.ForwardSelf) == false) return false;
return forwardTransfer.Remove(info.Id);
}
if (accessStore.HasAccess(AccessValue.ForwardOther) == false) return false;
return await messengerSender.SendOnly(new MessageRequestWrap
{
Connection = signInClientState.Connection,
MessengerId = (ushort)ForwardMessengerIds.RemoveClientForward,
Payload = serializer.Serialize(info)
});
}
///
/// 检测
///
///
///
public async Task Test(ApiControllerParamsInfo param)
{
if (param.Content == signInClientStore.Id)
{
forwardTransfer.SubscribeTest();
return true;
}
await messengerSender.SendOnly(new MessageRequestWrap
{
Connection = signInClientState.Connection,
MessengerId = (ushort)ForwardMessengerIds.TestClientForward,
Payload = serializer.Serialize(param.Content)
});
return true;
}
}
public sealed class ForwardListInfo
{
public ConcurrentDictionary List { get; set; }
public ulong HashCode { get; set; }
}
public sealed class ConnectionListInfo
{
public ConcurrentDictionary List { get; set; }
public ulong HashCode { get; set; }
}
}