mine2d/Mine2d/game/backend/network/Converter.cs

49 lines
1.5 KiB
C#

using System.Text;
using Mine2d.game.backend.network.packets;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using ConnectPacket = Mine2d.game.backend.network.packets.ConnectPacket;
using TickPacket = Mine2d.game.backend.network.packets.TickPacket;
namespace Mine2d.game.backend.network;
public class Converter
{
public static Packet ParsePacket(byte[] bytes)
{
var jsonString = Encoding.UTF8.GetString(bytes);
return ParsePacket(jsonString);
}
public static Packet ParsePacket(string jsonString)
{
var parsedRaw = JObject.Parse(jsonString);
var packetType = parsedRaw
.GetValue("type")?
.Value<PacketType>();
if (packetType == null)
throw new PacketException("Packet has no type");
Console.WriteLine("Packet type: " + packetType);
Packet packet = packetType switch
{
PacketType.Connect => parsedRaw.ToObject<ConnectPacket>(),
PacketType.Disconnect => parsedRaw.ToObject<DisconnectPacket>(),
PacketType.Tick => parsedRaw.ToObject<TickPacket>(),
_ => throw new PacketException($"Unknown packet type: {packetType}")
};
if (packet is null)
throw new PacketException($"Failed to parse packet of type: {packetType}");
return packet;
}
public static byte[] SerializePacket(ValueType packet)
{
var jsonString = JsonConvert.SerializeObject(packet);
return Encoding.UTF8.GetBytes(jsonString);
}
}