From d10cddec61aedeb6dfddb51fa38c90fd1745f57b Mon Sep 17 00:00:00 2001 From: Nikita Vilunov Date: Tue, 14 Feb 2023 19:28:49 +0100 Subject: [PATCH] send channels on connect --- src/core/player.rs | 14 ++++++++++++++ src/projections/irc/mod.rs | 10 +++++++++- src/protos/irc/client.rs | 6 ++++-- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/core/player.rs b/src/core/player.rs index 42a1378..a150d94 100644 --- a/src/core/player.rs +++ b/src/core/player.rs @@ -49,6 +49,10 @@ impl PlayerConnection { .join_room(room_id, self.connection_id.clone()) .await } + + pub async fn send(&self, command: PlayerCommand) { + self.player_handle.send(command).await; + } } /// Handle to a player actor. @@ -149,6 +153,7 @@ pub enum PlayerCommand { connection_id: ConnectionId, body: String, }, + GetRooms(Promise>), /** Events from rooms */ IncomingMessage { room_id: RoomId, @@ -223,6 +228,7 @@ impl Player { let (tx, mut rx) = channel(32); let handle = PlayerHandle { tx }; let handle_clone = handle.clone(); + let mut my_rooms = HashMap::new(); let fiber = tokio::task::spawn(async move { while let Some(cmd) = rx.recv().await { match cmd { @@ -238,6 +244,7 @@ impl Player { let mut room = rooms.get_or_create_room(room_id.clone()); room.subscribe(player_id.clone(), connection_id, handle.clone()) .await; + my_rooms.insert(room_id.clone(), room.clone()); let members = room.get_members().await; promise.send(RoomInfo { id: room_id, @@ -261,6 +268,13 @@ impl Player { } } } + PlayerCommand::GetRooms(promise) => { + let mut response = vec![]; + for (_, handle) in &my_rooms { + response.push(handle.get_room_info().await); + } + promise.send(response); + } PlayerCommand::IncomingMessage { room_id, author, diff --git a/src/projections/irc/mod.rs b/src/projections/irc/mod.rs index 99b18d9..74ba678 100644 --- a/src/projections/irc/mod.rs +++ b/src/projections/irc/mod.rs @@ -8,7 +8,7 @@ use tokio::net::{TcpListener, TcpStream}; use tokio::sync::oneshot::channel; use crate::core::player::{ - ConnectionId, PlayerConnection, PlayerHandle, PlayerId, PlayerRegistry, Updates, + PlayerConnection, PlayerId, PlayerRegistry, Updates, PlayerCommand, }; use crate::core::room::{RoomId, RoomInfo, RoomRegistry}; use crate::prelude::*; @@ -206,6 +206,14 @@ async fn handle_registered_socket<'a>( } .write_async(writer) .await?; + + let (promise, deferred) = oneshot(); + connection.send(PlayerCommand::GetRooms(promise)).await; + let rooms_list = deferred.await?; + for room in &rooms_list { + produce_on_join_cmd_messages(&config, &user, &Chan::Global(room.id.0.clone()), room, writer).await?; + } + writer.flush().await?; loop { diff --git a/src/protos/irc/client.rs b/src/protos/irc/client.rs index 895f90a..2c8614d 100644 --- a/src/protos/irc/client.rs +++ b/src/protos/irc/client.rs @@ -114,8 +114,10 @@ fn client_message_user(input: &[u8]) -> IResult<&[u8], ClientMessage> { let (input, _) = tag("USER ")(input)?; let (input, username) = receiver(input)?; let (input, _) = tag(" ")(input)?; - let (input, _) = take(1_usize)(input)?; // 0 in spec, but any in fact - let (input, _) = tag(" * :")(input)?; + let (input, _) = receiver(input)?; + let (input, _) = tag(" ")(input)?; + let (input, _) = receiver(input)?; + let (input, _) = tag(" :")(input)?; let (input, realname) = token(input)?; Ok((