walle-core 0.1.0

Onebot Lib in Rust
use std::sync::Arc;
use tokio::{
    net::{TcpListener, TcpStream},
    sync::RwLock,
};

use crate::{app::CustomOneBot, comms::WebSocketServer, config::WebSocket};

pub async fn run<E, A, R>(config: &WebSocket, ob: Arc<CustomOneBot<E, A, R>>) -> WebSocketServer
where
    E: Clone + serde::de::DeserializeOwned + Send + 'static + std::fmt::Debug,
    A: Clone + serde::Serialize + Send + 'static + std::fmt::Debug,
    R: Clone + serde::de::DeserializeOwned + Send + 'static + std::fmt::Debug,
{
    let addr = std::net::SocketAddr::new(config.host, config.port);
    let tcp_listener = TcpListener::bind(&addr).await.expect("bind addr failed");
    let conns = Arc::new(RwLock::new(Vec::new()));
    let move_conns = conns.clone();
    let access_token = config.access_token.clone();
    let join = tokio::spawn(async move {
        while let Ok((stream, _)) = tcp_listener.accept().await {
            let join = tokio::spawn(handle_conn(access_token.clone(), stream, ob.clone()));
            {
                let mut lockconns = move_conns.write().await;
                lockconns.push(join);
            }
        }
    });
    WebSocketServer {
        listner: join,
        conns,
    }
}

async fn handle_conn<E, A, R>(
    access_token: Option<String>,
    stream: TcpStream,
    ob: Arc<CustomOneBot<E, A, R>>,
) where
    E: Clone + serde::de::DeserializeOwned + Send + 'static + std::fmt::Debug,
    A: Clone + serde::Serialize + Send + 'static + std::fmt::Debug,
    R: Clone + serde::de::DeserializeOwned + Send + 'static + std::fmt::Debug,
{
    if let Some(ws_stream) = crate::comms::util::upgrade_websocket(&access_token, stream).await {
        super::websocket_loop(ws_stream, ob).await
    }
}