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/c2s_messages.capnp.h"
17
18namespace RType::Messages::C2S {
19
28 public:
29 std::string message;
30
31 C2SChatMessage() = default;
32 explicit C2SChatMessage(const std::string &msg) : message(msg) {}
33
37 [[nodiscard]] std::vector<uint8_t> serialize() const {
38 capnp::MallocMessageBuilder messageBuilder;
39 auto builder = messageBuilder.initRoot<::C2SChatMessage>();
40
41 builder.setMessage(message);
42
43 auto bytes = capnp::messageToFlatArray(messageBuilder);
44 auto byteArray = bytes.asBytes();
45 return std::vector<uint8_t>(byteArray.begin(), byteArray.end());
46 }
47
51 static C2SChatMessage deserialize(const std::vector<uint8_t> &data) {
52 KJ_REQUIRE(data.size() % sizeof(capnp::word) == 0,
53 "Serialized data size must be a multiple of capnp::word");
54 auto aligned = kj::heapArray<uint8_t>(data.size());
55 memcpy(aligned.begin(), data.data(), data.size());
56 kj::ArrayPtr<const capnp::word> words(reinterpret_cast<const capnp::word *>(aligned.begin()),
57 data.size() / sizeof(capnp::word));
58
59 capnp::FlatArrayMessageReader messageReader(words);
60 auto reader = messageReader.getRoot<::C2SChatMessage>();
61
62 C2SChatMessage result;
63 result.message = reader.getMessage().cStr();
64
65 return result;
66 }
67 };
68
69} // namespace RType::Messages::C2S
Chat message sent from client to server.
std::vector< uint8_t > serialize() const
Serialize to byte vector.
static C2SChatMessage deserialize(const std::vector< uint8_t > &data)
Deserialize from byte vector.
C2SChatMessage(const std::string &msg)
Client-to-Server messages.