lwmud 0.1.0

Lwmud is an asynchronous engine for text-based games.
Documentation
use tokio::sync::mpsc::{self, Sender};

use crate::{client::Client, verb::VerbContextBuilder};

use super::{MudServer, hooks::Hook};

pub enum ConnectionStatus {
    Connected,
    Disconnected,
}

pub struct ConnectionUpdate {
    pub client: Client,
    pub status: ConnectionStatus,
}

impl MudServer {
    pub async fn create_connections_channel(&self) -> Sender<ConnectionUpdate> {
        let (tx, mut rx) = mpsc::channel::<ConnectionUpdate>(32);
        let clients = self.clients.clone();
        let server = self.clone();
        tokio::spawn(async move {
            while let Some(update) = rx.recv().await {
                let clients = clients.clone();
                match update.status {
                    ConnectionStatus::Connected => {
                        let vc = VerbContextBuilder::new().client(update.client.clone()).server(server.clone());
                        let _ = server.run_hook(Hook::OnPlayerConnect, vc).await;
                        let mut clients = clients.lock().unwrap();
                        clients.push(update.client.clone());
                    }
                    ConnectionStatus::Disconnected => {
                        let vc = VerbContextBuilder::new().client(update.client.clone()).server(server.clone());
                        let _ = server.run_hook(Hook::OnPlayerDisconnect, vc).await;
                        let mut clients = clients.lock().unwrap();
                        clients.retain(|c| c.addr != update.client.addr);
                    }
                }
            }
        });
        tx
    }
}