# HG changeset patch # User alfadur # Date 1554902073 -10800 # Node ID 50fcef24003f338a6a04ff709e412943f3570d3b # Parent 01f8ab45f806155a79025008074df031774c9605 add typed protocol flags diff -r 01f8ab45f806 -r 50fcef24003f rust/hedgewars-server/src/protocol/messages.rs --- a/rust/hedgewars-server/src/protocol/messages.rs Wed Apr 10 01:13:29 2019 +0300 +++ b/rust/hedgewars-server/src/protocol/messages.rs Wed Apr 10 16:14:33 2019 +0300 @@ -67,6 +67,49 @@ } #[derive(Debug)] +pub enum ProtocolFlags { + InRoom, + RoomMaster, + Ready, + InGame, + Authenticated, + Admin, + Contributor, +} + +impl ProtocolFlags { + #[inline] + fn flag_char(&self) -> char { + match self { + ProtocolFlags::InRoom => 'i', + ProtocolFlags::RoomMaster => 'h', + ProtocolFlags::Ready => 'r', + ProtocolFlags::InGame => 'g', + ProtocolFlags::Authenticated => 'u', + ProtocolFlags::Admin => 'a', + ProtocolFlags::Contributor => 'c', + } + } + + #[inline] + fn format(prefix: char, flags: &[ProtocolFlags]) -> String { + once(prefix) + .chain(flags.iter().map(|f| f.flag_char())) + .collect() + } +} + +#[inline] +pub fn add_flags(flags: &[ProtocolFlags]) -> String { + ProtocolFlags::format('+', flags) +} + +#[inline] +pub fn remove_flags(flags: &[ProtocolFlags]) -> String { + ProtocolFlags::format('-', flags) +} + +#[derive(Debug)] pub enum HWServerMessage { Ping, Pong, diff -r 01f8ab45f806 -r 50fcef24003f rust/hedgewars-server/src/server/handlers/common.rs --- a/rust/hedgewars-server/src/server/handlers/common.rs Wed Apr 10 01:13:29 2019 +0300 +++ b/rust/hedgewars-server/src/server/handlers/common.rs Wed Apr 10 16:14:33 2019 +0300 @@ -1,8 +1,10 @@ use crate::{ protocol::messages::server_chat, protocol::messages::{ + add_flags, remove_flags, HWProtocolMessage::{self, Rnd}, HWServerMessage::{self, *}, + ProtocolFlags as Flags, }, server::{ client::HWClient, @@ -42,7 +44,7 @@ let everyone_msg = LobbyJoined(vec![server.clients[client_id].nick.clone()]); let flags_msg = ClientFlags( - "+i".to_string(), + add_flags(&[Flags::InRoom]), server.collect_nicks(|(_, c)| c.room_id.is_some()), ); let server_msg = ServerMessage("\u{1f994} is watching".to_string()); @@ -136,7 +138,7 @@ if client.is_master() && !room.is_fixed() { client.set_is_master(false); response.add( - ClientFlags("-h".to_string(), vec![client.nick.clone()]) + ClientFlags(remove_flags(&[Flags::RoomMaster]), vec![client.nick.clone()]) .send_all() .in_room(room.id), ); @@ -153,7 +155,7 @@ }; response.add(update_msg.send_all().with_protocol(room.protocol_number)); - response.add(ClientFlags("-i".to_string(), vec![client.nick.clone()]).send_all()); + response.add(ClientFlags(remove_flags(&[Flags::InRoom]), vec![client.nick.clone()]).send_all()); } pub fn exit_room(server: &mut HWServer, client_id: ClientId, response: &mut Response, msg: &str) { @@ -180,7 +182,7 @@ room.set_unregistered_players_restriction(true); response.add( - ClientFlags("+h".to_string(), vec![new_master_nick]) + ClientFlags(add_flags(&[Flags::RoomMaster]), vec![new_master_nick]) .send_all() .in_room(room.id), ); @@ -248,7 +250,11 @@ let room = &server.rooms[room_id]; if let Some(id) = room.master_id { response.add( - ClientFlags("+h".to_string(), vec![server.clients[id].nick.clone()]).send(to_client), + ClientFlags( + add_flags(&[Flags::RoomMaster]), + vec![server.clients[id].nick.clone()], + ) + .send(to_client), ); } let nicks: Vec<_> = server @@ -258,7 +264,7 @@ .map(|(_, c)| c.nick.clone()) .collect(); if !nicks.is_empty() { - response.add(ClientFlags("+r".to_string(), nicks).send(to_client)); + response.add(ClientFlags(add_flags(&[Flags::Ready]), nicks).send(to_client)); } } @@ -409,7 +415,7 @@ } response.add(RunGame.send_all().in_room(room.id)); response.add( - ClientFlags("+g".to_string(), room_nicks) + ClientFlags(add_flags(&[Flags::InGame]), room_nicks) .send_all() .in_room(room.id), ); @@ -469,7 +475,7 @@ let msg = if room.protocol_number < 38 { LegacyReady(false, nicks) } else { - ClientFlags("-r".to_string(), nicks) + ClientFlags(remove_flags(&[Flags::Ready]), nicks) }; response.add(msg.send_all().in_room(room_id)); } diff -r 01f8ab45f806 -r 50fcef24003f rust/hedgewars-server/src/server/handlers/inroom.rs --- a/rust/hedgewars-server/src/server/handlers/inroom.rs Wed Apr 10 01:13:29 2019 +0300 +++ b/rust/hedgewars-server/src/server/handlers/inroom.rs Wed Apr 10 16:14:33 2019 +0300 @@ -3,7 +3,10 @@ use super::common::rnd_reply; use crate::utils::to_engine_msg; use crate::{ - protocol::messages::{server_chat, HWProtocolMessage, HWServerMessage::*}, + protocol::messages::{ + add_flags, remove_flags, server_chat, HWProtocolMessage, HWServerMessage::*, + ProtocolFlags as Flags, + }, server::{ core::HWServer, coretypes, @@ -170,16 +173,16 @@ ToggleReady => { let flags = if client.is_ready() { room.ready_players_number -= 1; - "-r" + remove_flags(&[Flags::Ready]) } else { room.ready_players_number += 1; - "+r" + add_flags(&[Flags::Ready]) }; let msg = if client.protocol_number < 38 { LegacyReady(client.is_ready(), vec![client.nick.clone()]) } else { - ClientFlags(flags.to_string(), vec![client.nick.clone()]) + ClientFlags(flags, vec![client.nick.clone()]) }; response.add(msg.send_all().in_room(room.id)); client.set_is_ready(!client.is_ready()); @@ -505,7 +508,7 @@ if client.is_in_game() { client.set_is_in_game(false); response.add( - ClientFlags("-g".to_string(), vec![client.nick.clone()]) + ClientFlags(remove_flags(&[Flags::InGame]), vec![client.nick.clone()]) .send_all() .in_room(room.id), ); diff -r 01f8ab45f806 -r 50fcef24003f rust/hedgewars-server/src/server/handlers/lobby.rs --- a/rust/hedgewars-server/src/server/handlers/lobby.rs Wed Apr 10 01:13:29 2019 +0300 +++ b/rust/hedgewars-server/src/server/handlers/lobby.rs Wed Apr 10 16:14:33 2019 +0300 @@ -2,7 +2,9 @@ use super::common::rnd_reply; use crate::{ - protocol::messages::{HWProtocolMessage, HWServerMessage::*}, + protocol::messages::{ + add_flags, remove_flags, HWProtocolMessage, HWServerMessage::*, ProtocolFlags as Flags, + }, server::{core::HWServer, coretypes::ClientId}, utils::is_name_illegal, }; @@ -25,7 +27,7 @@ ); } else { let flags_msg = ClientFlags( - "+hr".to_string(), + add_flags(&[Flags::RoomMaster, Flags::Ready]), vec![server.clients[client_id].nick.clone()], ); @@ -40,7 +42,9 @@ ); response.add(flags_msg.send_self()); - response.add(ClientFlags("+i".to_string(), vec![client.nick.clone()]).send_self()); + response.add( + ClientFlags(add_flags(&[Flags::InRoom]), vec![client.nick.clone()]).send_self(), + ); }; } Chat(msg) => { @@ -85,7 +89,7 @@ server.move_to_room(client_id, room_id); response.add(RoomJoined(vec![nick.clone()]).send_all().in_room(room_id)); - response.add(ClientFlags("+i".to_string(), vec![nick]).send_all()); + response.add(ClientFlags(add_flags(&[Flags::InRoom]), vec![nick]).send_all()); response.add(RoomJoined(nicks).send_self()); let room = &server.rooms[room_id];