From f1bc9b7965ec09e6677192366e3f65de06bdd0c6 Mon Sep 17 00:00:00 2001 From: core Date: Mon, 10 Apr 2023 21:48:44 -0400 Subject: [PATCH] merge conflict generator (clean up naming of handler/manager in server/) --- server/src/handler.rs | 152 +++++++++++++++++++++++++++++++++++++----- server/src/main.rs | 6 +- server/src/manager.rs | 152 +++++------------------------------------- server/src/timer.rs | 2 +- 4 files changed, 156 insertions(+), 156 deletions(-) diff --git a/server/src/handler.rs b/server/src/handler.rs index c16eace098da679b422aca619c71486b6eed5c3c..1c1b108fca8b73a06ccaf6816e20b28fd9861b1a 100644 --- a/server/src/handler.rs +++ b/server/src/handler.rs @@ -1,25 +1,143 @@ -use std::collections::HashMap; - +use std::error::Error; use std::net::SocketAddr; -use std::sync::Arc; +use std::time::{Duration, SystemTime}; +use futures::stream::{SplitSink, SplitStream}; +use futures::{FutureExt, SinkExt, StreamExt}; +use hyper::upgrade::Upgraded; +use log::{error, info, warn}; +use tokio::sync::mpsc::Receiver; +use tokio_tungstenite::WebSocketStream; +use tungstenite::Message; +use starkingdoms_protocol::{GoodbyeReason, MessageC2S, MessageS2C, PROTOCOL_VERSION, State}; +use starkingdoms_protocol::GoodbyeReason::PingPongTimeout; +use crate::manager::{ClientHandlerMessage, ClientManager}; +use crate::{send, recv}; + +pub async fn handle_client(mgr: ClientManager, remote_addr: SocketAddr, mut rx: Receiver, mut client_tx: SplitSink, Message>, mut client_rx: SplitStream>) -> Result<(), Box> { + let mut state = State::Handshake; + let mut username = String::new(); + let mut ping_timeout = SystemTime::now() + Duration::from_secs(5); + + loop { + if let Some(msg) = rx.recv().await { + match msg { + ClientHandlerMessage::Tick => {} // this intentionally does nothing, + ClientHandlerMessage::ChatMessage { from, message } => { + send!(client_tx, &MessageS2C::Chat { + message, + from + }).await?; + } + } + } else { + info!("channel closed, shutting down"); + break; + } + + if ping_timeout < SystemTime::now() { + warn!("[{}] ping timeout", remote_addr); + send!(client_tx, &MessageS2C::Goodbye { + reason: PingPongTimeout + }).await?; + break; + } + + if let Some(pkt) = recv!(client_rx)? { + match state { + State::Handshake => { + match pkt { + MessageC2S::Hello { version, requested_username, next_state } => { + if !matches!(next_state, State::Play) { + error!("client sent unexpected state {:?} (expected: Play)", next_state); + send!(client_tx, &MessageS2C::Goodbye { + reason: GoodbyeReason::UnexpectedNextState, + }).await?; + break; + } -use tokio::sync::mpsc::Sender; -use tokio::sync::RwLock; + // check version + if version != PROTOCOL_VERSION { + error!("client sent incompatible version {} (expected: {})", version, PROTOCOL_VERSION); + send!(client_tx, &MessageS2C::Goodbye { + reason: GoodbyeReason::UnsupportedProtocol { + supported: PROTOCOL_VERSION, + got: version, + }, + }).await?; + break; + } + // determine if we can give them that username + { + if mgr.usernames.read().await.values().any(|u| *u == requested_username) { + error!("client requested username {} but it is in use", requested_username); + send!(client_tx, &MessageS2C::Goodbye { + reason: GoodbyeReason::UsernameTaken, + }).await?; + break; + } + } + // username is fine + { + mgr.usernames.write().await.insert(remote_addr, requested_username.clone()); + } -#[derive(Clone)] -pub struct ClientManager { - pub handlers: Arc>>, - pub usernames: Arc>> -} + send!(client_tx, &MessageS2C::Hello { + version, + given_username: requested_username.clone(), + next_state, + }).await?; + state = next_state; + username = requested_username; + }, + MessageC2S::Goodbye { reason } => { + info!("client sent goodbye: {:?}", reason); + break; + }, + _ => { + error!("client sent unexpected packet {:?} for state {:?}", pkt, state); + send!(client_tx, &MessageS2C::Goodbye { + reason: GoodbyeReason::UnexpectedPacket, + }).await?; + break; + } + } + } + State::Play => { + match pkt { + MessageC2S::Hello { .. } => { + error!("client sent unexpected packet {:?} for state {:?}", pkt, state); + send!(client_tx, &MessageS2C::Goodbye { + reason: GoodbyeReason::UnexpectedPacket, + }).await?; + break; + }, + MessageC2S::Goodbye { reason } => { + info!("client sent goodbye: {:?}", reason); + break; + }, + MessageC2S::Chat { message } => { + info!("[{}] CHAT: [{}] {}", remote_addr, username, message); -#[derive(Clone)] -pub struct ClientHandler { - pub tx: Sender -} + for (_addr, client_thread) in mgr.handlers.read().await.iter() { + match client_thread.tx.send(ClientHandlerMessage::ChatMessage { from: username.clone(), message: message.clone() }).await { + Ok(_) => (), + Err(e) => { + error!("unable to update a client thread: {}", e); + } + } + } + }, + MessageC2S::Ping {} => { + send!(client_tx, &MessageS2C::Pong {}).await?; + ping_timeout = SystemTime::now() + Duration::from_secs(5); + } + } + } + } + } + } -pub enum ClientHandlerMessage { - Tick, - ChatMessage { from: String, message: String } + Ok(()) } \ No newline at end of file diff --git a/server/src/main.rs b/server/src/main.rs index ac200dab398405a7dedbd7dddf9ffa4e205f759d..8f2418b705e5a3fc1c16cf6979202f577e55be11 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -11,12 +11,12 @@ use log::{error, info, Level}; use serde::{Deserialize, Serialize}; use tokio::sync::RwLock; use starkingdoms_protocol::{PROTOCOL_VERSION}; -use crate::handler::{ClientHandler, ClientManager}; -use crate::manager::handle_client; +use crate::manager::{ClientHandler, ClientManager}; +use crate::handler::handle_client; use crate::timer::timer_main; -pub mod manager; pub mod handler; +pub mod manager; pub mod timer; #[macro_use] pub mod macros; diff --git a/server/src/manager.rs b/server/src/manager.rs index 14efe33ea79b8f0df4cace6aa8ed9fb6d977f911..c16eace098da679b422aca619c71486b6eed5c3c 100644 --- a/server/src/manager.rs +++ b/server/src/manager.rs @@ -1,143 +1,25 @@ -use std::error::Error; -use std::net::SocketAddr; -use std::time::{Duration, SystemTime}; -use futures::stream::{SplitSink, SplitStream}; -use futures::{FutureExt, SinkExt, StreamExt}; -use hyper::upgrade::Upgraded; -use log::{error, info, warn}; -use tokio::sync::mpsc::Receiver; -use tokio_tungstenite::WebSocketStream; -use tungstenite::Message; -use starkingdoms_protocol::{GoodbyeReason, MessageC2S, MessageS2C, PROTOCOL_VERSION, State}; -use starkingdoms_protocol::GoodbyeReason::PingPongTimeout; -use crate::handler::{ClientHandlerMessage, ClientManager}; -use crate::{send, recv}; - -pub async fn handle_client(mgr: ClientManager, remote_addr: SocketAddr, mut rx: Receiver, mut client_tx: SplitSink, Message>, mut client_rx: SplitStream>) -> Result<(), Box> { - let mut state = State::Handshake; - let mut username = String::new(); - let mut ping_timeout = SystemTime::now() + Duration::from_secs(5); - - loop { - if let Some(msg) = rx.recv().await { - match msg { - ClientHandlerMessage::Tick => {} // this intentionally does nothing, - ClientHandlerMessage::ChatMessage { from, message } => { - send!(client_tx, &MessageS2C::Chat { - message, - from - }).await?; - } - } - } else { - info!("channel closed, shutting down"); - break; - } +use std::collections::HashMap; - if ping_timeout < SystemTime::now() { - warn!("[{}] ping timeout", remote_addr); - send!(client_tx, &MessageS2C::Goodbye { - reason: PingPongTimeout - }).await?; - break; - } - - if let Some(pkt) = recv!(client_rx)? { - match state { - State::Handshake => { - match pkt { - MessageC2S::Hello { version, requested_username, next_state } => { - if !matches!(next_state, State::Play) { - error!("client sent unexpected state {:?} (expected: Play)", next_state); - send!(client_tx, &MessageS2C::Goodbye { - reason: GoodbyeReason::UnexpectedNextState, - }).await?; - break; - } +use std::net::SocketAddr; +use std::sync::Arc; - // check version - if version != PROTOCOL_VERSION { - error!("client sent incompatible version {} (expected: {})", version, PROTOCOL_VERSION); - send!(client_tx, &MessageS2C::Goodbye { - reason: GoodbyeReason::UnsupportedProtocol { - supported: PROTOCOL_VERSION, - got: version, - }, - }).await?; - break; - } +use tokio::sync::mpsc::Sender; +use tokio::sync::RwLock; - // determine if we can give them that username - { - if mgr.usernames.read().await.values().any(|u| *u == requested_username) { - error!("client requested username {} but it is in use", requested_username); - send!(client_tx, &MessageS2C::Goodbye { - reason: GoodbyeReason::UsernameTaken, - }).await?; - break; - } - } - // username is fine - { - mgr.usernames.write().await.insert(remote_addr, requested_username.clone()); - } - send!(client_tx, &MessageS2C::Hello { - version, - given_username: requested_username.clone(), - next_state, - }).await?; - state = next_state; - username = requested_username; - }, - MessageC2S::Goodbye { reason } => { - info!("client sent goodbye: {:?}", reason); - break; - }, - _ => { - error!("client sent unexpected packet {:?} for state {:?}", pkt, state); - send!(client_tx, &MessageS2C::Goodbye { - reason: GoodbyeReason::UnexpectedPacket, - }).await?; - break; - } - } - } - State::Play => { - match pkt { - MessageC2S::Hello { .. } => { - error!("client sent unexpected packet {:?} for state {:?}", pkt, state); - send!(client_tx, &MessageS2C::Goodbye { - reason: GoodbyeReason::UnexpectedPacket, - }).await?; - break; - }, - MessageC2S::Goodbye { reason } => { - info!("client sent goodbye: {:?}", reason); - break; - }, - MessageC2S::Chat { message } => { - info!("[{}] CHAT: [{}] {}", remote_addr, username, message); +#[derive(Clone)] +pub struct ClientManager { + pub handlers: Arc>>, + pub usernames: Arc>> +} - for (_addr, client_thread) in mgr.handlers.read().await.iter() { - match client_thread.tx.send(ClientHandlerMessage::ChatMessage { from: username.clone(), message: message.clone() }).await { - Ok(_) => (), - Err(e) => { - error!("unable to update a client thread: {}", e); - } - } - } - }, - MessageC2S::Ping {} => { - send!(client_tx, &MessageS2C::Pong {}).await?; - ping_timeout = SystemTime::now() + Duration::from_secs(5); - } - } - } - } - } - } +#[derive(Clone)] +pub struct ClientHandler { + pub tx: Sender +} - Ok(()) +pub enum ClientHandlerMessage { + Tick, + ChatMessage { from: String, message: String } } \ No newline at end of file diff --git a/server/src/timer.rs b/server/src/timer.rs index 6e891b015a64984558bffe5500432f2a2a5355d7..4c7490ed16d3a618156711bc7fb70bd1affcc125 100644 --- a/server/src/timer.rs +++ b/server/src/timer.rs @@ -3,7 +3,7 @@ use std::time::Duration; use log::{error}; use tokio::time::sleep; -use crate::handler::{ClientHandlerMessage, ClientManager}; +use crate::manager::{ClientHandlerMessage, ClientManager}; pub async fn timer_main(mgr: ClientManager) { loop {