summaryrefslogtreecommitdiff
path: root/src/network/room.cpp
diff options
context:
space:
mode:
authorGravatar B3n302017-07-09 12:26:03 +0200
committerGravatar B3n302017-07-16 21:29:49 +0200
commit42e57c121896818f9fbde5ddd9b7dbb5b2a267b1 (patch)
treeb3f27a02bc2cda201297c48fb52dfbc0efba326b /src/network/room.cpp
parentNetwork: Handle the disconnect of a client (diff)
downloadyuzu-42e57c121896818f9fbde5ddd9b7dbb5b2a267b1.tar.gz
yuzu-42e57c121896818f9fbde5ddd9b7dbb5b2a267b1.tar.xz
yuzu-42e57c121896818f9fbde5ddd9b7dbb5b2a267b1.zip
Network: Enable sending and receiving chat messages
Diffstat (limited to '')
-rw-r--r--src/network/room.cpp38
1 files changed, 38 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(),