rust/hedgewars-server/src/core/server.rs
changeset 15516 b907b9071ec5
parent 15492 395be40faa51
child 15517 abd5eb807166
equal deleted inserted replaced
15509:6ddfde71ba6a 15516:b907b9071ec5
     4     room::HwRoom,
     4     room::HwRoom,
     5     types::{ClientId, RoomId, ServerVar},
     5     types::{ClientId, RoomId, ServerVar},
     6 };
     6 };
     7 use crate::{protocol::messages::HwProtocolMessage::Greeting, utils};
     7 use crate::{protocol::messages::HwProtocolMessage::Greeting, utils};
     8 
     8 
     9 use crate::core::server::JoinRoomError::WrongProtocol;
       
    10 use bitflags::*;
     9 use bitflags::*;
    11 use log::*;
    10 use log::*;
    12 use slab;
    11 use slab;
    13 use std::{borrow::BorrowMut, collections::HashSet, iter, num::NonZeroU16};
    12 use std::{borrow::BorrowMut, collections::HashSet, iter, mem::replace, num::NonZeroU16};
    14 
    13 
    15 type Slab<T> = slab::Slab<T>;
    14 type Slab<T> = slab::Slab<T>;
    16 
    15 
    17 #[derive(Debug)]
    16 #[derive(Debug)]
    18 pub enum CreateRoomError {
    17 pub enum CreateRoomError {
    62 pub enum StartGameError {
    61 pub enum StartGameError {
    63     NotEnoughClans,
    62     NotEnoughClans,
    64     NotEnoughTeams,
    63     NotEnoughTeams,
    65     NotReady,
    64     NotReady,
    66     AlreadyInGame,
    65     AlreadyInGame,
       
    66 }
       
    67 
       
    68 #[derive(Debug)]
       
    69 pub struct EndGameResult {
       
    70     pub joined_mid_game_clients: Vec<ClientId>,
       
    71     pub left_teams: Vec<String>,
       
    72     pub unreadied_nicks: Vec<String>,
    67 }
    73 }
    68 
    74 
    69 #[derive(Debug)]
    75 #[derive(Debug)]
    70 pub struct UninitializedError();
    76 pub struct UninitializedError();
    71 #[derive(Debug)]
    77 #[derive(Debug)]
   439             }
   445             }
   440             Ok(room_nicks)
   446             Ok(room_nicks)
   441         }
   447         }
   442     }
   448     }
   443 
   449 
       
   450     pub fn end_game(&mut self, room_id: RoomId) -> EndGameResult {
       
   451         let room = &mut self.rooms[room_id];
       
   452         room.ready_players_number = 1;
       
   453 
       
   454         if let Some(info) = replace(&mut room.game_info, None) {
       
   455             let joined_mid_game_clients = self
       
   456                 .clients
       
   457                 .iter()
       
   458                 .filter(|(_, c)| c.room_id == Some(room_id) && c.is_joined_mid_game())
       
   459                 .map(|(_, c)| c.id)
       
   460                 .collect();
       
   461 
       
   462             let unreadied_nicks: Vec<_> = self
       
   463                 .clients
       
   464                 .iter_mut()
       
   465                 .filter(|(_, c)| c.room_id == Some(room_id))
       
   466                 .map(|(_, c)| {
       
   467                     c.set_is_ready(c.is_master());
       
   468                     c.set_is_joined_mid_game(false);
       
   469                     c
       
   470                 })
       
   471                 .filter_map(|c| {
       
   472                     if !c.is_master() {
       
   473                         Some(c.nick.clone())
       
   474                     } else {
       
   475                         None
       
   476                     }
       
   477                 })
       
   478                 .collect();
       
   479 
       
   480             EndGameResult {
       
   481                 joined_mid_game_clients,
       
   482                 left_teams: info.left_teams.clone(),
       
   483                 unreadied_nicks,
       
   484             }
       
   485         } else {
       
   486             unreachable!()
       
   487         }
       
   488     }
       
   489 
   444     #[inline]
   490     #[inline]
   445     pub fn set_var(&mut self, client_id: ClientId, var: ServerVar) -> Result<(), AccessError> {
   491     pub fn set_var(&mut self, client_id: ClientId, var: ServerVar) -> Result<(), AccessError> {
   446         if self.clients[client_id].is_admin() {
   492         if self.clients[client_id].is_admin() {
   447             match var {
   493             match var {
   448                 ServerVar::MOTDNew(msg) => self.greetings.for_latest_protocol = msg,
   494                 ServerVar::MOTDNew(msg) => self.greetings.for_latest_protocol = msg,