rust/hedgewars-server/src/handlers/inlobby.rs
author alfadur
Mon, 25 Mar 2024 16:05:11 +0300
changeset 16000 d9f1b239b6d7
parent 15991 00bf5adba849
child 16001 8ba2b5007c29
permissions -rw-r--r--
fix rejoining
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15439
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
     1
use super::{common::rnd_reply, strings::*};
15848
3d05bada4799 Implement appropriate routing of checker messages
unC0Rr
parents: 15804
diff changeset
     2
use crate::handlers::{actions::ToPendingMessage, checker};
13666
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13523
diff changeset
     3
use crate::{
15075
e935b1ad23f3 normalize type names
alfadur
parents: 15074
diff changeset
     4
    core::{
e935b1ad23f3 normalize type names
alfadur
parents: 15074
diff changeset
     5
        client::HwClient,
15439
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
     6
        server::{AccessError, CreateRoomError, HwServer, JoinRoomError},
15804
747278149393 Extract network protocol into a separate crate
unc0rr
parents: 15533
diff changeset
     7
        types::ClientId,
14782
50fcef24003f add typed protocol flags
alfadur
parents: 14694
diff changeset
     8
    },
15804
747278149393 Extract network protocol into a separate crate
unc0rr
parents: 15533
diff changeset
     9
    utils::is_name_illegal,
747278149393 Extract network protocol into a separate crate
unc0rr
parents: 15533
diff changeset
    10
};
747278149393 Extract network protocol into a separate crate
unc0rr
parents: 15533
diff changeset
    11
use hedgewars_network_protocol::{
747278149393 Extract network protocol into a separate crate
unc0rr
parents: 15533
diff changeset
    12
    messages::{
15075
e935b1ad23f3 normalize type names
alfadur
parents: 15074
diff changeset
    13
        add_flags, remove_flags, server_chat, HwProtocolMessage, HwServerMessage::*,
e935b1ad23f3 normalize type names
alfadur
parents: 15074
diff changeset
    14
        ProtocolFlags as Flags,
14783
b3adc030104b implement server vars
alfadur
parents: 14782
diff changeset
    15
    },
15804
747278149393 Extract network protocol into a separate crate
unc0rr
parents: 15533
diff changeset
    16
    types::ServerVar,
13416
cdf69667593b partial room implementation
alfadur
parents: 13119
diff changeset
    17
};
13805
0463a4221327 cleanup crate imports
alfadur
parents: 13666
diff changeset
    18
use log::*;
14789
18240b308505 implement stats message
alfadur
parents: 14787
diff changeset
    19
use std::{collections::HashSet, convert::identity};
12147
03ccb89820f3 Room creation halfplemented
unc0rr
parents:
diff changeset
    20
14671
455865ccd36c Server action refactoring part 2 of N
alfadur <mail@none>
parents: 14504
diff changeset
    21
pub fn handle(
15075
e935b1ad23f3 normalize type names
alfadur
parents: 15074
diff changeset
    22
    server: &mut HwServer,
14671
455865ccd36c Server action refactoring part 2 of N
alfadur <mail@none>
parents: 14504
diff changeset
    23
    client_id: ClientId,
455865ccd36c Server action refactoring part 2 of N
alfadur <mail@none>
parents: 14504
diff changeset
    24
    response: &mut super::Response,
15075
e935b1ad23f3 normalize type names
alfadur
parents: 15074
diff changeset
    25
    message: HwProtocolMessage,
14671
455865ccd36c Server action refactoring part 2 of N
alfadur <mail@none>
parents: 14504
diff changeset
    26
) {
15804
747278149393 Extract network protocol into a separate crate
unc0rr
parents: 15533
diff changeset
    27
    use hedgewars_network_protocol::messages::HwProtocolMessage::*;
15439
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    28
15989
fb389df02e3e add some more todo!s
alfadur
parents: 15938
diff changeset
    29
    //todo!("add kick/ban handlers");
15990
c40f5e27aaf0 fix connection errors carrying over to new clients
alfadur
parents: 15989
diff changeset
    30
    //todo!("add command for forwarding lobby chat into rooms
15991
00bf5adba849 a couple more todos
alfadur
parents: 15990
diff changeset
    31
    //todo!("report player account age")
00bf5adba849 a couple more todos
alfadur
parents: 15990
diff changeset
    32
    //todo!("port listing rooms for incompatible protocols"))
15938
ce47259d5c86 add some server todos
alfadur
parents: 15848
diff changeset
    33
12147
03ccb89820f3 Room creation halfplemented
unc0rr
parents:
diff changeset
    34
    match message {
15439
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    35
        CreateRoom(name, password) => match server.create_room(client_id, name, password) {
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    36
            Err(CreateRoomError::InvalidName) => response.warn(ILLEGAL_ROOM_NAME),
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    37
            Err(CreateRoomError::AlreadyExists) => response.warn(ROOM_EXISTS),
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    38
            Ok((client, room)) => {
14671
455865ccd36c Server action refactoring part 2 of N
alfadur <mail@none>
parents: 14504
diff changeset
    39
                response.add(
14504
6cc0fce249f9 Server action refactoring part 1 of N
alfadur <mail@none>
parents: 14457
diff changeset
    40
                    RoomAdd(room.info(Some(&client)))
6cc0fce249f9 Server action refactoring part 1 of N
alfadur <mail@none>
parents: 14457
diff changeset
    41
                        .send_all()
14671
455865ccd36c Server action refactoring part 2 of N
alfadur <mail@none>
parents: 14504
diff changeset
    42
                        .with_protocol(room.protocol_number),
455865ccd36c Server action refactoring part 2 of N
alfadur <mail@none>
parents: 14504
diff changeset
    43
                );
14797
ce2268ae261f add missing room joined message
alfadur
parents: 14789
diff changeset
    44
                response.add(RoomJoined(vec![client.nick.clone()]).send_self());
15439
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    45
                response.add(
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    46
                    ClientFlags(
15533
0606f89698e7 check the room passwords
alfadur <mail@none>
parents: 15526
diff changeset
    47
                        add_flags(&[Flags::RoomMaster, Flags::Ready, Flags::InRoom]),
15439
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    48
                        vec![client.nick.clone()],
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    49
                    )
15533
0606f89698e7 check the room passwords
alfadur <mail@none>
parents: 15526
diff changeset
    50
                    .send_all(),
14782
50fcef24003f add typed protocol flags
alfadur
parents: 14694
diff changeset
    51
                );
15439
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    52
            }
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    53
        },
13119
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents: 12852
diff changeset
    54
        Chat(msg) => {
15989
fb389df02e3e add some more todo!s
alfadur
parents: 15938
diff changeset
    55
            //todo!("add client quiet flag");
14672
6e6632068a33 Server action refactoring part 3 of N
alfadur <mail@none>
parents: 14671
diff changeset
    56
            response.add(
6e6632068a33 Server action refactoring part 3 of N
alfadur <mail@none>
parents: 14671
diff changeset
    57
                ChatMsg {
15533
0606f89698e7 check the room passwords
alfadur <mail@none>
parents: 15526
diff changeset
    58
                    nick: server.client(client_id).nick.clone(),
14672
6e6632068a33 Server action refactoring part 3 of N
alfadur <mail@none>
parents: 14671
diff changeset
    59
                    msg,
6e6632068a33 Server action refactoring part 3 of N
alfadur <mail@none>
parents: 14671
diff changeset
    60
                }
6e6632068a33 Server action refactoring part 3 of N
alfadur <mail@none>
parents: 14671
diff changeset
    61
                .send_all()
14694
25c564f77b7d remove lobby room
alfadur <mail@none>
parents: 14690
diff changeset
    62
                .in_lobby()
14672
6e6632068a33 Server action refactoring part 3 of N
alfadur <mail@none>
parents: 14671
diff changeset
    63
                .but_self(),
6e6632068a33 Server action refactoring part 3 of N
alfadur <mail@none>
parents: 14671
diff changeset
    64
            );
14457
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14415
diff changeset
    65
        }
15533
0606f89698e7 check the room passwords
alfadur <mail@none>
parents: 15526
diff changeset
    66
        JoinRoom(name, password) => {
0606f89698e7 check the room passwords
alfadur <mail@none>
parents: 15526
diff changeset
    67
            match server.join_room_by_name(client_id, &name, password.as_deref()) {
0606f89698e7 check the room passwords
alfadur <mail@none>
parents: 15526
diff changeset
    68
                Err(error) => super::common::get_room_join_error(error, response),
0606f89698e7 check the room passwords
alfadur <mail@none>
parents: 15526
diff changeset
    69
                Ok((client, room, room_clients)) => {
0606f89698e7 check the room passwords
alfadur <mail@none>
parents: 15526
diff changeset
    70
                    super::common::get_room_join_data(client, room, room_clients, response)
0606f89698e7 check the room passwords
alfadur <mail@none>
parents: 15526
diff changeset
    71
                }
15439
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    72
            }
15533
0606f89698e7 check the room passwords
alfadur <mail@none>
parents: 15526
diff changeset
    73
        }
15439
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    74
        Follow(nick) => {
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    75
            if let Some(client) = server.find_client(&nick) {
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    76
                if let Some(room_id) = client.room_id {
15533
0606f89698e7 check the room passwords
alfadur <mail@none>
parents: 15526
diff changeset
    77
                    match server.join_room(client_id, room_id, None) {
15439
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    78
                        Err(error) => super::common::get_room_join_error(error, response),
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    79
                        Ok((client, room, room_clients)) => {
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    80
                            super::common::get_room_join_data(client, room, room_clients, response)
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    81
                        }
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    82
                    }
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    83
                } else {
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    84
                    response.warn(NO_ROOM);
13666
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13523
diff changeset
    85
                }
09f4a30e50cc Rust 2018 conversion
alfadur
parents: 13523
diff changeset
    86
            } else {
15439
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    87
                response.warn(NO_USER);
14672
6e6632068a33 Server action refactoring part 3 of N
alfadur <mail@none>
parents: 14671
diff changeset
    88
            }
14457
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14415
diff changeset
    89
        }
15439
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    90
        SetServerVar(var) => match server.set_var(client_id, var) {
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    91
            Err(AccessError()) => response.warn(ACCESS_DENIED),
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    92
            Ok(()) => response.add(server_chat(VARIABLE_UPDATED.to_string()).send_self()),
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    93
        },
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    94
        GetServerVar => match server.get_vars(client_id) {
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    95
            Err(AccessError()) => response.warn(ACCESS_DENIED),
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    96
            Ok(vars) => {
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    97
                response.add(
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    98
                    ServerVars(vars.iter().flat_map(|v| v.to_protocol()).collect()).send_self(),
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
    99
                );
14787
0e64acbc3f8b implement follow message
alfadur
parents: 14785
diff changeset
   100
            }
15439
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
   101
        },
13445
d3c86ade3d4d Send the rnd reply to the room only.
Marcin Mielniczuk <marmistrz.dev@zoho.eu>
parents: 13444
diff changeset
   102
        Rnd(v) => {
14672
6e6632068a33 Server action refactoring part 3 of N
alfadur <mail@none>
parents: 14671
diff changeset
   103
            response.add(rnd_reply(&v).send_self());
14457
98ef2913ec73 Apply rustfmt to all files
unc0rr
parents: 14415
diff changeset
   104
        }
15439
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
   105
        Stats => match server.get_used_protocols(client_id) {
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
   106
            Err(AccessError()) => response.warn(ACCESS_DENIED),
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
   107
            Ok(protocols) => {
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
   108
                let mut html = Vec::with_capacity(protocols.len() + 2);
14789
18240b308505 implement stats message
alfadur
parents: 14787
diff changeset
   109
15439
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
   110
                html.push("<table>".to_string());
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
   111
                for protocol in protocols {
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
   112
                    html.push(format!(
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
   113
                        "<tr><td>{}</td><td>{}</td><td>{}</td></tr>",
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
   114
                        super::utils::protocol_version_string(protocol),
15526
24f692e791d3 disallow mutable rooms outside the server
alfadur <mail@none>
parents: 15482
diff changeset
   115
                        server.protocol_client_ids(protocol).count(),
24f692e791d3 disallow mutable rooms outside the server
alfadur <mail@none>
parents: 15482
diff changeset
   116
                        server.protocol_room_ids(protocol).count()
15439
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
   117
                    ));
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
   118
                }
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
   119
                html.push("</table>".to_string());
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
   120
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
   121
                response.add(Warning(html.join("")).send_self());
14789
18240b308505 implement stats message
alfadur
parents: 14787
diff changeset
   122
            }
15439
a158ff8f84ef refactor the lobby handler
alfadur
parents: 15075
diff changeset
   123
        },
13119
1e39b8749072 separated the server logic from all the async io mess.
alfadur
parents: 12852
diff changeset
   124
        List => warn!("Deprecated LIST message received"),
12147
03ccb89820f3 Room creation halfplemented
unc0rr
parents:
diff changeset
   125
        _ => warn!("Incorrect command in lobby state"),
03ccb89820f3 Room creation halfplemented
unc0rr
parents:
diff changeset
   126
    }
03ccb89820f3 Room creation halfplemented
unc0rr
parents:
diff changeset
   127
}