R-Type
Distributed multiplayer game engine in C++
Loading...
Searching...
No Matches
ChatMessage.hpp
Go to the documentation of this file.
1/*
2** EPITECH PROJECT, 2025
3** Created on 13/01/2026.
4** File description:
5** ChatMessage.hpp
6*/
7
8#pragma once
9
10#include <capnp/message.h>
11#include <capnp/serialize.h>
12#include <cstdint>
13#include <stdexcept>
14#include <string>
15#include <vector>
16#include "schemas/s2c_messages.capnp.h"
17
18namespace RType::Messages::S2C {
19
27 public:
28 uint32_t playerId;
29 std::string playerName;
30 std::string message;
31 uint64_t timestamp;
32
33 S2CChatMessage() = default;
34 S2CChatMessage(uint32_t pId, const std::string &pName, const std::string &msg, uint64_t ts)
35 : playerId(pId), playerName(pName), message(msg), timestamp(ts) {}
36
40 [[nodiscard]] std::vector<uint8_t> serialize() const {
41 capnp::MallocMessageBuilder messageBuilder;
42 auto builder = messageBuilder.initRoot<::S2CChatMessage>();
43
44 builder.setPlayerId(playerId);
45 builder.setPlayerName(playerName);
46 builder.setMessage(message);
47 builder.setTimestamp(timestamp);
48
49 auto bytes = capnp::messageToFlatArray(messageBuilder);
50 auto byteArray = bytes.asBytes();
51 return std::vector<uint8_t>(byteArray.begin(), byteArray.end());
52 }
53
57 static S2CChatMessage deserialize(const std::vector<uint8_t> &data) {
58 KJ_REQUIRE(data.size() % sizeof(capnp::word) == 0,
59 "Serialized data size must be a multiple of capnp::word");
60 auto aligned = kj::heapArray<uint8_t>(data.size());
61 memcpy(aligned.begin(), data.data(), data.size());
62 kj::ArrayPtr<const capnp::word> words(reinterpret_cast<const capnp::word *>(aligned.begin()),
63 data.size() / sizeof(capnp::word));
64
65 capnp::FlatArrayMessageReader messageReader(words);
66 auto reader = messageReader.getRoot<::S2CChatMessage>();
67
68 S2CChatMessage result;
69 result.playerId = reader.getPlayerId();
70 result.playerName = reader.getPlayerName().cStr();
71 result.message = reader.getMessage().cStr();
72 result.timestamp = reader.getTimestamp();
73
74 return result;
75 }
76 };
77
78} // namespace RType::Messages::S2C
Chat message sent from server to clients.
std::vector< uint8_t > serialize() const
Serialize to byte vector.
static S2CChatMessage deserialize(const std::vector< uint8_t > &data)
Deserialize from byte vector.
S2CChatMessage(uint32_t pId, const std::string &pName, const std::string &msg, uint64_t ts)
Server-to-Client messages.
Definition Server.hpp:34