summaryrefslogtreecommitdiffstats
path: root/src/network
diff options
context:
space:
mode:
Diffstat (limited to 'src/network')
-rw-r--r--src/network/room.cpp19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/network/room.cpp b/src/network/room.cpp
index 3caa3aeae..6dc7db341 100644
--- a/src/network/room.cpp
+++ b/src/network/room.cpp
@@ -2,6 +2,7 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
+#include <algorithm>
#include <atomic>
#include <random>
#include <thread>
@@ -104,6 +105,12 @@ public:
* @param event The ENet event containing the data
*/
void HandleWifiPacket(const ENetEvent* event);
+
+ /**
+ * Removes the client from the members list if it was in it and announces the change
+ * to all other clients.
+ */
+ void HandleClientDisconnection(ENetPeer* client);
};
// RoomImpl
@@ -125,7 +132,7 @@ void Room::RoomImpl::ServerLoop() {
enet_packet_destroy(event.packet);
break;
case ENET_EVENT_TYPE_DISCONNECT:
- // TODO(B3N30): Handle the disconnect from a client
+ HandleClientDisconnection(event.peer);
break;
}
}
@@ -264,6 +271,16 @@ void Room::RoomImpl::HandleWifiPacket(const ENetEvent* event) {
enet_host_flush(server);
}
+void Room::RoomImpl::HandleClientDisconnection(ENetPeer* client) {
+ // Remove the client from the members list.
+ members.erase(std::remove_if(members.begin(), members.end(),
+ [&](const Member& member) { return member.peer == client; }),
+ members.end());
+
+ // Announce the change to all clients.
+ BroadcastRoomInformation();
+}
+
// Room
Room::Room() : room_impl{std::make_unique<RoomImpl>()} {}