aboutsummaryrefslogtreecommitdiff
path: root/examples/breakout/server.rs
blob: d01526912ddc5ced9186405149dd00519d82c4bb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
use std::collections::HashMap;

use bevy::prelude::{info, warn, EventReader, ResMut};
use bevy_quinnet::{
    server::{CertificateRetrievalMode, ConnectionLostEvent, Server, ServerConfigurationData},
    ClientId,
};

use crate::protocol::{ClientMessage, ServerMessage};

#[derive(Debug, Clone, Default)]
pub(crate) struct Users {
    names: HashMap<ClientId, String>,
}

pub(crate) fn handle_client_messages(mut server: ResMut<Server>, mut users: ResMut<Users>) {
    while let Ok(Some((message, client_id))) = server.receive_message::<ClientMessage>() {
        match message {
            ClientMessage::Join {} => {}
            ClientMessage::Disconnect {} => {
                // We tell the server to disconnect this user
                server.disconnect_client(client_id);
                handle_disconnect(&mut server, &mut users, client_id);
            }
            ClientMessage::PaddleInput {} => todo!(),
        }
    }
}

pub(crate) fn handle_server_events(
    mut connection_lost_events: EventReader<ConnectionLostEvent>,
    mut server: ResMut<Server>,
    mut users: ResMut<Users>,
) {
    // The server signals us about users that lost connection
    for client in connection_lost_events.iter() {
        handle_disconnect(&mut server, &mut users, client.id);
    }
}

/// Shared disconnection behaviour, whether the client lost connection or asked to disconnect
pub(crate) fn handle_disconnect(
    server: &mut ResMut<Server>,
    users: &mut ResMut<Users>,
    client_id: ClientId,
) {
    // Remove this user
    if let Some(username) = users.names.remove(&client_id) {
        // Broadcast its deconnection
        server
            .send_group_message(
                users.names.keys().into_iter(),
                ServerMessage::ClientDisconnected {
                    client_id: client_id,
                },
            )
            .unwrap();
        info!("{} disconnected", username);
    } else {
        warn!(
            "Received a Disconnect from an unknown or disconnected client: {}",
            client_id
        )
    }
}

pub(crate) fn start_listening(server: ResMut<Server>) {
    server
        .start(
            ServerConfigurationData::new("127.0.0.1".to_string(), 6000, "0.0.0.0".to_string()),
            CertificateRetrievalMode::GenerateSelfSigned,
        )
        .unwrap();
}