From 7dbe997184de08ee2b0a3f12ae2f7cda12df36e2 Mon Sep 17 00:00:00 2001 From: Henauxg <19689618+Henauxg@users.noreply.github.com> Date: Mon, 24 Oct 2022 19:02:09 +0200 Subject: [examples] Add a terminal chat example --- examples/chat_server/main.rs | 108 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 examples/chat_server/main.rs (limited to 'examples/chat_server') diff --git a/examples/chat_server/main.rs b/examples/chat_server/main.rs new file mode 100644 index 0000000..bb3318e --- /dev/null +++ b/examples/chat_server/main.rs @@ -0,0 +1,108 @@ +use std::collections::HashMap; + +use bevy::{app::ScheduleRunnerPlugin, log::LogPlugin, prelude::*}; +use bevy_quinnet::{ + server::{QuinnetServerPlugin, Server, ServerConfigurationData}, + ClientId, +}; + +use chat_protocol::{ClientMessage, ServerMessage}; + +#[path = "../chat_protocol/lib.rs"] // Because we can't have a shared lib between Cargo examples +mod chat_protocol; + +#[derive(Debug, Clone, Default)] +struct Users { + names: HashMap, +} + +fn handle_client_messages(mut server: ResMut, mut users: ResMut) { + while let Ok(Some(message)) = server.receive_message::() { + let client_id = message.1; + match message.0 { + ClientMessage::Join { name } => { + if users.names.contains_key(&client_id) { + warn!( + "Received a Join from an already connected client: {}", + client_id + ) + } else { + info!("{} connected", name); + users.names.insert(client_id, name.clone()); + // Initialize this client with existing state + server + .send_message( + client_id, + ServerMessage::InitClient { + client_id: client_id, + usernames: users.names.clone(), + }, + ) + .unwrap(); + // Broadcast the connection event + server + .send_group_message( + users.names.keys().into_iter(), + ServerMessage::ClientConnected { + client_id: client_id, + username: name, + }, + ) + .unwrap(); + } + } + ClientMessage::Disconnect {} => { + if !users.names.contains_key(&client_id) { + warn!( + "Received a Disconnect from an unknown or disconnected client: {}", + client_id + ) + } else { + server.disconnect_client(client_id); + let 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); + } + } + ClientMessage::ChatMessage { message } => { + info!( + "Chat message | {:?}: {}", + users.names.get(&client_id), + message + ); + server + .send_group_message( + users.names.keys().into_iter(), + ServerMessage::ChatMessage { + client_id: client_id, + message: message, + }, + ) + .unwrap(); + } + } + } +} + +fn main() { + App::new() + .add_plugin(ScheduleRunnerPlugin::default()) + .add_plugin(LogPlugin::default()) + .add_plugin(QuinnetServerPlugin::default()) + .insert_resource(ServerConfigurationData::new( + "127.0.0.1".to_string(), + 5000, + "127.0.0.1".to_string(), + )) + .insert_resource(Users::default()) + .add_system(handle_client_messages) + .run(); +} -- cgit v1.2.3