From 4717861f65b4f56204fc637da7fbdead02ddc4f3 Mon Sep 17 00:00:00 2001 From: michael-bailey Date: Wed, 21 Sep 2022 17:26:38 +0100 Subject: [PATCH] created chat manager and added it to the client manager --- .../chat_manager/chat_manager.rs | 47 ++++++++++++++----- .../chat_manager/message_type.rs | 4 +- .../chat_manager/messages.rs | 18 +++++-- .../src/client_management/chat_manager/mod.rs | 7 +++ .../src/client_management/client_manager.rs | 3 ++ server/src/client_management/mod.rs | 5 +- 6 files changed, 66 insertions(+), 18 deletions(-) diff --git a/server/src/client_management/chat_manager/chat_manager.rs b/server/src/client_management/chat_manager/chat_manager.rs index 6821db6..523f0c9 100644 --- a/server/src/client_management/chat_manager/chat_manager.rs +++ b/server/src/client_management/chat_manager/chat_manager.rs @@ -1,25 +1,39 @@ -use actix::{Actor, Context, Handler}; +use actix::{Actor, Addr, Context, Handler}; use uuid::Uuid; use crate::client_management::chat_manager::{ - message_type::Message, messages::ChatManagerMessage, + message_type::Message, + messages::{ChatManagerDataMessage, ChatManagerDataResponse, ChatManagerMessage}, }; -struct ChatManager { +pub(crate) struct ChatManager { messages: Vec, } impl ChatManager { - pub fn new() -> Self { + pub fn new() -> Addr { Self { messages: Vec::new(), } + .start() } // no need for a remove methods because this is a read only system - pub fn add_message(&mut self, id: Uuid, content: String) { + fn add_message(&mut self, _ctx: &mut Context, id: Uuid, content: String) { self.messages.push(Message::new(id, content)) } + + fn get_messages(&self, _ctx: &mut Context) -> ChatManagerDataResponse { + ChatManagerDataResponse::GotMessages(self.messages.clone()) + } + + fn get_message( + &self, + _ctx: &mut Context, + index: usize, + ) -> ChatManagerDataResponse { + ChatManagerDataResponse::GotMessage(self.messages.get(index).cloned()) + } } impl Actor for ChatManager { @@ -29,13 +43,24 @@ impl Actor for ChatManager { impl Handler for ChatManager { type Result = (); - fn handle( - &mut self, - msg: ChatManagerMessage, - _ctx: &mut Self::Context, - ) -> Self::Result { + fn handle(&mut self, msg: ChatManagerMessage, ctx: &mut Self::Context) -> Self::Result { match msg { - ChatManagerMessage::AddMessage(id, content) => self.add_message(id, content), + ChatManagerMessage::AddMessage(id, content) => self.add_message(ctx, id, content), + } + } +} + +impl Handler for ChatManager { + type Result = ChatManagerDataResponse; + + fn handle( + &mut self, + msg: ChatManagerDataMessage, + ctx: &mut Self::Context, + ) -> Self::Result { + match msg { + ChatManagerDataMessage::GetMessages => self.get_messages(ctx), + ChatManagerDataMessage::GetMessage(index) => self.get_message(ctx, index), } } } diff --git a/server/src/client_management/chat_manager/message_type.rs b/server/src/client_management/chat_manager/message_type.rs index 60e3fab..6adf0bd 100644 --- a/server/src/client_management/chat_manager/message_type.rs +++ b/server/src/client_management/chat_manager/message_type.rs @@ -1,8 +1,9 @@ use chrono::{DateTime, Local}; - use uuid::Uuid; +#[derive(Clone)] pub struct Message { + id: Uuid, from: Uuid, content: String, time: DateTime, @@ -11,6 +12,7 @@ pub struct Message { impl Message { pub fn new(from: Uuid, content: String) -> Self { Self { + id: Uuid::new(), from, content, time: Local::now(), diff --git a/server/src/client_management/chat_manager/messages.rs b/server/src/client_management/chat_manager/messages.rs index 50db9ae..62f1574 100644 --- a/server/src/client_management/chat_manager/messages.rs +++ b/server/src/client_management/chat_manager/messages.rs @@ -1,15 +1,23 @@ -use actix::{Message, MessageResponse}; +use actix::{Message as ActixMessage, MessageResponse}; use uuid::Uuid; -#[derive(Message, Debug)] +use super::Message; + +#[derive(ActixMessage, Debug)] #[rtype(result = "()")] pub enum ChatManagerMessage { AddMessage(Uuid, String), } -#[derive(Message, Debug)] +#[derive(ActixMessage, Debug)] #[rtype(result = "ChatManagerDataResponse")] -pub enum ChatManagerDataMessage {} +pub enum ChatManagerDataMessage { + GetMessages, + GetMessage(usize), +} #[derive(MessageResponse)] -pub enum ChatManagerDataResponse {} +pub enum ChatManagerDataResponse { + GotMessages(Vec), + GotMessage(Option), +} diff --git a/server/src/client_management/chat_manager/mod.rs b/server/src/client_management/chat_manager/mod.rs index 68f04ed..b241019 100644 --- a/server/src/client_management/chat_manager/mod.rs +++ b/server/src/client_management/chat_manager/mod.rs @@ -1,5 +1,12 @@ +//! Contains all the structures for managing chat storage. +//! it contains: +//! - ChatManager +//! - Messages +//! - Mesage type + mod chat_manager; mod message_type; mod messages; +pub(crate) use chat_manager::ChatManager; use message_type::Message; diff --git a/server/src/client_management/client_manager.rs b/server/src/client_management/client_manager.rs index 1b4e1d4..e8c9424 100644 --- a/server/src/client_management/client_manager.rs +++ b/server/src/client_management/client_manager.rs @@ -15,6 +15,7 @@ use tokio_stream::StreamExt; use uuid::Uuid; use crate::client_management::{ + chat_manager::ChatManager, client::{ Client, ClientDataMessage, @@ -34,6 +35,7 @@ use crate::client_management::{ pub struct ClientManager { clients: HashMap>, + chat_manager: Addr, _delegate: WeakRecipient, } @@ -42,6 +44,7 @@ impl ClientManager { ClientManager { _delegate: delegate, clients: HashMap::new(), + chat_manager: ChatManager::new(), } .start() } diff --git a/server/src/client_management/mod.rs b/server/src/client_management/mod.rs index 718cf53..d8210e7 100644 --- a/server/src/client_management/mod.rs +++ b/server/src/client_management/mod.rs @@ -12,8 +12,11 @@ pub mod client; mod client_manager; mod messages; +use chat_manager::ChatManager; pub(crate) use client_manager::ClientManager; pub(crate) use messages::{ - ClientManagerDataMessage, ClientManagerDataResponse, ClientManagerMessage, + ClientManagerDataMessage, + ClientManagerDataResponse, + ClientManagerMessage, ClientManagerOutput, };