mirror of
https://github.com/MeowCraftMC/CrystalConnector
synced 2025-05-22 02:43:00 +00:00
@@ -10,6 +10,7 @@
|
||||
<PackageRequireLicenseAcceptance>True</PackageRequireLicenseAcceptance>
|
||||
<IncludeSymbols>True</IncludeSymbols>
|
||||
<PackageProjectUrl>https://github.com/MeowCraftMC/CrystalConnector</PackageProjectUrl>
|
||||
<Version>1.0.1</Version>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Google.Protobuf" Version="3.25.1" />
|
||||
|
||||
@@ -1,14 +1,16 @@
|
||||
using CrystalConnector.Protocol.Messages;
|
||||
using CrystalConnector.Protocol.Entities;
|
||||
using CrystalConnector.Protocol.Messages;
|
||||
using CrystalConnector.Protocol.Utilities;
|
||||
using Google.Protobuf;
|
||||
|
||||
namespace CrystalConnector.Protocol.Packets.C2S;
|
||||
|
||||
public class PublishPacket : IPacket
|
||||
{
|
||||
public NamespacedName Channel { get; set; }
|
||||
public NamespacedId Channel { get; set; }
|
||||
public string Payload { get; set; }
|
||||
|
||||
public PublishPacket(NamespacedName channel, string payload)
|
||||
public PublishPacket(NamespacedId channel, string payload)
|
||||
{
|
||||
Channel = channel;
|
||||
Payload = payload;
|
||||
@@ -26,7 +28,7 @@ public class PublishPacket : IPacket
|
||||
public void Read(byte[] bytes)
|
||||
{
|
||||
var message = Publish.Parser.ParseFrom(bytes);
|
||||
Channel = message.Channel;
|
||||
Channel = message.Channel.ToId();
|
||||
Payload = message.Payload;
|
||||
}
|
||||
|
||||
@@ -34,7 +36,7 @@ public class PublishPacket : IPacket
|
||||
{
|
||||
var message = new Publish
|
||||
{
|
||||
Channel = Channel,
|
||||
Channel = Channel.ToName(),
|
||||
Payload = Payload
|
||||
};
|
||||
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
using CrystalConnector.Protocol.Messages;
|
||||
using CrystalConnector.Protocol.Entities;
|
||||
using CrystalConnector.Protocol.Messages;
|
||||
using CrystalConnector.Protocol.Utilities;
|
||||
using Google.Protobuf;
|
||||
|
||||
namespace CrystalConnector.Protocol.Packets.S2C;
|
||||
@@ -6,17 +8,13 @@ namespace CrystalConnector.Protocol.Packets.S2C;
|
||||
public class ForwardPacket : IPacket
|
||||
{
|
||||
public string Publisher { get; set; }
|
||||
public NamespacedName Channel { get; set; }
|
||||
public NamespacedId Channel { get; set; }
|
||||
public string Payload { get; set; }
|
||||
|
||||
public ForwardPacket(string publisher, (string Namespace, string Name) channel, string payload)
|
||||
public ForwardPacket(string publisher, NamespacedId channel, string payload)
|
||||
{
|
||||
Publisher = publisher;
|
||||
Channel = new NamespacedName
|
||||
{
|
||||
Namespace = channel.Namespace,
|
||||
Name = channel.Name
|
||||
};
|
||||
Channel = channel;
|
||||
Payload = payload;
|
||||
}
|
||||
|
||||
@@ -33,7 +31,7 @@ public class ForwardPacket : IPacket
|
||||
{
|
||||
var message = Forward.Parser.ParseFrom(bytes);
|
||||
Publisher = message.Publisher;
|
||||
Channel = message.Channel;
|
||||
Channel = message.Channel.ToId();
|
||||
Payload = message.Payload;
|
||||
}
|
||||
|
||||
@@ -42,7 +40,11 @@ public class ForwardPacket : IPacket
|
||||
var message = new Forward
|
||||
{
|
||||
Publisher = Publisher,
|
||||
Channel = Channel,
|
||||
Channel = new NamespacedName
|
||||
{
|
||||
Namespace = Channel.Namespace,
|
||||
Name = Channel.Name
|
||||
},
|
||||
Payload = Payload
|
||||
};
|
||||
|
||||
|
||||
@@ -6,6 +6,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConnectorTest", "ConnectorT
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CrystalConnector.Protocol", "CrystalConnector.Protocol\CrystalConnector.Protocol.csproj", "{1769D402-129D-46D2-9347-70F3E875FE7B}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CrystalConnector.Client", "CrystalConnector.Client\CrystalConnector.Client.csproj", "{DC40A2D9-1D24-4561-8C9C-DA7124BDD965}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
@@ -24,5 +26,9 @@ Global
|
||||
{1769D402-129D-46D2-9347-70F3E875FE7B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{1769D402-129D-46D2-9347-70F3E875FE7B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{1769D402-129D-46D2-9347-70F3E875FE7B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{DC40A2D9-1D24-4561-8C9C-DA7124BDD965}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{DC40A2D9-1D24-4561-8C9C-DA7124BDD965}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{DC40A2D9-1D24-4561-8C9C-DA7124BDD965}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{DC40A2D9-1D24-4561-8C9C-DA7124BDD965}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
using CrystalConnector.Protocol.Messages;
|
||||
using CrystalConnector.Protocol.Entities;
|
||||
using CrystalConnector.Protocol.Messages;
|
||||
|
||||
namespace CrystalConnector.Connector;
|
||||
|
||||
public class MessageChannel
|
||||
{
|
||||
public required (string Namespace, string Name) Id { get; set; }
|
||||
public required NamespacedId Id { get; set; }
|
||||
|
||||
public required MessageDirection Direction { get; set; }
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.Net.WebSockets;
|
||||
using CrystalConnector.Protocol.Entities;
|
||||
using CrystalConnector.Protocol.Messages;
|
||||
using CrystalConnector.Protocol.Packets.S2C;
|
||||
using CrystalConnector.Utilities;
|
||||
@@ -9,7 +10,7 @@ public class WebSocketConnectionManager
|
||||
{
|
||||
internal static Dictionary<WebSocket, WebSocketConnectionInfo> Info { get; } = new();
|
||||
|
||||
public static bool HaveClientRegistered((string Namespace, string Name) client)
|
||||
public static bool HaveClientRegistered(NamespacedId client)
|
||||
{
|
||||
foreach (var (_, info) in Info)
|
||||
{
|
||||
@@ -30,7 +31,7 @@ public class WebSocketConnectionManager
|
||||
}
|
||||
}
|
||||
|
||||
public static async Task Broadcast(string origin, (string Namespace, string Name) channel, string payload, bool allowUnauthenticated = false)
|
||||
public static async Task Broadcast(string origin, NamespacedId channel, string payload, bool allowUnauthenticated = false)
|
||||
{
|
||||
var packet = new ForwardPacket(origin, channel, payload);
|
||||
|
||||
|
||||
@@ -30,17 +30,17 @@ public class WebSocketHandler
|
||||
{
|
||||
case AuthenticatePacket authenticatePacket:
|
||||
{
|
||||
var clientId = (authenticatePacket.ClientId.Namespace, authenticatePacket.ClientId.Name);
|
||||
var clientId = authenticatePacket.ClientId.ToId();
|
||||
|
||||
if (authenticatePacket.Key == Config.GetSecretKey())
|
||||
{
|
||||
if (WebSocketConnectionManager.HaveClientRegistered(clientId))
|
||||
{
|
||||
Logger.LogInformation("Client {Id} tried authorize with name {Name}, but it is already authorized!", clientId.ToIdString(), authenticatePacket.ClientName);
|
||||
Logger.LogInformation("Client {Id} tried authorize with name {Name}, but it is already authorized!", clientId, authenticatePacket.ClientName);
|
||||
return new ResultPacket(Error.NameExists);
|
||||
}
|
||||
|
||||
Logger.LogInformation("Client {Name}({Id}) authorized", authenticatePacket.ClientName, clientId.ToIdString());
|
||||
Logger.LogInformation("Client {Name}({Id}) authorized", authenticatePacket.ClientName, clientId);
|
||||
|
||||
var connectionInfo = webSocket.GetConnectionInfo();
|
||||
|
||||
@@ -52,7 +52,7 @@ public class WebSocketHandler
|
||||
|
||||
foreach (var channel in authenticatePacket.Channels)
|
||||
{
|
||||
var id = channel.Id.ToTuple();
|
||||
var id = channel.Id.ToId();
|
||||
if (channels.TryGetValue(id, out var chan))
|
||||
{
|
||||
chan.Direction = channel.Direction;
|
||||
@@ -70,13 +70,13 @@ public class WebSocketHandler
|
||||
return new ResultPacket();
|
||||
}
|
||||
|
||||
Logger.LogWarning("Client {Name}({Id}) auth failed with wrong key!", authenticatePacket.ClientName, clientId.ToIdString());
|
||||
Logger.LogWarning("Client {Name}({Id}) auth failed with wrong key!", authenticatePacket.ClientName, clientId);
|
||||
return new ResultPacket(Error.Unauthenticated);
|
||||
}
|
||||
case PublishPacket publishPacket:
|
||||
{
|
||||
var connectionInfo = webSocket.GetConnectionInfo();
|
||||
var id = publishPacket.Channel.ToTuple();
|
||||
var id = publishPacket.Channel;
|
||||
|
||||
if (!connectionInfo.Authenticated)
|
||||
{
|
||||
@@ -88,7 +88,7 @@ public class WebSocketHandler
|
||||
|| registered.Direction == MessageDirection.All)
|
||||
{
|
||||
Logger.LogWarning("Channel {Channel}(Direction: {Direction}) have not been registered by Client {Name}({Id})",
|
||||
id.ToIdString(), MessageDirection.Outgoing, webSocket.GetConnectionInfo().Name, webSocket.GetConnectionInfo().Id);
|
||||
id, MessageDirection.Outgoing, webSocket.GetConnectionInfo().Name, webSocket.GetConnectionInfo().Id);
|
||||
return new ResultPacket(Error.UnregisteredChannel);
|
||||
}
|
||||
|
||||
@@ -98,7 +98,7 @@ public class WebSocketHandler
|
||||
if (Config.IsDebug())
|
||||
{
|
||||
Logger.LogDebug("Client {Name}({Id}) send data in {Channel}: {Data}",
|
||||
name, webSocket.GetConnectionInfo().ClientId!.Value.ToIdString(), id.ToIdString(), publishPacket.Payload);
|
||||
name, webSocket.GetConnectionInfo().ClientId, id, publishPacket.Payload);
|
||||
}
|
||||
|
||||
return new ResultPacket();
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System.Net;
|
||||
using CrystalConnector.Connector;
|
||||
using CrystalConnector.Protocol.Entities;
|
||||
|
||||
namespace CrystalConnector.Utilities;
|
||||
|
||||
@@ -13,9 +14,9 @@ public class WebSocketConnectionInfo
|
||||
|
||||
public string? Name { get; set; }
|
||||
|
||||
public (string Namespace, string Name)? ClientId { get; set; }
|
||||
public NamespacedId? ClientId { get; set; }
|
||||
|
||||
public bool Authenticated { get; set; } = false;
|
||||
|
||||
public Dictionary<(string Namespace, string Name), MessageChannel> RegisteredChannels { get; } = new();
|
||||
public Dictionary<NamespacedId, MessageChannel> RegisteredChannels { get; } = new();
|
||||
}
|
||||
Reference in New Issue
Block a user