aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorHenauxg <19689618+Henauxg@users.noreply.github.com>2022-10-25 18:00:37 +0200
committerHenauxg <19689618+Henauxg@users.noreply.github.com>2022-10-25 18:00:37 +0200
commit6846a4e7c9c16563dad67af176e668cefde8b245 (patch)
treebc3042c2bf85b0efbd19e686ee4208fb4e353fb2 /examples
parent3d95026347fdd9001ac5ebc7ba5b5f3d7998cf34 (diff)
[examples] Use DisconnectionEvent in chat_server
Diffstat (limited to 'examples')
-rw-r--r--examples/chat_server/main.rs58
1 files changed, 39 insertions, 19 deletions
diff --git a/examples/chat_server/main.rs b/examples/chat_server/main.rs
index 81cd209..dee89ab 100644
--- a/examples/chat_server/main.rs
+++ b/examples/chat_server/main.rs
@@ -2,7 +2,7 @@ use std::collections::HashMap;
use bevy::{app::ScheduleRunnerPlugin, log::LogPlugin, prelude::*};
use bevy_quinnet::{
- server::{QuinnetServerPlugin, Server, ServerConfigurationData},
+ server::{DisconnectionEvent, QuinnetServerPlugin, Server, ServerConfigurationData},
ClientId,
};
@@ -18,6 +18,7 @@ struct Users {
fn handle_client_messages(mut server: ResMut<Server>, mut users: ResMut<Users>) {
while let Ok(Some(message)) = server.receive_message::<ClientMessage>() {
+ // Retrieve the assigned ClientId.
let client_id = message.1;
match message.0 {
ClientMessage::Join { name } => {
@@ -52,24 +53,9 @@ fn handle_client_messages(mut server: ResMut<Server>, mut users: ResMut<Users>)
}
}
ClientMessage::Disconnect {} => {
- if let Some(username) = users.names.remove(&client_id) {
- server.disconnect_client(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
- )
- }
+ // We tell the server to disconnect this user
+ server.disconnect_client(client_id);
+ handle_disconnect(&mut server, &mut users, client_id);
}
ClientMessage::ChatMessage { message } => {
info!(
@@ -91,6 +77,39 @@ fn handle_client_messages(mut server: ResMut<Server>, mut users: ResMut<Users>)
}
}
+fn handle_server_events(
+ mut disconnections: EventReader<DisconnectionEvent>,
+ mut server: ResMut<Server>,
+ mut users: ResMut<Users>,
+) {
+ // The server signals us about users that disconnected (connection lost)
+ for client in disconnections.iter() {
+ handle_disconnect(&mut server, &mut users, client.id);
+ }
+}
+
+/// Shared disconnection behaviour, whether the client lost connection or asked to disconnect
+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
+ )
+ }
+}
+
fn main() {
App::new()
.add_plugin(ScheduleRunnerPlugin::default())
@@ -103,5 +122,6 @@ fn main() {
))
.insert_resource(Users::default())
.add_system(handle_client_messages)
+ .add_system(handle_server_events)
.run();
}