aboutsummaryrefslogtreecommitdiff
path: root/examples/breakout/server.rs
diff options
context:
space:
mode:
Diffstat (limited to 'examples/breakout/server.rs')
-rw-r--r--examples/breakout/server.rs74
1 files changed, 74 insertions, 0 deletions
diff --git a/examples/breakout/server.rs b/examples/breakout/server.rs
new file mode 100644
index 0000000..d015269
--- /dev/null
+++ b/examples/breakout/server.rs
@@ -0,0 +1,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();
+}