331 lines
10 KiB
C++
331 lines
10 KiB
C++
#pragma once
|
|
#include "Utils/Snowflake.hpp"
|
|
|
|
#include "precomp.hpp"
|
|
|
|
namespace Chattr {
|
|
|
|
enum class PacketSet {
|
|
LOGINREQUEST,
|
|
ROOMCREATEREQUEST,
|
|
ROOMLISTREQUEST,
|
|
ROOMJOINREQUEST,
|
|
ROOMEXITREQUEST,
|
|
USERSLISTREQUEST,
|
|
DATAPOSTTEXT,
|
|
DATAPOSTBINARY,
|
|
CONTINUE,
|
|
RESPONSE,
|
|
LOGINRESPONSE,
|
|
ROOMCREATERESPONSE,
|
|
ROOMLISTRESPONSE,
|
|
ROOMJOINRESPONSE,
|
|
ROOMEXITRESPONSE,
|
|
USERSLISTRESPONSE,
|
|
INVALID
|
|
};
|
|
|
|
enum class PacketCategory : std::uint8_t {
|
|
PACKET_POST,
|
|
PACKET_REQUEST,
|
|
PACKET_RESPONSE,
|
|
PACKET_CONTINUE,
|
|
};
|
|
|
|
enum class RequestType : std::uint8_t {
|
|
LOGIN,
|
|
ROOM_CREATE,
|
|
ROOM_LIST,
|
|
ROOM_JOIN,
|
|
ROOM_EXIT,
|
|
USERS_LIST,
|
|
DATA
|
|
};
|
|
|
|
#define MOREFRAG 0b00000001
|
|
|
|
enum class DataType : std::uint8_t {
|
|
TEXT,
|
|
BINARY
|
|
};
|
|
|
|
class alignas(4) Packet {
|
|
public:
|
|
union {
|
|
struct {
|
|
PacketCategory packetType;
|
|
RequestType requestType;
|
|
DataType dataType;
|
|
std::uint16_t packetLength;
|
|
std::uint8_t data[1495];
|
|
} __data;
|
|
std::uint8_t serialized[1500] = "";
|
|
};
|
|
std::uint8_t* convToN() {
|
|
__data.packetLength = ::htons(__data.packetLength);
|
|
return serialized;
|
|
}
|
|
std::uint8_t* convToH() {
|
|
__data.packetLength = ::ntohs(__data.packetLength);
|
|
return serialized;
|
|
}
|
|
};
|
|
|
|
class alignas(4) LoginRequestPacket : public Packet {};
|
|
|
|
class alignas(4) RoomCreateRequestPacket : public Packet {};
|
|
|
|
class alignas(4) RoomListRequestPacket : public Packet {};
|
|
|
|
class alignas(4) RoomJoinRequestPacket : public Packet {
|
|
public:
|
|
union {
|
|
struct {
|
|
PacketCategory packetType;
|
|
RequestType requestType;
|
|
DataType dataType;
|
|
std::uint16_t packetLength;
|
|
std::uint16_t destId[4];
|
|
std::uint8_t name[];
|
|
} __data;
|
|
std::uint8_t serialized[1500] = "";
|
|
};
|
|
std::uint8_t* convToN() {
|
|
__data.packetLength = ::htons(__data.packetLength);
|
|
for (int i = 0; i < 4; i++)
|
|
__data.destId[i] = ::htons(__data.destId[i]);
|
|
return serialized;
|
|
}
|
|
std::uint8_t* convToH() {
|
|
__data.packetLength = ::ntohs(__data.packetLength);
|
|
for (int i = 0; i < 4; i++)
|
|
__data.destId[i] = ::ntohs(__data.destId[i]);
|
|
return serialized;
|
|
}
|
|
};
|
|
|
|
class alignas(4) RoomExitRequestPacket : public Packet {};
|
|
|
|
class alignas(4) UsersListRequestPacket : public Packet {};
|
|
|
|
class alignas(4) DataPostPacket : public Packet {
|
|
public:
|
|
union {
|
|
struct {
|
|
PacketCategory packetType;
|
|
RequestType requestType;
|
|
DataType dataType;
|
|
std::uint16_t packetLength;
|
|
std::uint16_t destId[4];
|
|
std::uint8_t data[];
|
|
} __data;
|
|
std::uint8_t serialized[1500] = "";
|
|
};
|
|
std::uint8_t* convToN() {
|
|
__data.packetLength = ::htons(__data.packetLength);
|
|
for (int i = 0; i < 4; i++)
|
|
__data.destId[i] = ::htons(__data.destId[i]);
|
|
return serialized;
|
|
}
|
|
std::uint8_t* convToH() {
|
|
__data.packetLength = ::ntohs(__data.packetLength);
|
|
for (int i = 0; i < 4; i++)
|
|
__data.destId[i] = ::ntohs(__data.destId[i]);
|
|
return serialized;
|
|
}
|
|
};
|
|
|
|
class alignas(4) ContinuePacket : public Packet {
|
|
public:
|
|
union {
|
|
struct {
|
|
PacketCategory packetType;
|
|
RequestType requestType;
|
|
DataType dataType;
|
|
std::uint16_t packetLength;
|
|
std::uint16_t destId[4];
|
|
std::uint8_t data[];
|
|
} __data;
|
|
std::uint8_t serialized[1500] = "";
|
|
};
|
|
std::uint8_t* convToN() {
|
|
__data.packetLength = ::htons(__data.packetLength);
|
|
for (int i = 0; i < 4; i++)
|
|
__data.destId[i] = ::htons(__data.destId[i]);
|
|
return serialized;
|
|
}
|
|
std::uint8_t* convToH() {
|
|
__data.packetLength = ::ntohs(__data.packetLength);
|
|
for (int i = 0; i < 4; i++)
|
|
__data.destId[i] = ::ntohs(__data.destId[i]);
|
|
return serialized;
|
|
}
|
|
};
|
|
|
|
enum class ResponseStatusCode : std::uint16_t {
|
|
OK = 200,
|
|
CREATED = 201,
|
|
ACCEPTED = 202,
|
|
BAD_REQUEST = 400,
|
|
FORBIDDEN = 403,
|
|
NOT_FOUND = 404,
|
|
LENGTH_REQUIRED = 411,
|
|
IAM_A_TEAPOT = 418,
|
|
TOO_MANY_REQUESTS = 429,
|
|
INTERNAL_SERVER_ERROR = 500
|
|
};
|
|
|
|
class alignas(4) ResponsePacket : public Packet {
|
|
public:
|
|
union {
|
|
struct {
|
|
PacketCategory packetType;
|
|
RequestType requestType;
|
|
DataType dataType;
|
|
std::uint16_t packetLength;
|
|
ResponseStatusCode responseStatusCode;
|
|
std::uint8_t data[1493];
|
|
} __data;
|
|
std::uint8_t serialized[1500] = "";
|
|
};
|
|
std::uint8_t* convToN() {
|
|
__data.packetLength = ::htons(__data.packetLength);
|
|
__data.responseStatusCode = (ResponseStatusCode)::htons((std::uint16_t)__data.responseStatusCode);
|
|
return serialized;
|
|
}
|
|
std::uint8_t* convToH() {
|
|
__data.packetLength = ::ntohs(__data.packetLength);
|
|
__data.responseStatusCode = (ResponseStatusCode)::ntohs((std::uint16_t)__data.responseStatusCode);
|
|
return serialized;
|
|
}
|
|
};
|
|
|
|
class alignas(4) LoginResponsePacket : public ResponsePacket {
|
|
public:
|
|
union {
|
|
struct {
|
|
PacketCategory packetType;
|
|
RequestType requestType;
|
|
DataType dataType;
|
|
std::uint16_t packetLength;
|
|
ResponseStatusCode responseStatusCode;
|
|
std::uint16_t yourId[4];
|
|
std::uint8_t data[];
|
|
} __data;
|
|
std::uint8_t serialized[1500] = "";
|
|
};
|
|
std::uint8_t* convToN() {
|
|
__data.packetLength = ::htons(__data.packetLength);
|
|
__data.responseStatusCode = (ResponseStatusCode)::htons((std::uint16_t)__data.responseStatusCode);
|
|
for (int i = 0; i < 4; i++)
|
|
__data.yourId[i] = ::htons(__data.yourId[i]);
|
|
return serialized;
|
|
}
|
|
std::uint8_t* convToH() {
|
|
__data.packetLength = ::ntohs(__data.packetLength);
|
|
__data.responseStatusCode = (ResponseStatusCode)::ntohs((std::uint16_t)__data.responseStatusCode);
|
|
for (int i = 0; i < 4; i++)
|
|
__data.yourId[i] = ::ntohs(__data.yourId[i]);
|
|
return serialized;
|
|
}
|
|
};
|
|
|
|
class alignas(4) RoomCreateResponsePacket : public ResponsePacket {
|
|
public:
|
|
union {
|
|
struct {
|
|
PacketCategory packetType;
|
|
RequestType requestType;
|
|
DataType dataType;
|
|
std::uint16_t packetLength;
|
|
ResponseStatusCode responseStatusCode;
|
|
std::uint16_t createdRoomId[4];
|
|
std::uint8_t data[];
|
|
} __data;
|
|
std::uint8_t serialized[1500] = "";
|
|
};
|
|
std::uint8_t* convToN() {
|
|
__data.packetLength = ::htons(__data.packetLength);
|
|
__data.responseStatusCode = (ResponseStatusCode)::htons((std::uint16_t)__data.responseStatusCode);
|
|
for (int i = 0; i < 4; i++)
|
|
__data.createdRoomId[i] = ::htons(__data.createdRoomId[i]);
|
|
return serialized;
|
|
}
|
|
std::uint8_t* convToH() {
|
|
__data.packetLength = ::ntohs(__data.packetLength);
|
|
__data.responseStatusCode = (ResponseStatusCode)::ntohs((std::uint16_t)__data.responseStatusCode);
|
|
for (int i = 0; i < 4; i++)
|
|
__data.createdRoomId[i] = ::ntohs(__data.createdRoomId[i]);
|
|
return serialized;
|
|
}
|
|
};
|
|
|
|
class alignas(4) RoomListResponsePacket : public ResponsePacket {
|
|
public:
|
|
union {
|
|
struct {
|
|
PacketCategory packetType;
|
|
RequestType requestType;
|
|
DataType dataType;
|
|
std::uint16_t packetLength;
|
|
ResponseStatusCode responseStatusCode;
|
|
std::uint32_t roomCount;
|
|
std::uint16_t roomId[4];
|
|
std::uint8_t name[];
|
|
} __data;
|
|
std::uint8_t serialized[1500] = "";
|
|
};
|
|
std::uint8_t* convToN() {
|
|
__data.packetLength = ::htons(__data.packetLength);
|
|
__data.responseStatusCode = (ResponseStatusCode)::htons((std::uint16_t)__data.responseStatusCode);
|
|
__data.roomCount = ::htonl(__data.roomCount);
|
|
for (int i = 0; i < 4; i++)
|
|
__data.roomId[i] = ::htons(__data.roomId[i]);
|
|
return serialized;
|
|
}
|
|
std::uint8_t* convToH() {
|
|
__data.packetLength = ::ntohs(__data.packetLength);
|
|
__data.responseStatusCode = (ResponseStatusCode)::ntohs((std::uint16_t)__data.responseStatusCode);
|
|
__data.roomCount = ::ntohl(__data.roomCount);
|
|
for (int i = 0; i < 4; i++)
|
|
__data.roomId[i] = ::ntohs(__data.roomId[i]);
|
|
return serialized;
|
|
}
|
|
};
|
|
|
|
class alignas(4) RoomJoinResponsePacket : public ResponsePacket {};
|
|
|
|
class alignas(4) RoomExitResponsePacket : public ResponsePacket {};
|
|
|
|
class alignas(4) UsersListResponsePacket : public ResponsePacket {
|
|
public:
|
|
union {
|
|
struct {
|
|
PacketCategory packetType;
|
|
RequestType requestType;
|
|
DataType dataType;
|
|
std::uint16_t packetLength;
|
|
ResponseStatusCode responseStatusCode;
|
|
std::uint32_t usersCount;
|
|
std::uint16_t userId[4];
|
|
std::uint8_t name[];
|
|
} __data;
|
|
std::uint8_t serialized[1500] = "";
|
|
};
|
|
std::uint8_t* convToN() {
|
|
__data.packetLength = ::htons(__data.packetLength);
|
|
__data.responseStatusCode = (ResponseStatusCode)::htons((std::uint16_t)__data.responseStatusCode);
|
|
for (int i = 0; i < 4; i++)
|
|
__data.userId[i] = ::htons(__data.userId[i]);
|
|
return serialized;
|
|
}
|
|
std::uint8_t* convToH() {
|
|
__data.packetLength = ::ntohs(__data.packetLength);
|
|
__data.responseStatusCode = (ResponseStatusCode)::ntohs((std::uint16_t)__data.responseStatusCode);
|
|
for (int i = 0; i < 4; i++)
|
|
__data.userId[i] = ::ntohs(__data.userId[i]);
|
|
return serialized;
|
|
}
|
|
};
|
|
|
|
} |