diff --git a/matchbox_server/src/state.rs b/matchbox_server/src/state.rs index 237d966b..c5ab75ab 100644 --- a/matchbox_server/src/state.rs +++ b/matchbox_server/src/state.rs @@ -33,6 +33,7 @@ pub(crate) struct ServerState { clients_in_queue: StateObj>, clients: StateObj>, rooms: StateObj>>, + matched_by_next: StateObj>>, } impl SignalingState for ServerState {} @@ -81,6 +82,11 @@ impl ServerState { } Some(num_players) => { if peers.len() == num_players - 1 { + let mut matched_by_next = self.matched_by_next.lock().unwrap(); + let mut updated_peers = peers.clone(); + updated_peers.insert(peer_id); + matched_by_next.insert(updated_peers.into_iter().collect()); + peers.clear(); // room is complete } else { peers.insert(peer_id); @@ -91,6 +97,27 @@ impl ServerState { prev_peers } + pub fn remove_matched_peer(&mut self, peer: PeerId) -> Vec { + let mut matched_by_next = self.matched_by_next.lock().unwrap(); + let mut peers = vec![]; + matched_by_next.retain(|group| { + if group.contains(&peer) { + peers = group.clone(); + return false; + } + + true + }); + + peers.retain(|p| p != &peer); + + if !peers.is_empty() { + matched_by_next.insert(peers.clone()); + } + + peers + } + /// Get a peer pub fn get_peer(&self, peer_id: &PeerId) -> Option { let clients = self.clients.lock().unwrap(); diff --git a/matchbox_server/src/topology.rs b/matchbox_server/src/topology.rs index 41d16176..ebc825c1 100644 --- a/matchbox_server/src/topology.rs +++ b/matchbox_server/src/topology.rs @@ -98,10 +98,23 @@ impl SignalingTopology for MatchmakingDemoTopology { .filter(|other_id| *other_id != peer_id); // Tell each connected peer about the disconnected peer. let event = Message::Text(JsonPeerEvent::PeerLeft(removed_peer.uuid).to_string()); - for peer_id in other_peers { - match state.try_send(peer_id, event.clone()) { - Ok(()) => info!("Sent peer remove to: {:?}", peer_id), - Err(e) => error!("Failure sending peer remove: {e:?}"), + + //Check if the peer was matched by next? + let matcheds = state.remove_matched_peer(peer_id); + if !matcheds.is_empty() { + //Those where matched by next? + for matched in matcheds { + match state.try_send(matched, event.clone()) { + Ok(()) => info!("Sent peer remove to: {:?}", peer_id), + Err(e) => error!("Failure sending peer remove: {e:?}"), + } + } + } else { + for peer_id in other_peers { + match state.try_send(peer_id, event.clone()) { + Ok(()) => info!("Sent peer remove to: {:?}", peer_id), + Err(e) => error!("Failure sending peer remove: {e:?}"), + } } } }