merge develop into master #20
|
|
@ -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),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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(),
|
||||
|
|
|
|||
|
|
@ -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>),
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in New Issue