# HG changeset patch # User alfadur # Date 1549549062 -10800 # Node ID 25c564f77b7d87c3204a2a198d9ef77f8484a69e # Parent 6a2e13e36b7f8bb702eddef242dbcd1e47e021df remove lobby room diff -r 6a2e13e36b7f -r 25c564f77b7d rust/hedgewars-server/src/server/actions.rs --- a/rust/hedgewars-server/src/server/actions.rs Thu Feb 07 17:02:24 2019 +0300 +++ b/rust/hedgewars-server/src/server/actions.rs Thu Feb 07 17:17:42 2019 +0300 @@ -16,11 +16,17 @@ #[cfg(feature = "official-server")] use super::database; +pub enum DestinationRoom { + All, + Lobby, + Room(RoomId), +} + pub enum Destination { ToId(ClientId), ToSelf, ToAll { - room_id: Option, + room_id: DestinationRoom, protocol: Option, skip_self: bool, }, @@ -48,7 +54,7 @@ pub fn send_all(message: HWServerMessage) -> PendingMessage { let destination = Destination::ToAll { - room_id: None, + room_id: DestinationRoom::All, protocol: None, skip_self: false, }; @@ -63,7 +69,17 @@ ref mut room_id, .. } = self.destination { - *room_id = Some(clients_room_id) + *room_id = DestinationRoom::Room(clients_room_id) + } + self + } + + pub fn in_lobby(mut self) -> PendingMessage { + if let Destination::ToAll { + ref mut room_id, .. + } = self.destination + { + *room_id = DestinationRoom::Lobby } self } diff -r 6a2e13e36b7f -r 25c564f77b7d rust/hedgewars-server/src/server/core.rs --- a/rust/hedgewars-server/src/server/core.rs Thu Feb 07 17:02:24 2019 +0300 +++ b/rust/hedgewars-server/src/server/core.rs Thu Feb 07 17:17:42 2019 +0300 @@ -57,7 +57,6 @@ pub struct HWServer { pub clients: IndexSlab, pub rooms: Slab, - pub lobby_id: RoomId, pub output: Vec<(Vec, HWServerMessage)>, pub removed_clients: Vec, pub io: Box, @@ -68,17 +67,14 @@ pub fn new(clients_limit: usize, rooms_limit: usize, io: Box) -> Self { let rooms = Slab::with_capacity(rooms_limit); let clients = IndexSlab::with_capacity(clients_limit); - let mut server = Self { + Self { clients, rooms, - lobby_id: 0, output: vec![], removed_clients: vec![], io, anteroom: HWAnteroom::new(clients_limit), - }; - server.lobby_id = server.add_room().id; - server + } } pub fn add_client(&mut self, client_id: ClientId, data: HWAnteClient) { @@ -119,10 +115,6 @@ move_to_room(&mut self.clients[client_id], &mut self.rooms[room_id]) } - pub fn lobby(&self) -> &HWRoom { - &self.rooms[self.lobby_id] - } - pub fn has_room(&self, name: &str) -> bool { self.rooms.iter().any(|(_, r)| r.name == name) } @@ -158,6 +150,10 @@ self.clients.iter().filter(f).map(|(_, c)| c.id).collect() } + pub fn lobby_clients(&self) -> Vec { + self.select_clients(|(_, c)| c.room_id == None) + } + pub fn room_clients(&self, room_id: RoomId) -> Vec { self.select_clients(|(_, c)| c.room_id == Some(room_id)) } diff -r 6a2e13e36b7f -r 25c564f77b7d rust/hedgewars-server/src/server/handlers.rs --- a/rust/hedgewars-server/src/server/handlers.rs Thu Feb 07 17:02:24 2019 +0300 +++ b/rust/hedgewars-server/src/server/handlers.rs Thu Feb 07 17:17:42 2019 +0300 @@ -1,7 +1,11 @@ use mio; use std::{io, io::Write}; -use super::{actions::Destination, core::HWServer, coretypes::ClientId}; +use super::{ + actions::{Destination, DestinationRoom}, + core::HWServer, + coretypes::ClientId, +}; use crate::{ protocol::messages::{HWProtocolMessage, HWServerMessage, HWServerMessage::*}, server::actions::PendingMessage, @@ -81,7 +85,12 @@ Destination::ToSelf => vec![client_id], Destination::ToId(id) => vec![id], Destination::ToAll { - room_id: Some(id), .. + room_id: DestinationRoom::Lobby, + .. + } => server.lobby_clients(), + Destination::ToAll { + room_id: DestinationRoom::Room(id), + .. } => server.room_clients(id), Destination::ToAll { protocol: Some(proto), diff -r 6a2e13e36b7f -r 25c564f77b7d rust/hedgewars-server/src/server/handlers/common.rs --- a/rust/hedgewars-server/src/server/handlers/common.rs Thu Feb 07 17:02:24 2019 +0300 +++ b/rust/hedgewars-server/src/server/handlers/common.rs Thu Feb 07 17:17:42 2019 +0300 @@ -51,7 +51,7 @@ response.add(Notice("NickAlreadyInUse".to_string()).send_self()); } } else { - server.clients[client_id].room_id = Some(server.lobby_id); + server.clients[client_id].room_id = None; let lobby_nicks: Vec<_> = server .clients @@ -76,7 +76,6 @@ server .rooms .iter() - .filter(|(id, _)| *id != server.lobby_id) .flat_map(|(_, r)| r.info(r.master_id.map(|id| &server.clients[id]))) .collect(), ); @@ -95,7 +94,6 @@ is_in_game: bool, response: &mut Response, ) { - let mut game_ended = false; if let Some(ref mut info) = room.game_info { for team_name in &team_names { info.left_teams.push(team_name.clone()); @@ -172,6 +170,8 @@ } } + client.room_id = None; + let update_msg = if room.players_number == 0 && !room.is_fixed() { RoomRemove(room.name.clone()) } else { @@ -186,33 +186,30 @@ let client = &mut server.clients[client_id]; if let Some(room_id) = client.room_id { - if room_id != server.lobby_id { - let room = &mut server.rooms[room_id]; + let room = &mut server.rooms[room_id]; - remove_client_from_room(client, room, response, msg); - client.room_id = Some(server.lobby_id); + remove_client_from_room(client, room, response, msg); - if !room.is_fixed() && room.master_id == None { - if let Some(new_master_id) = server.room_clients(room_id).first().cloned() { - let new_master_nick = server.clients[new_master_id].nick.clone(); - let room = &mut server.rooms[room_id]; - room.master_id = Some(new_master_id); - server.clients[new_master_id].set_is_master(true); + if !room.is_fixed() && room.master_id == None { + if let Some(new_master_id) = server.room_clients(room_id).first().cloned() { + let new_master_nick = server.clients[new_master_id].nick.clone(); + let room = &mut server.rooms[room_id]; + room.master_id = Some(new_master_id); + server.clients[new_master_id].set_is_master(true); - if room.protocol_number < 42 { - room.name = new_master_nick.clone(); - } + if room.protocol_number < 42 { + room.name = new_master_nick.clone(); + } - room.set_join_restriction(false); - room.set_team_add_restriction(false); - room.set_unregistered_players_restriction(true); + room.set_join_restriction(false); + room.set_team_add_restriction(false); + room.set_unregistered_players_restriction(true); - response.add( - ClientFlags("+h".to_string(), vec![new_master_nick]) - .send_all() - .in_room(room.id), - ); - } + response.add( + ClientFlags("+h".to_string(), vec![new_master_nick]) + .send_all() + .in_room(room.id), + ); } } } @@ -220,7 +217,6 @@ pub fn remove_client(server: &mut HWServer, response: &mut Response, msg: String) { let client_id = response.client_id(); - let lobby_id = server.lobby_id; let client = &mut server.clients[client_id]; let (nick, room_id) = (client.nick.clone(), client.room_id); diff -r 6a2e13e36b7f -r 25c564f77b7d rust/hedgewars-server/src/server/handlers/inroom.rs --- a/rust/hedgewars-server/src/server/handlers/inroom.rs Thu Feb 07 17:02:24 2019 +0300 +++ b/rust/hedgewars-server/src/server/handlers/inroom.rs Thu Feb 07 17:17:42 2019 +0300 @@ -111,7 +111,6 @@ use crate::protocol::messages::HWProtocolMessage::*; match message { Part(msg) => { - let lobby_id = server.lobby_id; if let (client, Some(room)) = server.client_and_room(client_id) { let msg = match msg { Some(s) => format!("part: {}", s), diff -r 6a2e13e36b7f -r 25c564f77b7d rust/hedgewars-server/src/server/handlers/lobby.rs --- a/rust/hedgewars-server/src/server/handlers/lobby.rs Thu Feb 07 17:02:24 2019 +0300 +++ b/rust/hedgewars-server/src/server/handlers/lobby.rs Thu Feb 07 17:17:42 2019 +0300 @@ -50,7 +50,7 @@ msg, } .send_all() - .in_room(server.lobby_id) + .in_lobby() .but_self(), ); }