#pragma once #include "Utils/Snowflake.hpp" #include "precomp.hpp" namespace Chattr { enum class PacketSet { LOGINREQUEST, ROOMCREATEREQUEST, ROOMLISTREQUEST, ROOMJOINREQUEST, ROOMEXITREQUEST, USERSLISTREQUEST, DATAPOST, 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 myId[4]; std::uint16_t roomId[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.myId[i] = ::htons(__data.myId[i]); __data.roomId[i] = ::htons(__data.roomId[i]); } return serialized; } std::uint8_t* convToH() { __data.packetLength = ::ntohs(__data.packetLength); for (int i = 0; i < 4; i++) { __data.myId[i] = ::ntohs(__data.myId[i]); __data.roomId[i] = ::ntohs(__data.roomId[i]); } return serialized; } }; class alignas(4) RoomExitRequestPacket : public Packet { public: union { struct { PacketCategory packetType; RequestType requestType; DataType dataType; std::uint16_t packetLength; std::uint16_t myId[4]; std::uint16_t roomId[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.myId[i] = ::htons(__data.myId[i]); __data.roomId[i] = ::htons(__data.roomId[i]); } return serialized; } std::uint8_t* convToH() { __data.packetLength = ::ntohs(__data.packetLength); for (int i = 0; i < 4; i++) { __data.myId[i] = ::ntohs(__data.myId[i]); __data.roomId[i] = ::ntohs(__data.roomId[i]); } return serialized; } }; 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 sourceId[4]; 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.sourceId[i] = ::htons(__data.sourceId[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.sourceId[i] = ::ntohs(__data.sourceId[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 { RES_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; } }; }