merge develop into master #20

Merged
michael-bailey merged 181 commits from develop into master 2023-12-01 21:48:28 +00:00
6 changed files with 66 additions and 18 deletions
Showing only changes of commit 4717861f65 - Show all commits

View File

@ -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<Message>,
}
impl ChatManager {
pub fn new() -> Self {
pub fn new() -> Addr<Self> {
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<Self>, id: Uuid, content: String) {
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 {
@ -29,13 +43,24 @@ impl Actor for ChatManager {
impl Handler<ChatManagerMessage> 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<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 uuid::Uuid;
#[derive(Clone)]
pub struct Message {
id: Uuid,
from: Uuid,
content: String,
time: DateTime<Local>,
@ -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(),

View File

@ -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<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 message_type;
mod messages;
pub(crate) use chat_manager::ChatManager;
use message_type::Message;

View File

@ -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<Uuid, Addr<Client>>,
chat_manager: Addr<ChatManager>,
_delegate: WeakRecipient<ClientManagerOutput>,
}
@ -42,6 +44,7 @@ impl ClientManager {
ClientManager {
_delegate: delegate,
clients: HashMap::new(),
chat_manager: ChatManager::new(),
}
.start()
}

View File

@ -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,
};