# HG changeset patch # User alfadur # Date 1554936134 -10800 # Node ID 0e64acbc3f8bd1a485ef733f69a6f5d02d6ef4bc # Parent 8ecdb5c6bb2ae6ca223706546596af713455c061 implement follow message diff -r 8ecdb5c6bb2a -r 0e64acbc3f8b rust/hedgewars-server/src/protocol/messages.rs --- a/rust/hedgewars-server/src/protocol/messages.rs Thu Apr 11 01:13:29 2019 +0300 +++ b/rust/hedgewars-server/src/protocol/messages.rs Thu Apr 11 01:42:14 2019 +0300 @@ -130,6 +130,7 @@ RoomLeft(String, String), RoomRemove(String), RoomUpdated(String, Vec), + Joining(String), TeamAdd(Vec), TeamRemove(String), TeamAccepted(String), @@ -379,6 +380,7 @@ RoomLeft(nick, msg) => msg!["LEFT", nick, msg], RoomRemove(name) => msg!["ROOM", "DEL", name], RoomUpdated(name, info) => construct_message(&["ROOM", "UPD", name], &info), + Joining(name) => msg!["JOINING", name], TeamAdd(info) => construct_message(&["ADD_TEAM"], &info), TeamRemove(name) => msg!["REMOVE_TEAM", name], TeamAccepted(name) => msg!["TEAM_ACCEPTED", name], diff -r 8ecdb5c6bb2a -r 0e64acbc3f8b rust/hedgewars-server/src/server/handlers/common.rs --- a/rust/hedgewars-server/src/server/handlers/common.rs Thu Apr 11 01:13:29 2019 +0300 +++ b/rust/hedgewars-server/src/server/handlers/common.rs Thu Apr 11 01:42:14 2019 +0300 @@ -191,6 +191,33 @@ ); } +pub fn enter_room( + server: &mut HWServer, + client_id: ClientId, + room_id: RoomId, + response: &mut Response, +) { + let nick = server.clients[client_id].nick.clone(); + server.move_to_room(client_id, room_id); + + response.add(RoomJoined(vec![nick.clone()]).send_all().in_room(room_id)); + response.add(ClientFlags(add_flags(&[Flags::InRoom]), vec![nick]).send_all()); + let nicks = server.collect_nicks(|(_, c)| c.room_id == Some(room_id)); + response.add(RoomJoined(nicks).send_self()); + + let room = &server.rooms[room_id]; + + if !room.greeting.is_empty() { + response.add( + ChatMsg { + nick: "[greeting]".to_string(), + msg: room.greeting.clone(), + } + .send_self(), + ); + } +} + pub fn exit_room(server: &mut HWServer, client_id: ClientId, response: &mut Response, msg: &str) { let client = &mut server.clients[client_id]; diff -r 8ecdb5c6bb2a -r 0e64acbc3f8b rust/hedgewars-server/src/server/handlers/lobby.rs --- a/rust/hedgewars-server/src/server/handlers/lobby.rs Thu Apr 11 01:13:29 2019 +0300 +++ b/rust/hedgewars-server/src/server/handlers/lobby.rs Thu Apr 11 01:42:14 2019 +0300 @@ -6,6 +6,7 @@ add_flags, remove_flags, HWProtocolMessage, HWServerMessage::*, ProtocolFlags as Flags, }, server::{ + client::HWClient, core::HWServer, coretypes::{ClientId, ServerVar}, }, @@ -83,30 +84,23 @@ } else if room.players_number == u8::max_value() { response.add(Warning("This room is already full".to_string()).send_self()); } else if let Some(room_id) = room_id { - let nick = client.nick.clone(); - server.move_to_room(client_id, room_id); - - response.add(RoomJoined(vec![nick.clone()]).send_all().in_room(room_id)); - response.add(ClientFlags(add_flags(&[Flags::InRoom]), vec![nick]).send_all()); - let nicks = server.collect_nicks(|(_, c)| c.room_id == Some(room_id)); - response.add(RoomJoined(nicks).send_self()); - - let room = &server.rooms[room_id]; - - if !room.greeting.is_empty() { - response.add( - ChatMsg { - nick: "[greeting]".to_string(), - msg: room.greeting.clone(), - } - .send_self(), - ); - } + super::common::enter_room(server, client_id, room_id, response); } } else { response.add(Warning("No such room.".to_string()).send_self()); } } + Follow(nick) => { + if let Some(HWClient { + room_id: Some(room_id), + .. + }) = server.find_client(&nick) + { + let room = &server.rooms[*room_id]; + response.add(Joining(room.name.clone()).send_self()); + super::common::enter_room(server, client_id, *room_id, response); + } + } SetServerVar(var) => { if !server.clients[client_id].is_admin() { response.add(Warning("Access denied.".to_string()).send_self());