created chat manager and added it to the client manager

This commit is contained in:
michael-bailey 2022-09-21 17:26:38 +01:00
parent 12ebbc9bd5
commit 4717861f65
6 changed files with 66 additions and 18 deletions

View File

@ -1,25 +1,39 @@
use actix::{Actor, Context, Handler}; use actix::{Actor, Addr, Context, Handler};
use uuid::Uuid; use uuid::Uuid;
use crate::client_management::chat_manager::{ 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<Message>, messages: Vec<Message>,
} }
impl ChatManager { impl ChatManager {
pub fn new() -> Self { pub fn new() -> Addr<Self> {
Self { Self {
messages: Vec::new(), messages: Vec::new(),
} }
.start()
} }
// no need for a remove methods because this is a read only system // 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<Self>, id: Uuid, content: String) {
self.messages.push(Message::new(id, content)) self.messages.push(Message::new(id, content))
} }
fn get_messages(&self, _ctx: &mut Context<Self>) -> ChatManagerDataResponse {
ChatManagerDataResponse::GotMessages(self.messages.clone())
}
fn get_message(
&self,
_ctx: &mut Context<Self>,
index: usize,
) -> ChatManagerDataResponse {
ChatManagerDataResponse::GotMessage(self.messages.get(index).cloned())
}
} }
impl Actor for ChatManager { impl Actor for ChatManager {
@ -29,13 +43,24 @@ impl Actor for ChatManager {
impl Handler<ChatManagerMessage> for ChatManager { impl Handler<ChatManagerMessage> for ChatManager {
type Result = (); type Result = ();
fn handle( fn handle(&mut self, msg: ChatManagerMessage, ctx: &mut Self::Context) -> Self::Result {
&mut self,
msg: ChatManagerMessage,
_ctx: &mut Self::Context,
) -> Self::Result {
match msg { match msg {
ChatManagerMessage::AddMessage(id, content) => self.add_message(id, content), ChatManagerMessage::AddMessage(id, content) => self.add_message(ctx, id, content),
}
}
}
impl Handler<ChatManagerDataMessage> 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),
} }
} }
} }

View File

@ -1,8 +1,9 @@
use chrono::{DateTime, Local}; use chrono::{DateTime, Local};
use uuid::Uuid; use uuid::Uuid;
#[derive(Clone)]
pub struct Message { pub struct Message {
id: Uuid,
from: Uuid, from: Uuid,
content: String, content: String,
time: DateTime<Local>, time: DateTime<Local>,
@ -11,6 +12,7 @@ pub struct Message {
impl Message { impl Message {
pub fn new(from: Uuid, content: String) -> Self { pub fn new(from: Uuid, content: String) -> Self {
Self { Self {
id: Uuid::new(),
from, from,
content, content,
time: Local::now(), time: Local::now(),

View File

@ -1,15 +1,23 @@
use actix::{Message, MessageResponse}; use actix::{Message as ActixMessage, MessageResponse};
use uuid::Uuid; use uuid::Uuid;
#[derive(Message, Debug)] use super::Message;
#[derive(ActixMessage, Debug)]
#[rtype(result = "()")] #[rtype(result = "()")]
pub enum ChatManagerMessage { pub enum ChatManagerMessage {
AddMessage(Uuid, String), AddMessage(Uuid, String),
} }
#[derive(Message, Debug)] #[derive(ActixMessage, Debug)]
#[rtype(result = "ChatManagerDataResponse")] #[rtype(result = "ChatManagerDataResponse")]
pub enum ChatManagerDataMessage {} pub enum ChatManagerDataMessage {
GetMessages,
GetMessage(usize),
}
#[derive(MessageResponse)] #[derive(MessageResponse)]
pub enum ChatManagerDataResponse {} pub enum ChatManagerDataResponse {
GotMessages(Vec<Message>),
GotMessage(Option<Message>),
}

View File

@ -1,5 +1,12 @@
//! Contains all the structures for managing chat storage.
//! it contains:
//! - ChatManager
//! - Messages
//! - Mesage type
mod chat_manager; mod chat_manager;
mod message_type; mod message_type;
mod messages; mod messages;
pub(crate) use chat_manager::ChatManager;
use message_type::Message; use message_type::Message;

View File

@ -15,6 +15,7 @@ use tokio_stream::StreamExt;
use uuid::Uuid; use uuid::Uuid;
use crate::client_management::{ use crate::client_management::{
chat_manager::ChatManager,
client::{ client::{
Client, Client,
ClientDataMessage, ClientDataMessage,
@ -34,6 +35,7 @@ use crate::client_management::{
pub struct ClientManager { pub struct ClientManager {
clients: HashMap<Uuid, Addr<Client>>, clients: HashMap<Uuid, Addr<Client>>,
chat_manager: Addr<ChatManager>,
_delegate: WeakRecipient<ClientManagerOutput>, _delegate: WeakRecipient<ClientManagerOutput>,
} }
@ -42,6 +44,7 @@ impl ClientManager {
ClientManager { ClientManager {
_delegate: delegate, _delegate: delegate,
clients: HashMap::new(), clients: HashMap::new(),
chat_manager: ChatManager::new(),
} }
.start() .start()
} }

View File

@ -12,8 +12,11 @@ pub mod client;
mod client_manager; mod client_manager;
mod messages; mod messages;
use chat_manager::ChatManager;
pub(crate) use client_manager::ClientManager; pub(crate) use client_manager::ClientManager;
pub(crate) use messages::{ pub(crate) use messages::{
ClientManagerDataMessage, ClientManagerDataResponse, ClientManagerMessage, ClientManagerDataMessage,
ClientManagerDataResponse,
ClientManagerMessage,
ClientManagerOutput, ClientManagerOutput,
}; };