implemented basic client manager functions for new architecture

This commit is contained in:
michael-bailey 2021-03-18 09:20:39 +00:00
parent e92096b6ad
commit b1b8107ce7
2 changed files with 19 additions and 21 deletions

View File

@ -2,18 +2,17 @@ pub mod client;
mod traits; mod traits;
// use crate::lib::server::ServerMessages; // use crate::lib::server::ServerMessages;
use crate::lib::server::ServerMessages;
use std::sync::Arc; use std::sync::Arc;
use std::sync::Mutex; use std::sync::Mutex;
use std::sync::Weak; use std::collections::HashMap;
use crossbeam_channel::{unbounded, Receiver, Sender}; use crossbeam_channel::{unbounded, Receiver, Sender};
use uuid::Uuid; use uuid::Uuid;
use crate::lib::Foundation::{IOwner, IOwned};
use self::client::Client; use self::client::Client;
use self::client::ClientMessage; use self::client::ClientMessage;
use self::traits::TClientManager; use self::traits::TClientManager;
use crate::lib::server::ServerMessages;
use crate::lib::Foundation::IMessagable; use crate::lib::Foundation::IMessagable;
use crate::lib::Foundation::ICooperative; use crate::lib::Foundation::ICooperative;
@ -23,14 +22,10 @@ enum ClientManagerMessages {}
/// This struct manages all connected users /// This struct manages all connected users
#[derive(Debug)] #[derive(Debug)]
pub struct ClientManager { pub struct ClientManager {
clients: Mutex<Vec<Arc<Client>>>, clients: Mutex<HashMap<Uuid, Arc<Client>>>,
// weak_self: Mutex<Option<Weak<Self>>>,
server_channel: Sender<ServerMessages>, server_channel: Sender<ServerMessages>,
// server_channel: Sender<ServerMessages>,
sender: Sender<ClientManagerMessages>, sender: Sender<ClientManagerMessages>,
receiver: Receiver<ClientManagerMessages>, receiver: Receiver<ClientManagerMessages>,
} }
@ -53,29 +48,32 @@ impl ClientManager {
impl TClientManager<Client, ClientMessage> for ClientManager { impl TClientManager<Client, ClientMessage> for ClientManager {
fn add_client(&self, client: std::sync::Arc<Client>) { fn add_client(&self, client: std::sync::Arc<Client>) {
self.clients.lock().unwrap().push(client); self.clients.lock().unwrap().insert(client.uuid, client);
} }
fn remove_client(&self, _uuid: Uuid) { fn remove_client(&self, uuid: Uuid) {
self.clients.lock().unwrap().sort(); let _ = self.clients.lock().unwrap().remove(&uuid);
} }
fn message_client(&self, _id: Uuid, _msg: ClientMessage) { fn send_message_to_client(&self, uuid: Uuid, msg: ClientMessage) {
todo!() let clients = self.clients.lock().unwrap();
let client = clients.get(&uuid).unwrap();
client.send_message(msg);
} }
}
impl ICooperative for ClientManager {
fn tick(&self) { fn tick(&self) {
let client_list = self.clients.lock().unwrap();
let _ = client_list.iter().map(|client| client.tick());
} }
} }
#[cfg(test)] #[cfg(test)]
mod test { mod test {
use super::ClientManager; // use super::ClientManager;
use std::sync::Arc; // use std::sync::Arc;
use crate::lib::Foundation::{IOwner}; // use crate::lib::Foundation::{IOwner};
#[test] #[test]
fn test_get_ref() { fn test_get_ref() {

View File

@ -1,3 +1,4 @@
use crate::lib::server::client_management::client::ClientMessage;
use std::sync::Arc; use std::sync::Arc;
use uuid::Uuid; use uuid::Uuid;
@ -7,7 +8,6 @@ use uuid::Uuid;
*/ */
pub trait TClientManager<TClient,TClientMessage> { pub trait TClientManager<TClient,TClientMessage> {
fn add_client(&self, client: Arc<TClient>); fn add_client(&self, client: Arc<TClient>);
fn remove_client(&self, id: Uuid); fn remove_client(&self, uuid: Uuid);
fn message_client(&self, id: Uuid, msg: TClientMessage); fn send_message_to_client(&self, uuid: Uuid, msg: ClientMessage);
fn tick(&self, );
} }