summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/network/room.cpp38
-rw-r--r--src/network/room_member.cpp29
-rw-r--r--src/network/room_member.h12
3 files changed, 79 insertions, 0 deletions
diff --git a/src/network/room.cpp b/src/network/room.cpp
index 6dc7db341..0fdb5e68f 100644
--- a/src/network/room.cpp
+++ b/src/network/room.cpp
@@ -107,6 +107,12 @@ public:
107 void HandleWifiPacket(const ENetEvent* event); 107 void HandleWifiPacket(const ENetEvent* event);
108 108
109 /** 109 /**
110 * Extracts a chat entry from a received ENet packet and adds it to the chat queue.
111 * @param event The ENet event that was received.
112 */
113 void HandleChatPacket(const ENetEvent* event);
114
115 /**
110 * Removes the client from the members list if it was in it and announces the change 116 * Removes the client from the members list if it was in it and announces the change
111 * to all other clients. 117 * to all other clients.
112 */ 118 */
@@ -128,6 +134,9 @@ void Room::RoomImpl::ServerLoop() {
128 case IdWifiPacket: 134 case IdWifiPacket:
129 HandleWifiPacket(&event); 135 HandleWifiPacket(&event);
130 break; 136 break;
137 case IdChatMessage:
138 HandleChatPacket(&event);
139 break;
131 } 140 }
132 enet_packet_destroy(event.packet); 141 enet_packet_destroy(event.packet);
133 break; 142 break;
@@ -271,6 +280,35 @@ void Room::RoomImpl::HandleWifiPacket(const ENetEvent* event) {
271 enet_host_flush(server); 280 enet_host_flush(server);
272} 281}
273 282
283void Room::RoomImpl::HandleChatPacket(const ENetEvent* event) {
284 Packet in_packet;
285 in_packet.Append(event->packet->data, event->packet->dataLength);
286
287 in_packet.IgnoreBytes(sizeof(MessageID));
288 std::string message;
289 in_packet >> message;
290 auto CompareNetworkAddress = [&](const Member member) -> bool {
291 return member.peer == event->peer;
292 };
293 const auto sending_member = std::find_if(members.begin(), members.end(), CompareNetworkAddress);
294 if (sending_member == members.end()) {
295 return; // Received a chat message from a unknown sender
296 }
297
298 Packet out_packet;
299 out_packet << static_cast<MessageID>(IdChatMessage);
300 out_packet << sending_member->nickname;
301 out_packet << message;
302
303 ENetPacket* enet_packet = enet_packet_create(out_packet.GetData(), out_packet.GetDataSize(),
304 ENET_PACKET_FLAG_RELIABLE);
305 for (auto it = members.begin(); it != members.end(); ++it) {
306 if (it->peer != event->peer)
307 enet_peer_send(it->peer, 0, enet_packet);
308 }
309 enet_host_flush(server);
310}
311
274void Room::RoomImpl::HandleClientDisconnection(ENetPeer* client) { 312void Room::RoomImpl::HandleClientDisconnection(ENetPeer* client) {
275 // Remove the client from the members list. 313 // Remove the client from the members list.
276 members.erase(std::remove_if(members.begin(), members.end(), 314 members.erase(std::remove_if(members.begin(), members.end(),
diff --git a/src/network/room_member.cpp b/src/network/room_member.cpp
index f919e4de0..d68bb551d 100644
--- a/src/network/room_member.cpp
+++ b/src/network/room_member.cpp
@@ -68,6 +68,12 @@ public:
68 * @param event The ENet event that was received. 68 * @param event The ENet event that was received.
69 */ 69 */
70 void HandleWifiPackets(const ENetEvent* event); 70 void HandleWifiPackets(const ENetEvent* event);
71
72 /**
73 * Extracts a chat entry from a received ENet packet and adds it to the chat queue.
74 * @param event The ENet event that was received.
75 */
76 void HandleChatPacket(const ENetEvent* event);
71}; 77};
72 78
73// RoomMemberImpl 79// RoomMemberImpl
@@ -89,6 +95,9 @@ void RoomMember::RoomMemberImpl::ReceiveLoop() {
89 if (event.type == ENET_EVENT_TYPE_RECEIVE) { 95 if (event.type == ENET_EVENT_TYPE_RECEIVE) {
90 switch (event.packet->data[0]) { 96 switch (event.packet->data[0]) {
91 // TODO(B3N30): Handle the other message types 97 // TODO(B3N30): Handle the other message types
98 case IdChatMessage:
99 HandleChatPacket(&event);
100 break;
92 case IdRoomInformation: 101 case IdRoomInformation:
93 HandleRoomInformationPacket(&event); 102 HandleRoomInformationPacket(&event);
94 break; 103 break;
@@ -208,6 +217,19 @@ void RoomMember::RoomMemberImpl::HandleWifiPackets(const ENetEvent* event) {
208 // TODO(B3N30): Invoke callbacks 217 // TODO(B3N30): Invoke callbacks
209} 218}
210 219
220void RoomMember::RoomMemberImpl::HandleChatPacket(const ENetEvent* event) {
221 Packet packet;
222 packet.Append(event->packet->data, event->packet->dataLength);
223
224 // Ignore the first byte, which is the message id.
225 packet.IgnoreBytes(sizeof(MessageID));
226
227 ChatEntry chat_entry{};
228 packet >> chat_entry.nickname;
229 packet >> chat_entry.message;
230 // TODO(B3N30): Invoke callbacks
231}
232
211// RoomMember 233// RoomMember
212RoomMember::RoomMember() : room_member_impl{std::make_unique<RoomMemberImpl>()} { 234RoomMember::RoomMember() : room_member_impl{std::make_unique<RoomMemberImpl>()} {
213 room_member_impl->client = enet_host_create(nullptr, 1, NumChannels, 0, 0); 235 room_member_impl->client = enet_host_create(nullptr, 1, NumChannels, 0, 0);
@@ -273,6 +295,13 @@ void RoomMember::SendWifiPacket(const WifiPacket& wifi_packet) {
273 room_member_impl->Send(packet); 295 room_member_impl->Send(packet);
274} 296}
275 297
298void RoomMember::SendChatMessage(const std::string& message) {
299 Packet packet;
300 packet << static_cast<MessageID>(IdChatMessage);
301 packet << message;
302 room_member_impl->Send(packet);
303}
304
276void RoomMember::Leave() { 305void RoomMember::Leave() {
277 ASSERT_MSG(room_member_impl->receive_thread != nullptr, "Must be in a room to leave it."); 306 ASSERT_MSG(room_member_impl->receive_thread != nullptr, "Must be in a room to leave it.");
278 { 307 {
diff --git a/src/network/room_member.h b/src/network/room_member.h
index d23f5d4b6..693aa4e7f 100644
--- a/src/network/room_member.h
+++ b/src/network/room_member.h
@@ -24,6 +24,12 @@ struct WifiPacket {
24 uint8_t channel; ///< WiFi channel where this frame was transmitted. 24 uint8_t channel; ///< WiFi channel where this frame was transmitted.
25}; 25};
26 26
27/// Represents a chat message.
28struct ChatEntry {
29 std::string nickname; ///< Nickname of the client who sent this message.
30 std::string message; ///< Body of the message.
31};
32
27/** 33/**
28 * This is what a client [person joining a server] would use. 34 * This is what a client [person joining a server] would use.
29 * It also has to be used if you host a game yourself (You'd create both, a Room and a 35 * It also has to be used if you host a game yourself (You'd create both, a Room and a
@@ -88,6 +94,12 @@ public:
88 void SendWifiPacket(const WifiPacket& packet); 94 void SendWifiPacket(const WifiPacket& packet);
89 95
90 /** 96 /**
97 * Sends a chat message to the room.
98 * @param message The contents of the message.
99 */
100 void SendChatMessage(const std::string& message);
101
102 /**
91 * Leaves the current room. 103 * Leaves the current room.
92 */ 104 */
93 void Leave(); 105 void Leave();