moved Lua structs to separate module
This commit is contained in:
parent
6ebdb441e1
commit
89d673b32f
|
|
@ -195,33 +195,6 @@ impl<Out: 'static> Ord for Client<Out>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct ClientLua<Out: 'static>(pub Arc<Client<Out>>)
|
|
||||||
where
|
|
||||||
Out: From<ClientMessage> + Send;
|
|
||||||
|
|
||||||
impl<Out: 'static> LuaUserData for ClientLua<Out>
|
|
||||||
where
|
|
||||||
Out: From<ClientMessage> + Send
|
|
||||||
{
|
|
||||||
fn add_fields<'lua, F: UserDataFields<'lua, Self>>(fields: &mut F) {
|
|
||||||
fields.add_field_method_get("uuid", |_lua, this| {
|
|
||||||
Ok(this.0.details.uuid.to_string())
|
|
||||||
});
|
|
||||||
|
|
||||||
fields.add_field_method_get("username", |_lua, this| {
|
|
||||||
Ok(this.0.details.username.to_string())
|
|
||||||
});
|
|
||||||
|
|
||||||
fields.add_field_method_get("address", |_lua, this| {
|
|
||||||
Ok(this.0.details.address.to_string())
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
fn add_methods<'lua, M: UserDataMethods<'lua, Self>>(_methods: &mut M) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use std::io::Error;
|
use std::io::Error;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::str::FromStr;
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use futures::future::join_all;
|
use futures::future::join_all;
|
||||||
|
|
@ -11,14 +10,12 @@ use tokio::sync::mpsc::{channel, Receiver, Sender};
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
use mlua::prelude::LuaUserData;
|
use mlua::{MetaMethod, Nil, ToLua, UserDataFields, UserDataMethods};
|
||||||
use mlua::{Function, MetaMethod, Nil, ToLua, UserDataFields, UserDataMethods};
|
|
||||||
use mlua::Value::UserData;
|
|
||||||
|
|
||||||
use foundation::prelude::IManager;
|
use foundation::prelude::IManager;
|
||||||
use foundation::connection::Connection;
|
use foundation::connection::Connection;
|
||||||
|
|
||||||
use crate::client::{Client, ClientLua};
|
use crate::client::Client;
|
||||||
use crate::messages::ClientMessage;
|
use crate::messages::ClientMessage;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
|
@ -79,7 +76,7 @@ pub struct ClientManager<Out: 'static>
|
||||||
where
|
where
|
||||||
Out: From<ClientMgrMessage> + Send
|
Out: From<ClientMgrMessage> + Send
|
||||||
{
|
{
|
||||||
clients: Mutex<HashMap<Uuid, Arc<Client<ClientMgrMessage>>>>,
|
pub clients: Mutex<HashMap<Uuid, Arc<Client<ClientMgrMessage>>>>,
|
||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
server_channel: Mutex<Sender<Out>>,
|
server_channel: Mutex<Sender<Out>>,
|
||||||
|
|
@ -194,53 +191,6 @@ impl<Out> IManager for ClientManager<Out>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
|
||||||
pub struct ClientManagerLua<'lua, Out: 'static>(pub Arc<ClientManager<Out>>, pub Vec<Function<'lua>>)
|
|
||||||
where
|
|
||||||
Out: From<ClientMgrMessage> + Send;
|
|
||||||
|
|
||||||
impl<Out: 'static> LuaUserData for ClientManagerLua<'_, Out>
|
|
||||||
where
|
|
||||||
Out: From<ClientMgrMessage> + Clone + Send
|
|
||||||
{
|
|
||||||
fn add_fields<'lua, F: UserDataFields<'lua, Self>>(fields: &mut F) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
fn add_methods<'lua, M: UserDataMethods<'lua, Self>>(methods: &mut M) {
|
|
||||||
methods.add_async_method("getCount", |_lua,this,()| {
|
|
||||||
let this = this.0.clone();
|
|
||||||
async move {
|
|
||||||
Ok(this.clients.lock().await.len())
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
methods.add_async_method("getClientList", |_lua,this,()| {
|
|
||||||
let this = this.0.clone();
|
|
||||||
async move {
|
|
||||||
let clients = this.clients.lock().await;
|
|
||||||
let clients: Vec<ClientLua<ClientMgrMessage>> = clients.iter()
|
|
||||||
.map(|(_id,c)| ClientLua(c.clone()))
|
|
||||||
.collect();
|
|
||||||
Ok(clients)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
methods.add_async_meta_method(MetaMethod::Index, |lua, this, (index): (String)| {
|
|
||||||
let manager = this.0.clone();
|
|
||||||
async move {
|
|
||||||
if let Ok(id) = Uuid::from_str(&index) {
|
|
||||||
let map = manager.clients.lock().await;
|
|
||||||
if let Some(found) = map.get(&id) {
|
|
||||||
return Ok(ClientLua(found.clone()).to_lua(lua)?);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Ok(Nil);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use std::io::Error;
|
use std::io::Error;
|
||||||
|
|
|
||||||
|
|
@ -4,5 +4,6 @@ mod client_manager;
|
||||||
mod messages;
|
mod messages;
|
||||||
mod network_manager;
|
mod network_manager;
|
||||||
mod server;
|
mod server;
|
||||||
|
mod lua;
|
||||||
|
|
||||||
pub use server::Server;
|
pub use server::Server;
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
use std::sync::Arc;
|
||||||
|
use mlua::prelude::LuaUserData;
|
||||||
|
use mlua::{UserDataFields, UserDataMethods};
|
||||||
|
use crate::client::Client;
|
||||||
|
use crate::messages::ClientMessage;
|
||||||
|
|
||||||
|
pub struct ClientLua<Out: 'static>(pub Arc<Client<Out>>)
|
||||||
|
where
|
||||||
|
Out: From<ClientMessage> + Send;
|
||||||
|
|
||||||
|
impl<Out> ClientLua<Out>
|
||||||
|
where
|
||||||
|
Out: From<ClientMessage> + Send
|
||||||
|
{
|
||||||
|
pub fn new(client: Arc<Client<Out>>) -> Self {
|
||||||
|
ClientLua(client)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<Out: 'static> LuaUserData for ClientLua<Out>
|
||||||
|
where
|
||||||
|
Out: From<ClientMessage> + Send
|
||||||
|
{
|
||||||
|
fn add_fields<'lua, F: UserDataFields<'lua, Self>>(fields: &mut F) {
|
||||||
|
fields.add_field_method_get("uuid", |_lua, this| {
|
||||||
|
Ok(this.0.details.uuid.to_string())
|
||||||
|
});
|
||||||
|
|
||||||
|
fields.add_field_method_get("username", |_lua, this| {
|
||||||
|
Ok(this.0.details.username.to_string())
|
||||||
|
});
|
||||||
|
|
||||||
|
fields.add_field_method_get("address", |_lua, this| {
|
||||||
|
Ok(this.0.details.address.to_string())
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
fn add_methods<'lua, M: UserDataMethods<'lua, Self>>(_methods: &mut M) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,63 @@
|
||||||
|
use std::str::FromStr;
|
||||||
|
use std::sync::Arc;
|
||||||
|
use mlua::{Function, MetaMethod, Nil, ToLua, UserDataFields, UserDataMethods};
|
||||||
|
use mlua::prelude::LuaUserData;
|
||||||
|
use uuid::Uuid;
|
||||||
|
use crate::client_manager::{ClientManager, ClientMgrMessage};
|
||||||
|
use crate::lua::ClientLua;
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub struct ClientManagerLua<'lua, Out: 'static>(pub Arc<ClientManager<Out>>, pub Vec<Function<'lua>>)
|
||||||
|
where
|
||||||
|
Out: From<ClientMgrMessage> + Send;
|
||||||
|
|
||||||
|
impl<Out: 'static> ClientManagerLua<'_, Out>
|
||||||
|
where
|
||||||
|
Out: From<ClientMgrMessage> + Send
|
||||||
|
{
|
||||||
|
pub fn new(manager: Arc<ClientManager<Out>>) -> Self {
|
||||||
|
ClientManagerLua(manager, Vec::new())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<Out: 'static> LuaUserData for ClientManagerLua<'_, Out>
|
||||||
|
where
|
||||||
|
Out: From<ClientMgrMessage> + Clone + Send
|
||||||
|
{
|
||||||
|
fn add_fields<'lua, F: UserDataFields<'lua, Self>>(fields: &mut F) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fn add_methods<'lua, M: UserDataMethods<'lua, Self>>(methods: &mut M) {
|
||||||
|
methods.add_async_method("getCount", |_lua,this,()| {
|
||||||
|
let this = this.0.clone();
|
||||||
|
async move {
|
||||||
|
Ok(this.clients.lock().await.len())
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
methods.add_async_method("getClientList", |_lua,this,()| {
|
||||||
|
let this = this.0.clone();
|
||||||
|
async move {
|
||||||
|
let clients = this.clients.lock().await;
|
||||||
|
let clients: Vec<ClientLua<ClientMgrMessage>> = clients.iter()
|
||||||
|
.map(|(_id,c)| ClientLua::new(c.clone()))
|
||||||
|
.collect();
|
||||||
|
Ok(clients)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
methods.add_async_meta_method(MetaMethod::Index, |lua, this, (index): (String)| {
|
||||||
|
let manager = this.0.clone();
|
||||||
|
async move {
|
||||||
|
if let Ok(id) = Uuid::from_str(&index) {
|
||||||
|
let map = manager.clients.lock().await;
|
||||||
|
if let Some(found) = map.get(&id) {
|
||||||
|
return Ok(ClientLua::new(found.clone()).to_lua(lua)?);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Ok(Nil);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
mod client_lua;
|
||||||
|
mod client_manager_lua;
|
||||||
|
mod server_lua;
|
||||||
|
|
||||||
|
pub use client_lua::ClientLua;
|
||||||
|
pub use client_manager_lua::ClientManagerLua;
|
||||||
|
pub use server_lua::ServerLua;
|
||||||
|
|
@ -0,0 +1,38 @@
|
||||||
|
use std::sync::Arc;
|
||||||
|
use mlua::prelude::LuaUserData;
|
||||||
|
use mlua::{UserDataFields, UserDataMethods};
|
||||||
|
use crate::lua::ClientManagerLua;
|
||||||
|
use crate::Server;
|
||||||
|
|
||||||
|
/// # ServerLua
|
||||||
|
/// A wrapper struct for making the Server lua scriptable.
|
||||||
|
///
|
||||||
|
/// # Attributes
|
||||||
|
/// - 1: A reference to the server.
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub struct ServerLua(Arc<Server>);
|
||||||
|
|
||||||
|
impl ServerLua {
|
||||||
|
pub fn new(server: Arc<Server>) -> Self {
|
||||||
|
ServerLua(server)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl LuaUserData for ServerLua {
|
||||||
|
fn add_fields<'lua, F: UserDataFields<'lua, Self>>(fields: &mut F) {
|
||||||
|
fields.add_field_method_get("ClientManager", |lua,this| {
|
||||||
|
println!("Getting count");
|
||||||
|
Ok(ClientManagerLua(this.0.client_manager.clone(), vec![]))
|
||||||
|
});
|
||||||
|
fields.add_field_method_get("NetworkManager", |lua,this| {
|
||||||
|
Ok("unimplemented")
|
||||||
|
});
|
||||||
|
fields.add_field_method_get("address", |lua,this| {
|
||||||
|
Ok("unimplemented")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
fn add_methods<'lua, M: UserDataMethods<'lua, Self>>(_methods: &mut M) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -4,6 +4,7 @@ pub mod client_manager;
|
||||||
pub mod messages;
|
pub mod messages;
|
||||||
pub mod network_manager;
|
pub mod network_manager;
|
||||||
pub mod server;
|
pub mod server;
|
||||||
|
mod lua;
|
||||||
|
|
||||||
use std::io;
|
use std::io;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,8 @@ use tokio::join;
|
||||||
use foundation::connection::Connection;
|
use foundation::connection::Connection;
|
||||||
use foundation::prelude::IManager;
|
use foundation::prelude::IManager;
|
||||||
|
|
||||||
use crate::client_manager::{ClientManager, ClientManagerLua, ClientMgrMessage};
|
use crate::client_manager::{ClientManager, ClientMgrMessage};
|
||||||
|
use crate::lua::ServerLua;
|
||||||
use crate::network_manager::{NetworkManager, NetworkManagerMessage};
|
use crate::network_manager::{NetworkManager, NetworkManagerMessage};
|
||||||
|
|
||||||
#[derive(Debug,Clone)]
|
#[derive(Debug,Clone)]
|
||||||
|
|
@ -80,7 +81,7 @@ impl From<ClientMgrMessage> for ServerMessage {
|
||||||
/// - lua: The servers lua context, used for running lua scripts.
|
/// - lua: The servers lua context, used for running lua scripts.
|
||||||
///
|
///
|
||||||
pub struct Server {
|
pub struct Server {
|
||||||
client_manager: Arc<ClientManager<ServerMessage>>,
|
pub client_manager: Arc<ClientManager<ServerMessage>>,
|
||||||
network_manager: Arc<NetworkManager<ServerMessage>>,
|
network_manager: Arc<NetworkManager<ServerMessage>>,
|
||||||
receiver: Mutex<Receiver<ServerMessage>>,
|
receiver: Mutex<Receiver<ServerMessage>>,
|
||||||
lua: Arc<Mutex<Lua>>,
|
lua: Arc<Mutex<Lua>>,
|
||||||
|
|
@ -101,7 +102,7 @@ impl Server {
|
||||||
lua: Arc::new(Mutex::new(Lua::new())),
|
lua: Arc::new(Mutex::new(Lua::new())),
|
||||||
});
|
});
|
||||||
|
|
||||||
server.lua.lock().await.globals().set("Server", ServerLua(server.clone())).unwrap();
|
server.lua.lock().await.globals().set("Server", ServerLua::new(server.clone())).unwrap();
|
||||||
|
|
||||||
server.load_scripts().await?;
|
server.load_scripts().await?;
|
||||||
|
|
||||||
|
|
@ -179,30 +180,3 @@ impl Server {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// # ServerLua
|
|
||||||
/// A wrapper struct for making the Server lua scriptable.
|
|
||||||
///
|
|
||||||
/// # Attributes
|
|
||||||
/// - 1: A reference to the server.
|
|
||||||
#[derive(Clone)]
|
|
||||||
struct ServerLua(Arc<Server>);
|
|
||||||
|
|
||||||
impl LuaUserData for ServerLua {
|
|
||||||
fn add_fields<'lua, F: UserDataFields<'lua, Self>>(fields: &mut F) {
|
|
||||||
fields.add_field_method_get("ClientManager", |lua,this| {
|
|
||||||
println!("Getting count");
|
|
||||||
Ok(ClientManagerLua(this.0.client_manager.clone(), vec![]))
|
|
||||||
});
|
|
||||||
fields.add_field_method_get("NetworkManager", |lua,this| {
|
|
||||||
Ok("unimplemented")
|
|
||||||
});
|
|
||||||
fields.add_field_method_get("address", |lua,this| {
|
|
||||||
Ok("unimplemented")
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
fn add_methods<'lua, M: UserDataMethods<'lua, Self>>(_methods: &mut M) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue