diff options
Diffstat (limited to 'src/network')
-rw-r--r-- | src/network/room.cpp | 19 |
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>()} {} |