From 56df1d03eccf1d8e592af5bbd905863964ea028d Mon Sep 17 00:00:00 2001 From: Nikita Vilunov Date: Mon, 3 Jun 2024 17:15:26 +0200 Subject: [PATCH] use PlayerConnectionResult enum --- crates/lavina-core/src/lib.rs | 4 ++-- crates/lavina-core/src/player.rs | 8 ++++---- crates/projection-irc/src/lib.rs | 9 ++++++--- crates/projection-xmpp/src/lib.rs | 11 +++++++---- src/http.rs | 16 +++++++++++----- 5 files changed, 30 insertions(+), 18 deletions(-) diff --git a/crates/lavina-core/src/lib.rs b/crates/lavina-core/src/lib.rs index a8bd30f..5c1821d 100644 --- a/crates/lavina-core/src/lib.rs +++ b/crates/lavina-core/src/lib.rs @@ -8,7 +8,7 @@ use prometheus::Registry as MetricsRegistry; use crate::clustering::broadcast::Broadcasting; use crate::clustering::{ClusterConfig, ClusterMetadata, LavinaClient}; use crate::dialog::DialogRegistry; -use crate::player::{PlayerConnection, PlayerId, PlayerRegistry}; +use crate::player::{PlayerConnectionResult, PlayerId, PlayerRegistry}; use crate::repo::Storage; use crate::room::{RoomHandle, RoomId, RoomInfo, RoomRegistry}; @@ -37,7 +37,7 @@ impl Deref for LavinaCore { } impl LavinaCore { - pub async fn connect_to_player(&self, player_id: &PlayerId) -> Result> { + pub async fn connect_to_player(&self, player_id: &PlayerId) -> Result { self.services.players.connect_to_player(&self, player_id).await } diff --git a/crates/lavina-core/src/player.rs b/crates/lavina-core/src/player.rs index 3c430f4..da4c615 100644 --- a/crates/lavina-core/src/player.rs +++ b/crates/lavina-core/src/player.rs @@ -317,7 +317,7 @@ impl PlayerRegistry { } #[tracing::instrument(skip(self, core), name = "PlayerRegistry::get_or_launch_player")] - pub async fn get_or_launch_player(&self, core: &LavinaCore, id: &PlayerId) -> Result> { + async fn get_or_launch_player(&self, core: &LavinaCore, id: &PlayerId) -> Result> { let inner = self.0.read().await; if let Some((handle, _)) = inner.players.get(id) { Ok(Some(handle.clone())) @@ -338,11 +338,11 @@ impl PlayerRegistry { } #[tracing::instrument(skip(self, core), name = "PlayerRegistry::connect_to_player")] - pub async fn connect_to_player(&self, core: &LavinaCore, id: &PlayerId) -> Result> { + pub async fn connect_to_player(&self, core: &LavinaCore, id: &PlayerId) -> Result { let Some(player_handle) = self.get_or_launch_player(core, id).await? else { - return Ok(None); + return Ok(PlayerConnectionResult::PlayerNotFound); }; - Ok(Some(player_handle.subscribe().await)) + Ok(PlayerConnectionResult::Success(player_handle.subscribe().await)) } pub async fn shutdown_all(&self) { diff --git a/crates/projection-irc/src/lib.rs b/crates/projection-irc/src/lib.rs index 93f5949..1dcea2a 100644 --- a/crates/projection-irc/src/lib.rs +++ b/crates/projection-irc/src/lib.rs @@ -437,9 +437,12 @@ async fn handle_registered_socket<'a>( log::info!("Handling registered user: {user:?}"); let player_id = PlayerId::from(user.nickname.clone())?; - let Some(mut connection) = core.connect_to_player(&player_id).await? else { - tracing::error!("Authorized user unexpectedly not found in the database"); - return Err(anyhow!("no such user")); + let mut connection = match core.connect_to_player(&player_id).await? { + PlayerConnectionResult::Success(connection) => connection, + PlayerConnectionResult::PlayerNotFound => { + tracing::error!("Authorized user unexpectedly not found in the database"); + return Err(anyhow!("no such user")); + } }; let text: Str = format!("Welcome to {} Server", &config.server_name).into(); diff --git a/crates/projection-xmpp/src/lib.rs b/crates/projection-xmpp/src/lib.rs index 2ac7ca2..88e71f3 100644 --- a/crates/projection-xmpp/src/lib.rs +++ b/crates/projection-xmpp/src/lib.rs @@ -23,7 +23,7 @@ use tokio_rustls::rustls::{Certificate, PrivateKey}; use tokio_rustls::TlsAcceptor; use lavina_core::auth::Verdict; -use lavina_core::player::{ConnectionMessage, PlayerConnection, PlayerId, StopReason}; +use lavina_core::player::{ConnectionMessage, PlayerConnection, PlayerConnectionResult, PlayerId, StopReason}; use lavina_core::prelude::*; use lavina_core::terminator::Terminator; use lavina_core::LavinaCore; @@ -202,9 +202,12 @@ async fn handle_socket( authenticated = socket_auth(&mut xml_reader, &mut xml_writer, &mut reader_buf, &core, &hostname) => { match authenticated { Ok(authenticated) => { - let Some(mut connection) = core.connect_to_player(&authenticated.player_id).await? else { - tracing::error!("Authorized user unexpectedly not found in the database"); - return Err(anyhow!("no such user")); + let mut connection = match core.connect_to_player(&authenticated.player_id).await? { + PlayerConnectionResult::Success(connection) => connection, + PlayerConnectionResult::PlayerNotFound => { + tracing::error!("Authorized user unexpectedly not found in the database"); + return Err(anyhow!("no such user")); + } }; socket_final( &mut xml_reader, diff --git a/src/http.rs b/src/http.rs index 96a5a6b..9bc189d 100644 --- a/src/http.rs +++ b/src/http.rs @@ -13,7 +13,7 @@ use serde::{Deserialize, Serialize}; use tokio::net::TcpListener; use lavina_core::auth::UpdatePasswordResult; -use lavina_core::player::{PlayerId, SendMessageResult}; +use lavina_core::player::{PlayerConnectionResult, PlayerId, SendMessageResult}; use lavina_core::prelude::*; use lavina_core::room::RoomId; use lavina_core::terminator::Terminator; @@ -170,8 +170,11 @@ async fn endpoint_send_room_message( let Ok(player_id) = PlayerId::from(req.author_id) else { return Ok(player_not_found()); }; - let Some(mut connection) = core.connect_to_player(&player_id).await? else { - return Ok(player_not_found()); + let mut connection = match core.connect_to_player(&player_id).await? { + PlayerConnectionResult::Success(connection) => connection, + PlayerConnectionResult::PlayerNotFound => { + return Ok(player_not_found()); + } }; let res = connection.send_message(room_id, req.message.into()).await?; match res { @@ -195,8 +198,11 @@ async fn endpoint_set_room_topic( let Ok(player_id) = PlayerId::from(req.author_id) else { return Ok(player_not_found()); }; - let Some(mut connection) = core.connect_to_player(&player_id).await? else { - return Ok(player_not_found()); + let mut connection = match core.connect_to_player(&player_id).await? { + PlayerConnectionResult::Success(connection) => connection, + PlayerConnectionResult::PlayerNotFound => { + return Ok(player_not_found()); + } }; connection.change_topic(room_id, req.topic.into()).await?; Ok(empty_204_request())