#pragma once #include "Utils/Snowflake.hpp" #include "precomp.hpp" namespace Chattr { enum class PacketType : 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 }; enum class DataType : std::uint8_t { TEXT, BINARY }; class alignas(4) Packet { public: union { struct { PacketType packetType; RequestType requestType; DataType dataType; std::uint16_t packetLength; std::uint8_t data[1484]; } __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 { public: union { struct { PacketType packetType; RequestType requestType; DataType dataType; std::uint16_t packetLength; std::uint8_t name[]; } __data; std::uint8_t serialized[1500]; }; }; class alignas(4) RoomCreateRequestPacket : public Packet { public: union { struct { PacketType packetType; RequestType requestType; DataType dataType; std::uint16_t packetLength; std::uint8_t name[]; } __data; std::uint8_t serialized[1500]; }; }; class alignas(4) RoomListRequestPacket : public Packet { public: union { struct { PacketType packetType; RequestType requestType; DataType dataType; std::uint16_t packetLength; std::uint32_t roomCount; std::uint8_t name[]; } __data; std::uint8_t serialized[1500]; }; }; class alignas(4) RoomJoinRequestPacket : public Packet { public: union { struct { PacketType packetType; RequestType requestType; DataType dataType; std::uint16_t packetLength; std::uint8_t name[]; } __data; std::uint8_t serialized[1500]; }; }; class alignas(4) RoomExitRequestPacket : public Packet { public: union { struct { PacketType packetType; RequestType requestType; DataType dataType; std::uint16_t packetLength; std::uint8_t data[]; } __data; std::uint8_t serialized[1500]; }; }; class alignas(4) UsersListRequestPacket : public Packet { public: union { struct { PacketType packetType; RequestType requestType; DataType dataType; std::uint16_t packetLength; std::uint32_t usersCount; std::uint8_t name[]; } __data; std::uint8_t serialized[1500]; }; }; class alignas(4) DataPostPacket : public Packet { public: union { struct { PacketType packetType; RequestType requestType; DataType dataType; std::uint16_t packetLength; std::uint8_t name[]; } __data; std::uint8_t serialized[1500]; }; }; class alignas(4) ContinuePacket : public Packet { public: union { struct { std::uint16_t packetLength; std::uint8_t data[]; } __data; std::uint8_t serialized[1500]; }; }; 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 { PacketType packetType; RequestType requestType; DataType dataType; std::uint16_t packetLength; ResponseStatusCode responseStatusCode; std::uint8_t data[]; } __data; std::uint8_t serialized[1500]; }; }; }