diff --git a/readme/Demo/Controller/Api.php b/readme/Demo/Controller/Api.php new file mode 100644 index 00000000..23e00553 --- /dev/null +++ b/readme/Demo/Controller/Api.php @@ -0,0 +1,57 @@ +where("status", 1)->get(); + foreach($list as $item) + { + try{ + $delivery_message = json_decode($item["delivery_message"],true); + $commodity_id = $item["id"]; + $count = Card::query()->where("commodity_id", (int)$commodity_id)->where("status", 0)->count(); + if($count < $num) + { + for($i = 0; $i < $num; $i++) + { + $cardObj = new \App\Model\Card(); + $cardObj->commodity_id = $commodity_id; + $cardObj->owner = 0; + $cardObj->secret = json_encode($delivery_message,JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); + $cardObj->create_time = Date::current(); + $cardObj->save(); + } + } + }catch(\Exception $e){ + } + } + + return "ok"; + } + +} \ No newline at end of file diff --git a/readme/acg-faka-plugin-Demo.zip b/readme/acg-faka-plugin-Demo.zip deleted file mode 100644 index 02ef66e3..00000000 Binary files a/readme/acg-faka-plugin-Demo.zip and /dev/null differ diff --git a/readme/logo.png b/readme/logo.png index 6f42c567..dc0e760c 100644 Binary files a/readme/logo.png and b/readme/logo.png differ diff --git a/src/linker.doc.web/static/img/favicon.ico b/src/linker.doc.web/static/img/favicon.ico index 8103458a..2a0e4e36 100644 Binary files a/src/linker.doc.web/static/img/favicon.ico and b/src/linker.doc.web/static/img/favicon.ico differ diff --git a/src/linker.doc.web/static/img/logo.png b/src/linker.doc.web/static/img/logo.png index 6f42c567..dc0e760c 100644 Binary files a/src/linker.doc.web/static/img/logo.png and b/src/linker.doc.web/static/img/logo.png differ diff --git a/src/linker.ics/favicon.ico b/src/linker.ics/favicon.ico index 8103458a..2a0e4e36 100644 Binary files a/src/linker.ics/favicon.ico and b/src/linker.ics/favicon.ico differ diff --git a/src/linker.messenger.relay/client/RelayApiController.cs b/src/linker.messenger.relay/client/RelayApiController.cs index bc79e216..a0d0b8f6 100644 --- a/src/linker.messenger.relay/client/RelayApiController.cs +++ b/src/linker.messenger.relay/client/RelayApiController.cs @@ -162,7 +162,7 @@ namespace linker.messenger.relay return new RelayServerCdkeyTestResultInfo(); } - public async Task ImportCdkey(ApiControllerParamsInfo param) + public async Task ImportCdkey(ApiControllerParamsInfo param) { RelayServerCdkeyImportInfo info = param.Content.DeJson(); info.SecretKey = relayClientStore.Server.SecretKey; @@ -173,6 +173,25 @@ namespace linker.messenger.relay MessengerId = (ushort)RelayMessengerIds.ImportCdkey, Payload = serializer.Serialize(info) }); + if (resp.Code == MessageResponeCodes.OK) + { + return serializer.Deserialize(resp.Data.Span); + } + return "Network"; + } + public async Task UpdateNode(ApiControllerParamsInfo param) + { + RelayServerNodeUpdateInfo info = param.Content.DeJson(); + var resp = await messengerSender.SendReply(new MessageRequestWrap + { + Connection = signInClientState.Connection, + MessengerId = (ushort)RelayMessengerIds.UpdateNodeForward, + Payload = serializer.Serialize(new RelayServerNodeUpdateWrapInfo + { + Info = info, + SecretKey = relayClientStore.Server.SecretKey + }) + }); return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray); } } diff --git a/src/linker.messenger.relay/client/RelayClientTestTransfer.cs b/src/linker.messenger.relay/client/RelayClientTestTransfer.cs index 4b653240..acbadfd1 100644 --- a/src/linker.messenger.relay/client/RelayClientTestTransfer.cs +++ b/src/linker.messenger.relay/client/RelayClientTestTransfer.cs @@ -43,7 +43,7 @@ namespace linker.messenger.relay IRelayClientTransport transport = relayTransfer.Transports.FirstOrDefault(d => d.Type == relayClientStore.Server.RelayType); if (transport != null) { - Nodes = await transport.RelayTestAsync(new RelayTestInfo + Nodes = await transport.RelayTestAsync(new RelayTestInfo170 { MachineId = signInClientStore.Id, SecretKey = relayClientStore.Server.SecretKey, diff --git a/src/linker.messenger.relay/client/RelayClientTransfer.cs b/src/linker.messenger.relay/client/RelayClientTransfer.cs index 82120fb6..3540464c 100644 --- a/src/linker.messenger.relay/client/RelayClientTransfer.cs +++ b/src/linker.messenger.relay/client/RelayClientTransfer.cs @@ -78,7 +78,7 @@ namespace linker.messenger.relay.client return null; } - transport.RelayInfo relayInfo = new transport.RelayInfo + transport.RelayInfo170 relayInfo = new transport.RelayInfo170 { FlowingId = 0, FromMachineId = fromMachineId, @@ -126,7 +126,7 @@ namespace linker.messenger.relay.client /// /// /// - public async Task OnBeginAsync(transport.RelayInfo relayInfo) + public async Task OnBeginAsync(transport.RelayInfo170 relayInfo) { if (connectingDic.TryAdd(relayInfo.FromMachineId, true) == false) { @@ -173,7 +173,7 @@ namespace linker.messenger.relay.client /// /// /// - private void ConnectedCallback(transport.RelayInfo relayInfo, ITunnelConnection connection) + private void ConnectedCallback(transport.RelayInfo170 relayInfo, ITunnelConnection connection) { if (OnConnected.TryGetValue(Helper.GlobalString, out List> callbacks)) { diff --git a/src/linker.messenger.relay/client/transport/IRelayClientTransport.cs b/src/linker.messenger.relay/client/transport/IRelayClientTransport.cs index 8e0872a4..051efece 100644 --- a/src/linker.messenger.relay/client/transport/IRelayClientTransport.cs +++ b/src/linker.messenger.relay/client/transport/IRelayClientTransport.cs @@ -34,37 +34,51 @@ namespace linker.messenger.relay.client.transport /// /// /// - public Task RelayAsync(RelayInfo relayInfo); + public Task RelayAsync(RelayInfo170 relayInfo); /// /// 收到别人的中继请求 /// /// /// - public Task OnBeginAsync(RelayInfo relayInfo, Action callback); + public Task OnBeginAsync(RelayInfo170 relayInfo, Action callback); /// /// 测试一下中继通不通 /// /// /// - public Task> RelayTestAsync(RelayTestInfo relayTestInfo); + public Task> RelayTestAsync(RelayTestInfo170 relayTestInfo); } /// /// 中继测试 /// - public sealed partial class RelayTestInfo + public partial class RelayTestInfo { public string MachineId { get; set; } public string SecretKey { get; set; } public IPEndPoint Server { get; set; } + } + public sealed partial class RelayTestInfo170: RelayTestInfo + { + /// + /// UserId + /// public string UserId { get; set; } } + + public partial class RelayInfo170 : RelayInfo + { + /// + /// UserId + /// + public string UserId { get; set; } + } /// /// 中继交换数据 /// - public sealed partial class RelayInfo + public partial class RelayInfo { /// /// 自己的id @@ -114,10 +128,7 @@ namespace linker.messenger.relay.client.transport /// public bool SSL { get; set; } = true; - /// - /// UserId - /// - public string UserId { get; set; } + } diff --git a/src/linker.messenger.relay/client/transport/RelayClientTransportSelfHost.cs b/src/linker.messenger.relay/client/transport/RelayClientTransportSelfHost.cs index c64a81c4..3405dde7 100644 --- a/src/linker.messenger.relay/client/transport/RelayClientTransportSelfHost.cs +++ b/src/linker.messenger.relay/client/transport/RelayClientTransportSelfHost.cs @@ -38,7 +38,7 @@ namespace linker.messenger.relay.client.transport this.messengerStore = messengerStore; } - public async Task RelayAsync(RelayInfo relayInfo) + public async Task RelayAsync(RelayInfo170 relayInfo) { byte[] buffer = ArrayPool.Shared.Rent(1024); try @@ -119,12 +119,12 @@ namespace linker.messenger.relay.client.transport return null; } - private async Task RelayAsk(RelayInfo relayInfo) + private async Task RelayAsk(RelayInfo170 relayInfo) { MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap { Connection = signInClientState.Connection, - MessengerId = (ushort)RelayMessengerIds.RelayAsk, + MessengerId = (ushort)RelayMessengerIds.RelayAsk170, Payload = serializer.Serialize(relayInfo), Timeout = 2000 }).ConfigureAwait(false); @@ -138,7 +138,7 @@ namespace linker.messenger.relay.client.transport return result; } - private async Task ConnectNodeServer(RelayInfo relayInfo, List nodes) + private async Task ConnectNodeServer(RelayInfo170 relayInfo, List nodes) { byte[] buffer = ArrayPool.Shared.Rent(1 * 1024); @@ -211,13 +211,13 @@ namespace linker.messenger.relay.client.transport } return null; } - private async Task RelayConfirm(RelayInfo relayInfo) + private async Task RelayConfirm(RelayInfo170 relayInfo) { //通知对方去确认中继 var resp = await messengerSender.SendReply(new MessageRequestWrap { Connection = signInClientState.Connection, - MessengerId = (ushort)RelayMessengerIds.RelayForward, + MessengerId = (ushort)RelayMessengerIds.RelayForward170, Payload = serializer.Serialize(relayInfo), }); return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray); @@ -228,7 +228,7 @@ namespace linker.messenger.relay.client.transport { return true; } - public async Task OnBeginAsync(RelayInfo relayInfo, Action callback) + public async Task OnBeginAsync(RelayInfo170 relayInfo, Action callback) { try { @@ -267,7 +267,7 @@ namespace linker.messenger.relay.client.transport return false; } - private async Task WaitSSL(Socket socket, RelayInfo relayInfo) + private async Task WaitSSL(Socket socket, RelayInfo170 relayInfo) { try { @@ -306,14 +306,14 @@ namespace linker.messenger.relay.client.transport return null; } - public async Task> RelayTestAsync(RelayTestInfo relayTestInfo) + public async Task> RelayTestAsync(RelayTestInfo170 relayTestInfo) { try { MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap { Connection = signInClientState.Connection, - MessengerId = (ushort)RelayMessengerIds.RelayTest, + MessengerId = (ushort)RelayMessengerIds.RelayTest170, Payload = serializer.Serialize(relayTestInfo), Timeout = 2000 }).ConfigureAwait(false); diff --git a/src/linker.messenger.relay/messenger/RelayMessenger.cs b/src/linker.messenger.relay/messenger/RelayMessenger.cs index f3bf1928..5665e681 100644 --- a/src/linker.messenger.relay/messenger/RelayMessenger.cs +++ b/src/linker.messenger.relay/messenger/RelayMessenger.cs @@ -30,7 +30,7 @@ namespace linker.messenger.relay.messenger [MessengerId((ushort)RelayMessengerIds.Relay)] public async Task Relay(IConnection connection) { - client.transport.RelayInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + client.transport.RelayInfo170 info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); bool res = await relayTransfer.OnBeginAsync(info).ConfigureAwait(false); connection.Write(res ? Helper.TrueArray : Helper.FalseArray); } @@ -48,8 +48,9 @@ namespace linker.messenger.relay.messenger private readonly ISerializer serializer; private readonly IRelayServerCdkeyStore relayServerCdkeyStore; private readonly IRelayServerStore relayServerStore; + private readonly RelayServerNodeTransfer relayServerNodeTransfer; - public RelayServerMessenger(IMessengerSender messengerSender, SignInServerCaching signCaching, ISerializer serializer, RelayServerMasterTransfer relayServerTransfer, RelayServerValidatorTransfer relayValidatorTransfer, IRelayServerCdkeyStore relayServerCdkeyStore, IRelayServerStore relayServerStore) + public RelayServerMessenger(IMessengerSender messengerSender, SignInServerCaching signCaching, ISerializer serializer, RelayServerMasterTransfer relayServerTransfer, RelayServerValidatorTransfer relayValidatorTransfer, IRelayServerCdkeyStore relayServerCdkeyStore, IRelayServerStore relayServerStore, RelayServerNodeTransfer relayServerNodeTransfer) { this.messengerSender = messengerSender; this.signCaching = signCaching; @@ -58,6 +59,7 @@ namespace linker.messenger.relay.messenger this.serializer = serializer; this.relayServerCdkeyStore = relayServerCdkeyStore; this.relayServerStore = relayServerStore; + this.relayServerNodeTransfer = relayServerNodeTransfer; } /// @@ -68,6 +70,16 @@ namespace linker.messenger.relay.messenger public async Task RelayTest(IConnection connection) { RelayTestInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + await RelayTest(connection, info); + } + [MessengerId((ushort)RelayMessengerIds.RelayTest170)] + public async Task RelayTest170(IConnection connection) + { + RelayTestInfo170 info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + await RelayTest(connection, info); + } + private async Task RelayTest(IConnection connection, RelayTestInfo info) + { if (signCaching.TryGet(connection.Id, out SignCacheInfo cache) == false) { connection.Write(Helper.FalseArray); @@ -86,7 +98,6 @@ namespace linker.messenger.relay.messenger connection.Write(serializer.Serialize(nodes)); } - /// /// 请求中继 /// @@ -95,6 +106,18 @@ namespace linker.messenger.relay.messenger public async Task RelayAsk(IConnection connection) { RelayInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + await RelayAsk(connection, info, new List()); + } + [MessengerId((ushort)RelayMessengerIds.RelayAsk170)] + public async Task RelayAsk170(IConnection connection) + { + RelayInfo170 info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + + List cdkeys = (await relayServerCdkeyStore.GetAvailable(info.UserId)).Select(c => new RelayServerCdkeyInfo { Bandwidth = c.Bandwidth, CdkeyId = c.CdkeyId, LastBytes = c.LastBytes }).ToList(); + await RelayAsk(connection, info, cdkeys); + } + public async Task RelayAsk(IConnection connection, RelayInfo info, List cdkeys) + { if (signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) == false || signCaching.TryGet(info.RemoteMachineId, out SignCacheInfo cacheTo) == false || cacheFrom.GroupId != cacheTo.GroupId) { connection.Write(serializer.Serialize(new RelayAskResultInfo { })); @@ -111,11 +134,9 @@ namespace linker.messenger.relay.messenger bool validated = string.IsNullOrWhiteSpace(error); result.Nodes = relayServerTransfer.GetNodes(validated); - List cdkeys = await relayServerCdkeyStore.GetAvailable(info.UserId); - if (result.Nodes.Count > 0) { - result.FlowingId = relayServerTransfer.AddRelay(cacheFrom.MachineId, cacheFrom.MachineName, cacheTo.MachineId, cacheTo.MachineName, cacheFrom.GroupId, validated, cdkeys.Select(c => new RelayServerCdkeyInfo { Bandwidth = c.Bandwidth, CdkeyId = c.CdkeyId, LastBytes = c.LastBytes }).ToList()); + result.FlowingId = relayServerTransfer.AddRelay(cacheFrom.MachineId, cacheFrom.MachineName, cacheTo.MachineId, cacheTo.MachineName, cacheFrom.GroupId, validated, cdkeys); } connection.Write(serializer.Serialize(result)); @@ -129,7 +150,23 @@ namespace linker.messenger.relay.messenger [MessengerId((ushort)RelayMessengerIds.RelayForward)] public async Task RelayForward(IConnection connection) { - client.transport.RelayInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + RelayInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + await RelayForward(connection, info, () => + { + return serializer.Serialize(info); + }); + } + [MessengerId((ushort)RelayMessengerIds.RelayForward170)] + public async Task RelayForward170(IConnection connection) + { + RelayInfo170 info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + await RelayForward(connection, info, () => + { + return serializer.Serialize(info); + }); + } + public async Task RelayForward(IConnection connection, RelayInfo info, Func data) + { if (signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) == false || signCaching.TryGet(info.RemoteMachineId, out SignCacheInfo cacheTo) == false || cacheFrom.GroupId != cacheTo.GroupId) { connection.Write(Helper.FalseArray); @@ -161,7 +198,7 @@ namespace linker.messenger.relay.messenger { Connection = cacheTo.Connection, MessengerId = (ushort)RelayMessengerIds.Relay, - Payload = serializer.Serialize(info) + Payload = data() }).ConfigureAwait(false); if (resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray)) { @@ -210,6 +247,40 @@ namespace linker.messenger.relay.messenger } relayServerTransfer.SetNodeReport(connection, info); } + /// + /// 更新节点 + /// + /// + /// + [MessengerId((ushort)RelayMessengerIds.UpdateNode)] + public void UpdateNode(IConnection connection) + { + RelayServerNodeUpdateInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + if (relayServerNodeTransfer.Id == info.Id) + { + relayServerNodeTransfer.UpdateNode(info); + } + } + /// + /// 更新节点转发 + /// + /// + /// + [MessengerId((ushort)RelayMessengerIds.UpdateNodeForward)] + public async Task UpdateNodeForward(IConnection connection) + { + RelayServerNodeUpdateWrapInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + if (info.SecretKey == relayServerStore.SecretKey) + { + await relayServerTransfer.UpdateNodeReport(info.Info); + connection.Write(Helper.TrueArray); + } + else + { + connection.Write(Helper.FalseArray); + } + } + /// /// 消耗流量报告 /// @@ -283,7 +354,7 @@ namespace linker.messenger.relay.messenger } else { - await relayServerCdkeyStore.Del(info.CdkeyId,info.UserId); + await relayServerCdkeyStore.Del(info.CdkeyId, info.UserId); } connection.Write(Helper.TrueArray); } @@ -351,8 +422,8 @@ namespace linker.messenger.relay.messenger connection.Write(Helper.FalseArray); return; } - bool result = await relayServerCdkeyStore.Import(info); - connection.Write(result ? Helper.TrueArray : Helper.FalseArray); + string result = await relayServerCdkeyStore.Import(info); + connection.Write(serializer.Serialize(result)); } } } diff --git a/src/linker.messenger.relay/messenger/RelayMessengerIds.cs b/src/linker.messenger.relay/messenger/RelayMessengerIds.cs index 66f919a5..886a4ef9 100644 --- a/src/linker.messenger.relay/messenger/RelayMessengerIds.cs +++ b/src/linker.messenger.relay/messenger/RelayMessengerIds.cs @@ -29,6 +29,11 @@ ImportCdkey = 2116, UpdateNode = 2117, + UpdateNodeForward = 2118, + + RelayTest170 = 2119, + RelayAsk170 = 2120, + RelayForward170 = 2121, Max = 2199 } diff --git a/src/linker.messenger.relay/server/IRelayServerCdkeyStore.cs b/src/linker.messenger.relay/server/IRelayServerCdkeyStore.cs index 4ef355f1..f341d481 100644 --- a/src/linker.messenger.relay/server/IRelayServerCdkeyStore.cs +++ b/src/linker.messenger.relay/server/IRelayServerCdkeyStore.cs @@ -33,7 +33,7 @@ /// /// /// - public Task Import(RelayServerCdkeyImportInfo info); + public Task Import(RelayServerCdkeyImportInfo info); /// /// 获取有效的CDKEY @@ -249,5 +249,6 @@ /// public int Count { get; set; } + public string Type { get; set; } } } diff --git a/src/linker.messenger.relay/server/IRelayServerNodeStore.cs b/src/linker.messenger.relay/server/IRelayServerNodeStore.cs index 996173a8..ed0311e3 100644 --- a/src/linker.messenger.relay/server/IRelayServerNodeStore.cs +++ b/src/linker.messenger.relay/server/IRelayServerNodeStore.cs @@ -1,6 +1,7 @@ using linker.libs; using System.Net; using linker.libs.extends; +using System.Text.Json.Serialization; namespace linker.messenger.relay.server { @@ -80,10 +81,17 @@ namespace linker.messenger.relay.server #else public string MasterSecretKey { get; set; } = string.Empty; #endif + public string Url { get; set; } = "https://linker-doc.snltty.com"; } + public sealed partial class RelayServerNodeUpdateWrapInfo + { + public string SecretKey { get; set; } + public RelayServerNodeUpdateInfo Info { get; set; } + } public sealed partial class RelayServerNodeUpdateInfo { + public string Id { get; set; } = string.Empty; public string Name { get; set; } = string.Empty; public int MaxConnection { get; set; } @@ -92,6 +100,8 @@ namespace linker.messenger.relay.server public double MaxGbTotal { get; set; } public long MaxGbTotalLastBytes { get; set; } public bool Public { get; set; } + + public string Url { get; set; } = "https://linker-doc.snltty.com"; } public sealed partial class RelayServerNodeReportInfo { @@ -114,6 +124,11 @@ namespace linker.messenger.relay.server public IPEndPoint EndPoint { get; set; } public long LastTicks { get; set; } + + public string Url { get; set; } = "https://linker-doc.snltty.com"; + + [JsonIgnore] + public IConnection Connection { get; set; } } public sealed partial class RelayAskResultInfo diff --git a/src/linker.messenger.relay/server/RelayServerMasterTransfer.cs b/src/linker.messenger.relay/server/RelayServerMasterTransfer.cs index 834a6d2a..c9ac72eb 100644 --- a/src/linker.messenger.relay/server/RelayServerMasterTransfer.cs +++ b/src/linker.messenger.relay/server/RelayServerMasterTransfer.cs @@ -1,4 +1,5 @@ using linker.libs; +using linker.messenger.relay.messenger; using linker.messenger.relay.server.caching; using System.Collections.Concurrent; using System.Net; @@ -18,11 +19,14 @@ namespace linker.messenger.relay.server private readonly IRelayServerCaching relayCaching; private readonly ISerializer serializer; private readonly IRelayServerCdkeyStore relayServerCdkeyStore; - public RelayServerMasterTransfer(IRelayServerCaching relayCaching, ISerializer serializer, IRelayServerMasterStore relayServerMasterStore, IRelayServerCdkeyStore relayServerCdkeyStore) + private readonly IMessengerSender messengerSender; + + public RelayServerMasterTransfer(IRelayServerCaching relayCaching, ISerializer serializer, IRelayServerMasterStore relayServerMasterStore, IRelayServerCdkeyStore relayServerCdkeyStore, IMessengerSender messengerSender) { this.relayCaching = relayCaching; this.serializer = serializer; this.relayServerCdkeyStore = relayServerCdkeyStore; + this.messengerSender = messengerSender; TrafficTask(); } @@ -70,6 +74,7 @@ namespace linker.messenger.relay.server info.EndPoint.Address = connection.Address.Address; } info.LastTicks = Environment.TickCount64; + info.Connection = connection; reports.AddOrUpdate(info.Id, info, (a, b) => info); } catch (Exception ex) @@ -80,6 +85,25 @@ namespace linker.messenger.relay.server } } } + /// + /// 更新节点 + /// + /// + public async Task UpdateNodeReport(RelayServerNodeUpdateInfo info) + { + if (RelayServerNodeInfo.MASTER_NODE_ID == info.Id) return; + + if (reports.TryGetValue(info.Id, out RelayServerNodeReportInfo cache)) + { + await messengerSender.SendOnly(new MessageRequestWrap + { + Connection = cache.Connection, + MessengerId = (ushort)RelayMessengerIds.UpdateNode, + Payload = serializer.Serialize(info) + }); + } + } + /// /// 获取节点列表 /// @@ -90,7 +114,7 @@ namespace linker.messenger.relay.server var result = reports.Values .Where(c => c.Public || validated) .Where(c => Environment.TickCount64 - c.LastTicks < 15000) - .Where(c => c.ConnectionRatio < 100 && (c.MaxGbTotal == 0 || (c.MaxGbTotal > 0 && c.MaxGbTotalLastBytes > 0))) + .Where(c => validated || (c.ConnectionRatio < 100 && (c.MaxGbTotal == 0 || (c.MaxGbTotal > 0 && c.MaxGbTotalLastBytes > 0)))) .OrderByDescending(c => c.LastTicks); return result.OrderByDescending(x => x.MaxConnection == 0 ? int.MaxValue : x.MaxConnection) @@ -113,7 +137,11 @@ namespace linker.messenger.relay.server return reports.TryGetValue(nodeId, out RelayServerNodeReportInfo relayNodeReportInfo) && relayNodeReportInfo.Public == false; } - + /// + /// 消耗流量 + /// + /// + /// public async Task> AddTraffic(RelayTrafficUpdateInfo relayTrafficUpdateInfo) { if (relayTrafficUpdateInfo.Dic.Count > 0) @@ -134,7 +162,7 @@ namespace linker.messenger.relay.server await relayServerCdkeyStore.Traffic(dic).ConfigureAwait(false); } return true; - },3000); + }, 3000); } } } diff --git a/src/linker.messenger.relay/server/RelayServerNodeTransfer.cs b/src/linker.messenger.relay/server/RelayServerNodeTransfer.cs index 1b6c04fe..fa0f5a07 100644 --- a/src/linker.messenger.relay/server/RelayServerNodeTransfer.cs +++ b/src/linker.messenger.relay/server/RelayServerNodeTransfer.cs @@ -13,6 +13,8 @@ namespace linker.messenger.relay.server /// public class RelayServerNodeTransfer { + public string Id=>relayServerNodeStore.Node.Id; + private uint connectionNum = 0; private IConnection localConnection; private IConnection remoteConnection; @@ -70,6 +72,11 @@ namespace linker.messenger.relay.server return null; } + public void UpdateNode(RelayServerNodeUpdateInfo info) + { + relayServerNodeStore.UpdateInfo(info); + } + /// /// 无效请求 /// diff --git a/src/linker.messenger.serializer.memorypack/Entry.cs b/src/linker.messenger.serializer.memorypack/Entry.cs index 5822fde3..383575ba 100644 --- a/src/linker.messenger.serializer.memorypack/Entry.cs +++ b/src/linker.messenger.serializer.memorypack/Entry.cs @@ -50,7 +50,9 @@ namespace linker.messenger.serializer.memorypack MemoryPackFormatterProvider.Register(new RelayTestInfoFormatter()); + MemoryPackFormatterProvider.Register(new RelayTestInfo170Formatter()); MemoryPackFormatterProvider.Register(new RelayInfoFormatter()); + MemoryPackFormatterProvider.Register(new RelayInfo170Formatter()); MemoryPackFormatterProvider.Register(new RelayServerNodeUpdateInfoFormatter()); MemoryPackFormatterProvider.Register(new RelayServerNodeReportInfoFormatter()); MemoryPackFormatterProvider.Register(new RelayAskResultInfoFormatter()); @@ -67,6 +69,9 @@ namespace linker.messenger.serializer.memorypack MemoryPackFormatterProvider.Register(new RelayServerCdkeyTestResultInfoFormatter()); MemoryPackFormatterProvider.Register(new RelayServerCdkeyOrderInfoFormatter()); + MemoryPackFormatterProvider.Register(new RelayServerNodeUpdateInfoFormatter()); + MemoryPackFormatterProvider.Register(new RelayServerNodeUpdateWrapInfoFormatter()); + MemoryPackFormatterProvider.Register(new AccessUpdateInfoFormatter()); MemoryPackFormatterProvider.Register(new AccessInfoFormatter()); diff --git a/src/linker.messenger.serializer.memorypack/RelaySerializer.cs b/src/linker.messenger.serializer.memorypack/RelaySerializer.cs index 4870a2b7..c6d2e8b5 100644 --- a/src/linker.messenger.serializer.memorypack/RelaySerializer.cs +++ b/src/linker.messenger.serializer.memorypack/RelaySerializer.cs @@ -2,6 +2,7 @@ using linker.messenger.relay.server; using MemoryPack; using System.Net; +using System.Xml.Linq; namespace linker.messenger.serializer.memorypack { @@ -18,13 +19,11 @@ namespace linker.messenger.serializer.memorypack [MemoryPackInclude, MemoryPackAllowSerialize] IPEndPoint Server => info.Server; - [MemoryPackInclude] - string UserId => info.UserId; [MemoryPackConstructor] - SerializableRelayTestInfo(string machineId, string secretKey, IPEndPoint server, string userid) + SerializableRelayTestInfo(string machineId, string secretKey, IPEndPoint server) { - var info = new RelayTestInfo { MachineId = machineId, SecretKey = secretKey, Server = server, UserId = userid }; + var info = new RelayTestInfo { MachineId = machineId, SecretKey = secretKey, Server = server }; this.info = info; } @@ -61,6 +60,62 @@ namespace linker.messenger.serializer.memorypack } + [MemoryPackable] + public readonly partial struct SerializableRelayTestInfo170 + { + [MemoryPackIgnore] + public readonly RelayTestInfo170 info; + + [MemoryPackInclude] + string MachineId => info.MachineId; + [MemoryPackInclude] + string SecretKey => info.SecretKey; + + [MemoryPackInclude, MemoryPackAllowSerialize] + IPEndPoint Server => info.Server; + [MemoryPackInclude] + string UserId => info.UserId; + + [MemoryPackConstructor] + SerializableRelayTestInfo170(string machineId, string secretKey, IPEndPoint server, string userid) + { + var info = new RelayTestInfo170 { MachineId = machineId, SecretKey = secretKey, Server = server, UserId = userid }; + this.info = info; + } + + public SerializableRelayTestInfo170(RelayTestInfo170 info) + { + this.info = info; + } + } + public class RelayTestInfo170Formatter : MemoryPackFormatter + { + public override void Serialize(ref MemoryPackWriter writer, scoped ref RelayTestInfo170 value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WritePackable(new SerializableRelayTestInfo170(value)); + } + + public override void Deserialize(ref MemoryPackReader reader, scoped ref RelayTestInfo170 value) + { + if (reader.PeekIsNull()) + { + reader.Advance(1); // skip null block + value = null; + return; + } + + var wrapped = reader.ReadPackable(); + value = wrapped.info; + } + } + + [MemoryPackable] public readonly partial struct SerializableRelayInfo @@ -91,14 +146,12 @@ namespace linker.messenger.serializer.memorypack [MemoryPackInclude] bool SSL => info.SSL; - [MemoryPackInclude] - string UserId => info.UserId; [MemoryPackConstructor] SerializableRelayInfo(string fromMachineId, string fromMachineName, string remoteMachineId, string remoteMachineName, string transactionId, string secretKey, string transportName, ulong flowingId, - string nodeId, IPEndPoint server, bool ssl, string userid) + string nodeId, IPEndPoint server, bool ssl) { var info = new RelayInfo { @@ -112,8 +165,7 @@ namespace linker.messenger.serializer.memorypack TransactionId = transactionId, TransportName = transportName, SecretKey = secretKey, - Server = server, - UserId = userid + Server = server }; this.info = info; } @@ -150,12 +202,103 @@ namespace linker.messenger.serializer.memorypack } } + + [MemoryPackable] + public readonly partial struct SerializableRelayInfo170 + { + [MemoryPackIgnore] + public readonly RelayInfo170 info; + + [MemoryPackInclude] + string FromMachineId => info.FromMachineId; + [MemoryPackInclude] + string FromMachineName => info.FromMachineName; + [MemoryPackInclude] + string RemoteMachineId => info.RemoteMachineId; + [MemoryPackInclude] + string RemoteMachineName => info.RemoteMachineName; + [MemoryPackInclude] + string TransactionId => info.TransactionId; + [MemoryPackInclude] + string SecretKey => info.SecretKey; + [MemoryPackInclude] + string TransportName => info.TransportName; + [MemoryPackInclude] + ulong FlowingId => info.FlowingId; + [MemoryPackInclude] + string NodeId => info.NodeId; + [MemoryPackInclude, MemoryPackAllowSerialize] + IPEndPoint Server => info.Server; + [MemoryPackInclude] + bool SSL => info.SSL; + + [MemoryPackInclude] + string UserId => info.UserId; + + [MemoryPackConstructor] + SerializableRelayInfo170(string fromMachineId, string fromMachineName, + string remoteMachineId, string remoteMachineName, + string transactionId, string secretKey, string transportName, ulong flowingId, + string nodeId, IPEndPoint server, bool ssl, string userid) + { + var info = new RelayInfo170 + { + FlowingId = flowingId, + FromMachineId = fromMachineId, + FromMachineName = fromMachineName, + NodeId = nodeId, + RemoteMachineId = remoteMachineId, + RemoteMachineName = remoteMachineName, + SSL = ssl, + TransactionId = transactionId, + TransportName = transportName, + SecretKey = secretKey, + Server = server, + UserId = userid + }; + this.info = info; + } + + public SerializableRelayInfo170(RelayInfo170 relayInfo) + { + this.info = relayInfo; + } + } + public class RelayInfo170Formatter : MemoryPackFormatter + { + public override void Serialize(ref MemoryPackWriter writer, scoped ref RelayInfo170 value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WritePackable(new SerializableRelayInfo170(value)); + } + + public override void Deserialize(ref MemoryPackReader reader, scoped ref RelayInfo170 value) + { + if (reader.PeekIsNull()) + { + reader.Advance(1); // skip null block + value = null; + return; + } + + var wrapped = reader.ReadPackable(); + value = wrapped.info; + } + } + + [MemoryPackable] public readonly partial struct SerializableRelayServerNodeUpdateInfo { [MemoryPackIgnore] public readonly RelayServerNodeUpdateInfo info; - + [MemoryPackInclude] + string Id => info.Id; [MemoryPackInclude] string Name => info.Name; [MemoryPackInclude] @@ -170,23 +313,27 @@ namespace linker.messenger.serializer.memorypack long MaxGbTotalLastBytes => info.MaxGbTotalLastBytes; [MemoryPackInclude] bool Public => info.Public; + [MemoryPackInclude] + string Url => info.Url; [MemoryPackConstructor] SerializableRelayServerNodeUpdateInfo( - string name, + string id, string name, int maxConnection, double maxBandwidth, double maxBandwidthTotal, double maxGbTotal, long maxGbTotalLastBytes, - bool Public) + bool Public, string url) { var info = new RelayServerNodeUpdateInfo { + Id = id, MaxBandwidth = maxBandwidth, MaxBandwidthTotal = maxBandwidthTotal, MaxConnection = maxConnection, MaxGbTotal = maxGbTotal, MaxGbTotalLastBytes = maxGbTotalLastBytes, Name = name, - Public = Public + Public = Public, + Url = url }; this.info = info; } @@ -222,6 +369,59 @@ namespace linker.messenger.serializer.memorypack value = wrapped.info; } } + [MemoryPackable] + public readonly partial struct SerializableRelayServerNodeUpdateWrapInfo + { + [MemoryPackIgnore] + public readonly RelayServerNodeUpdateWrapInfo info; + [MemoryPackInclude] + string SecretKey => info.SecretKey; + [MemoryPackInclude, MemoryPackAllowSerialize] + RelayServerNodeUpdateInfo Info => info.Info; + + [MemoryPackConstructor] + SerializableRelayServerNodeUpdateWrapInfo( + string secretKey, RelayServerNodeUpdateInfo info) + { + this.info = new RelayServerNodeUpdateWrapInfo + { + SecretKey = secretKey, + Info = info + }; + } + + public SerializableRelayServerNodeUpdateWrapInfo(RelayServerNodeUpdateWrapInfo info) + { + this.info = info; + } + } + public class RelayServerNodeUpdateWrapInfoFormatter : MemoryPackFormatter + { + public override void Serialize(ref MemoryPackWriter writer, scoped ref RelayServerNodeUpdateWrapInfo value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WritePackable(new SerializableRelayServerNodeUpdateWrapInfo(value)); + } + + public override void Deserialize(ref MemoryPackReader reader, scoped ref RelayServerNodeUpdateWrapInfo value) + { + if (reader.PeekIsNull()) + { + reader.Advance(1); // skip null block + value = null; + return; + } + + var wrapped = reader.ReadPackable(); + value = wrapped.info; + } + } + [MemoryPackable] @@ -256,6 +456,8 @@ namespace linker.messenger.serializer.memorypack IPEndPoint EndPoint => info.EndPoint; [MemoryPackInclude] long LastTicks => info.LastTicks; + [MemoryPackInclude] + string Url => info.Url; [MemoryPackConstructor] @@ -265,7 +467,7 @@ namespace linker.messenger.serializer.memorypack double maxGbTotal, long maxGbTotalLastBytes, double connectionRatio, double bandwidthRatio, bool Public, int delay, - IPEndPoint endPoint, long lastTicks) + IPEndPoint endPoint, long lastTicks, string url) { var info = new RelayServerNodeReportInfo { @@ -281,7 +483,8 @@ namespace linker.messenger.serializer.memorypack MaxGbTotal = maxGbTotal, MaxGbTotalLastBytes = maxGbTotalLastBytes, Name = name, - Public = Public + Public = Public, + Url = url }; this.info = info; } @@ -824,7 +1027,7 @@ namespace linker.messenger.serializer.memorypack RelayServerCdkeyPageRequestFlag Flag => info.Flag; [MemoryPackConstructor] - SerializableRelayServerCdkeyPageRequestInfo(int page, int size, string order, string sort, string userid, string remark, string orderid, string contact, string secretKey,RelayServerCdkeyPageRequestFlag flag) + SerializableRelayServerCdkeyPageRequestInfo(int page, int size, string order, string sort, string userid, string remark, string orderid, string contact, string secretKey, RelayServerCdkeyPageRequestFlag flag) { var info = new RelayServerCdkeyPageRequestInfo { @@ -1141,10 +1344,12 @@ namespace linker.messenger.serializer.memorypack double PayPrice => info.PayPrice; [MemoryPackInclude] int Count => info.Count; + [MemoryPackInclude] + string Type => info.Type; [MemoryPackConstructor] - SerializableRelayServerCdkeyOrderInfo(int gb, int speed, string time, string widgetUserId, string orderId, string contact, double costPrice, double price, double userPrice, double payPrice, int count) + SerializableRelayServerCdkeyOrderInfo(int gb, int speed, string time, string widgetUserId, string orderId, string contact, double costPrice, double price, double userPrice, double payPrice, int count, string type) { var info = new RelayServerCdkeyOrderInfo { @@ -1158,7 +1363,8 @@ namespace linker.messenger.serializer.memorypack Price = price, UserPrice = userPrice, PayPrice = payPrice, - Count = count + Count = count, + Type = type }; this.info = info; } diff --git a/src/linker.messenger.store.file/relay/RelayServerCdkeyStore.cs b/src/linker.messenger.store.file/relay/RelayServerCdkeyStore.cs index 807572a1..12f46f96 100644 --- a/src/linker.messenger.store.file/relay/RelayServerCdkeyStore.cs +++ b/src/linker.messenger.store.file/relay/RelayServerCdkeyStore.cs @@ -61,6 +61,11 @@ namespace linker.messenger.store.file.relay RelayServerCdkeyOrderInfo order = result.Cdkey.DeJson(); result.Order = order; + if(order.Type != "Relay" || string.IsNullOrWhiteSpace(order.Type)) + { + error.Add("Relay"); + } + if (order.WidgetUserId != info.UserId || string.IsNullOrWhiteSpace(order.WidgetUserId)) { error.Add("UserId"); @@ -98,13 +103,26 @@ namespace linker.messenger.store.file.relay return await Task.FromResult(result); } - public async Task Import(RelayServerCdkeyImportInfo info) + public async Task Import(RelayServerCdkeyImportInfo info) { RelayServerCdkeyTestResultInfo test = await Test(info); + if (test.Field.Count > 0) { - return false; + if (test.Field.Contains("Parse")) + { + return "Parse"; + } + else + { + return "Field"; + } } + if (liteCollection.Count(c => c.OrderId == test.Order.OrderId) > 0) + { + return "OrderId"; + } + RelayServerCdkeyOrderInfo order = test.Order; var time = Regex.Match(order.Time, regex).Groups; RelayServerCdkeyStoreInfo store = new RelayServerCdkeyStoreInfo @@ -120,8 +138,8 @@ namespace linker.messenger.store.file.relay .AddHours(int.Parse(time[4].Value)) .AddMinutes(int.Parse(time[5].Value)) .AddSeconds(int.Parse(time[6].Value)), - LastBytes = order.Speed * 1024 * 1024 * 1024 * order.Count, - MaxBytes = order.Speed * 1024 * 1024 * 1024 * order.Count, + LastBytes = (long)order.GB * 1024 * 1024 * 1024 * order.Count, + MaxBytes = (long)order.GB * 1024 * 1024 * 1024 * order.Count, Price = order.Price, Remark = "order", StartTime = DateTime.Now, @@ -134,7 +152,7 @@ namespace linker.messenger.store.file.relay Id = ObjectId.NewObjectId().ToString() }; liteCollection.Insert(store); - return await Task.FromResult(true); + return await Task.FromResult(string.Empty); } public async Task Traffic(Dictionary dic) diff --git a/src/linker.messenger.store.file/relay/RelayServerNodeStore.cs b/src/linker.messenger.store.file/relay/RelayServerNodeStore.cs index 8a66e794..8d23879d 100644 --- a/src/linker.messenger.store.file/relay/RelayServerNodeStore.cs +++ b/src/linker.messenger.store.file/relay/RelayServerNodeStore.cs @@ -31,6 +31,7 @@ namespace linker.messenger.store.file.relay config.Data.Server.Relay.Distributed.Node.MaxGbTotal = update.MaxGbTotal; config.Data.Server.Relay.Distributed.Node.MaxGbTotalLastBytes = update.MaxGbTotalLastBytes; config.Data.Server.Relay.Distributed.Node.Public = update.Public; + config.Data.Server.Relay.Distributed.Node.Url = update.Url; } public void SetMaxGbTotalLastBytes(long value) diff --git a/src/linker.route.win/res/logo1.png b/src/linker.route.win/res/logo1.png index 0349f108..a6a551a3 100644 Binary files a/src/linker.route.win/res/logo1.png and b/src/linker.route.win/res/logo1.png differ diff --git a/src/linker.tray.win/res/favicon.ico b/src/linker.tray.win/res/favicon.ico index 8103458a..2a0e4e36 100644 Binary files a/src/linker.tray.win/res/favicon.ico and b/src/linker.tray.win/res/favicon.ico differ diff --git a/src/linker.tray.win/res/favicon1.ico b/src/linker.tray.win/res/favicon1.ico index 5cd24e1c..b0ed7927 100644 Binary files a/src/linker.tray.win/res/favicon1.ico and b/src/linker.tray.win/res/favicon1.ico differ diff --git a/src/linker.tray.win/web/favicon.ico b/src/linker.tray.win/web/favicon.ico index 8103458a..2a0e4e36 100644 Binary files a/src/linker.tray.win/web/favicon.ico and b/src/linker.tray.win/web/favicon.ico differ diff --git a/src/linker.tray.win/web/favicon1.ico b/src/linker.tray.win/web/favicon1.ico index 5cd24e1c..b0ed7927 100644 Binary files a/src/linker.tray.win/web/favicon1.ico and b/src/linker.tray.win/web/favicon1.ico differ diff --git a/src/linker.tray.win/web/logo.png b/src/linker.tray.win/web/logo.png index 6f42c567..dc0e760c 100644 Binary files a/src/linker.tray.win/web/logo.png and b/src/linker.tray.win/web/logo.png differ diff --git a/src/linker.tray.win/web/logo1.png b/src/linker.tray.win/web/logo1.png index d9a35aa4..a6a551a3 100644 Binary files a/src/linker.tray.win/web/logo1.png and b/src/linker.tray.win/web/logo1.png differ diff --git a/src/linker.web/public/avatar.png b/src/linker.web/public/avatar.png new file mode 100644 index 00000000..301d943b Binary files /dev/null and b/src/linker.web/public/avatar.png differ diff --git a/src/linker.web/public/favicon.ico b/src/linker.web/public/favicon.ico index 8103458a..2a0e4e36 100644 Binary files a/src/linker.web/public/favicon.ico and b/src/linker.web/public/favicon.ico differ diff --git a/src/linker.web/public/favicon1.ico b/src/linker.web/public/favicon1.ico index 5cd24e1c..b0ed7927 100644 Binary files a/src/linker.web/public/favicon1.ico and b/src/linker.web/public/favicon1.ico differ diff --git a/src/linker.web/public/logo.png b/src/linker.web/public/logo.png index 6f42c567..dc0e760c 100644 Binary files a/src/linker.web/public/logo.png and b/src/linker.web/public/logo.png differ diff --git a/src/linker.web/public/logo.zip b/src/linker.web/public/logo.zip new file mode 100644 index 00000000..f65fc6f4 Binary files /dev/null and b/src/linker.web/public/logo.zip differ diff --git a/src/linker.web/public/logo1.png b/src/linker.web/public/logo1.png index d9a35aa4..a6a551a3 100644 Binary files a/src/linker.web/public/logo1.png and b/src/linker.web/public/logo1.png differ diff --git a/src/linker.web/src/apis/relay.js b/src/linker.web/src/apis/relay.js index d1eb99cf..ebbfc055 100644 --- a/src/linker.web/src/apis/relay.js +++ b/src/linker.web/src/apis/relay.js @@ -26,4 +26,10 @@ export const relayCdkeyMy = (data) => { } export const relayCdkeyTest = (data) => { return sendWebsocketMsg('relay/TestCdkey', data); +} +export const relayCdkeyImport = (data) => { + return sendWebsocketMsg('relay/ImportCdkey', data); +} +export const relayUpdateNode = (data) => { + return sendWebsocketMsg('relay/UpdateNode', data); } \ No newline at end of file diff --git a/src/linker.web/src/assets/logo.png b/src/linker.web/src/assets/logo.png index 6f42c567..dc0e760c 100644 Binary files a/src/linker.web/src/assets/logo.png and b/src/linker.web/src/assets/logo.png differ diff --git a/src/linker.web/src/assets/logo1.png b/src/linker.web/src/assets/logo1.png index d9a35aa4..a6a551a3 100644 Binary files a/src/linker.web/src/assets/logo1.png and b/src/linker.web/src/assets/logo1.png differ diff --git a/src/linker.web/src/lang/en-us.js b/src/linker.web/src/lang/en-us.js index a0152c8c..5da88029 100644 --- a/src/linker.web/src/lang/en-us.js +++ b/src/linker.web/src/lang/en-us.js @@ -51,6 +51,10 @@ export default { 'status.groupDelConfirm': 'Are you sure to delete?', 'status.support': 'Support', + 'status.website': 'Website', + 'status.doc': 'Document', + 'status.cdkey': 'CDKEY store', + 'status.export': 'Export', 'status.exportText': 'Export the configuration to run elsewhere', 'status.exportSingle': 'Single', @@ -126,6 +130,7 @@ export default { 'server.relayConnection': 'Conn', 'server.relayDelay': 'Delay', 'server.relayPublic': 'Public', + 'server.relayUrl': 'Url', 'server.relayOper': 'Oper', 'server.relayUse': 'Use', 'server.relayMyCdkey': 'My CDKEY', @@ -169,6 +174,35 @@ export default { 'server.relayCdkeyFlagDeleted': 'Deleted', 'server.relayCdkeyFlagUnDeleted': 'Not deleted', + 'server.relayCdkeyTestTitle': 'Test CDKEY', + 'server.relayCdkeyTestKey': 'CDKEY', + 'server.relayCdkeyTestGB': 'GB', + 'server.relayCdkeyTestGBError': 'Must > 0', + 'server.relayCdkeyTestSpeed': 'Mbps', + 'server.relayCdkeyTestSpeedError': 'Must > 0', + 'server.relayCdkeyTestTime': 'Time', + 'server.relayCdkeyTestTimeError': 'Format error', + 'server.relayCdkeyTestUserId': 'UserId', + 'server.relayCdkeyTestUserIdError': 'UserId error', + 'server.relayCdkeyTestOrderId': 'OrderNo', + 'server.relayCdkeyTestOrderIdError': 'OrderNo is empty', + 'server.relayCdkeyTestContact': 'Contact', + 'server.relayCdkeyTestCostPrice': 'Cost', + 'server.relayCdkeyTestPrice': 'Price', + 'server.relayCdkeyTestUserPrice': 'User price', + 'server.relayCdkeyTestPayPrice': 'Pay', + 'server.relayCdkeyTestCount': 'Count', + 'server.relayCdkeyTestCountError': 'Must > 0', + 'server.relayCdkeyTestType': 'Type', + 'server.relayCdkeyTestTypeError': 'Must be relay', + 'server.relayCdkeyTestParseError': 'decode fail', + + 'server.relayCdkeyImport': 'Import CDKEY', + 'server.relayCdkeyImportParse': 'Decode fail', + 'server.relayCdkeyImportField': 'Field invalid', + 'server.relayCdkeyImportNetwork': 'Network error', + 'server.relayCdkeyImportOrderId': 'OrderNo has exists', + 'server.sforwardSecretKey': 'Server forward secretKey', 'server.sforwardText': 'The server forward can be used when the key is correct', diff --git a/src/linker.web/src/lang/zh-cn.js b/src/linker.web/src/lang/zh-cn.js index 309deb2b..1a45da1d 100644 --- a/src/linker.web/src/lang/zh-cn.js +++ b/src/linker.web/src/lang/zh-cn.js @@ -51,6 +51,9 @@ export default { 'status.groupDelConfirm': '确认删除吗?', 'status.support': '赞助', + 'status.website': '官网', + 'status.doc': '文档', + 'status.cdkey': 'CDKEY商城', 'status.export': '导出配置', 'status.exportText': '导出配置,作为子设备运行,如果使用docker,容器映射configs文件夹即可', @@ -123,12 +126,14 @@ export default { 'server.relayTitle': '中继节点', 'server.relayName': '名称', 'server.relayFlow': '月流量', + 'server.relayFlowLast': '剩余流量', 'server.relaySpeed': '带宽', 'server.relaySpeed1': '总带宽', 'server.relaySpeed2': '速率', 'server.relayConnection': '连接数', 'server.relayDelay': '延迟', 'server.relayPublic': '公开', + 'server.relayUrl': 'Url', 'server.relayOper': '操作', 'server.relayUse': '使用', 'server.relayMyCdkey': '我的CDKEY', @@ -191,8 +196,16 @@ export default { 'server.relayCdkeyTestPayPrice': '支付', 'server.relayCdkeyTestCount': '数量', 'server.relayCdkeyTestCountError': '数量要大于0', + 'server.relayCdkeyTestType': '类别', + 'server.relayCdkeyTestTypeError': '类别应该是Relay', 'server.relayCdkeyTestParseError': '解密失败', + 'server.relayCdkeyImport': '导入CDKEY', + 'server.relayCdkeyImportParse': '解密失败', + 'server.relayCdkeyImportField': '字段有误', + 'server.relayCdkeyImportNetwork': '网络错误', + 'server.relayCdkeyImportOrderId': '订单号已存在', + 'server.sforwardSecretKey': '服务器穿透密钥', 'server.sforwardText': '当密钥正确是可用', diff --git a/src/linker.web/src/views/full/devices/ConnectionsEdit.vue b/src/linker.web/src/views/full/devices/ConnectionsEdit.vue index 9a526f9a..f3b32ebf 100644 --- a/src/linker.web/src/views/full/devices/ConnectionsEdit.vue +++ b/src/linker.web/src/views/full/devices/ConnectionsEdit.vue @@ -61,7 +61,11 @@
- + + +