cleaned up scriptable interfaces

This commit is contained in:
michael-bailey 2022-09-15 08:25:35 +01:00
parent 22fcdae11a
commit 065e16964f
2 changed files with 33 additions and 27 deletions

View File

@ -1,41 +1,49 @@
use actix::Addr;
use mlua::{Error, UserData, UserDataFields, UserDataMethods};
use crate::client_management::client::Client;
use crate::client_management::client::{ClientDataMessage, ClientDataResponse};
use crate::client_management::client::ClientDataResponse::{Username, Uuid};
use crate::server::ServerDataResponse::Name;
use crate::client_management::client::{ClientDataMessage, ClientDataResponse};
use actix::Addr;
use mlua::{Error, UserData, UserDataMethods};
#[derive(Clone)]
pub(crate) struct ScriptableClient {
addr: Addr<Client>
addr: Addr<Client>,
}
impl UserData for ScriptableClient {
fn add_methods<'lua, M: UserDataMethods<'lua, Self>>(methods: &mut M) {
methods.add_async_method("username", |_lua, obj, ()| async move {
let name: Option<ClientDataResponse> = obj.addr.send(ClientDataMessage::Username).await.ok();
let name: Option<ClientDataResponse> =
obj.addr.send(ClientDataMessage::Username).await.ok();
if let Some(Username(name)) = name {
Ok(name)
} else {
Err(Error::RuntimeError("Name returned null or other value".to_string()))
Err(Error::RuntimeError(
"Name returned null or other value".to_string(),
))
}
});
methods.add_async_method("uuid", |_lua, obj, ()| async move {
let uuid: Option<ClientDataResponse> = obj.addr.send(ClientDataMessage::Uuid).await.ok();
let uuid: Option<ClientDataResponse> =
obj.addr.send(ClientDataMessage::Uuid).await.ok();
if let Some(Uuid(uuid)) = uuid {
Ok(uuid.to_string())
} else {
Err(Error::RuntimeError("Uuid returned null or other value".to_string()))
Err(Error::RuntimeError(
"Uuid returned null or other value".to_string(),
))
}
});
methods.add_async_method("address", |_lua, obj, ()| async move {
let address: Option<ClientDataResponse> = obj.addr.send(ClientDataMessage::Address).await.ok();
let address: Option<ClientDataResponse> =
obj.addr.send(ClientDataMessage::Address).await.ok();
if let Some(Username(address)) = address {
Ok(address)
} else {
Err(Error::RuntimeError("address returned null or other value".to_string()))
Err(Error::RuntimeError(
"address returned null or other value".to_string(),
))
}
});
}
@ -43,8 +51,6 @@ impl UserData for ScriptableClient {
impl From<Addr<Client>> for ScriptableClient {
fn from(addr: Addr<Client>) -> Self {
Self {
addr
}
Self { addr }
}
}
}

View File

@ -1,21 +1,21 @@
use actix::{ActorStreamExt, Addr};
use mlua::{Error, UserData, UserDataFields, UserDataMethods};
use crate::client_management::{ClientManager, ClientManagerDataMessage};
use crate::client_management::ClientManagerDataResponse::Clients;
use crate::client_management::{ClientManager, ClientManagerDataMessage};
use crate::scripting::scriptable_client::ScriptableClient;
use actix::Addr;
use mlua::{Error, UserData, UserDataMethods};
#[derive(Clone)]
pub(crate) struct ScriptableClientManager {
addr: Addr<ClientManager>
addr: Addr<ClientManager>,
}
impl UserData for ScriptableClientManager {
fn add_methods<'lua, M: UserDataMethods<'lua, Self>>(methods: &mut M) {
methods.add_async_method("clients", |lua, obj, ()| async move {
methods.add_async_method("clients", |_lua, obj, ()| async move {
let res = obj.addr.send(ClientManagerDataMessage::Clients).await;
if let Ok(Clients(clients)) = res {
let clients: Vec<ScriptableClient> = clients.into_iter()
let clients: Vec<ScriptableClient> = clients
.into_iter()
.map(|a| a.upgrade())
.filter(|o| o.is_some())
.map(|o| o.unwrap())
@ -24,7 +24,9 @@ impl UserData for ScriptableClientManager {
Ok(clients)
} else {
Err(Error::RuntimeError("clients returned null or other value".to_string()))
Err(Error::RuntimeError(
"clients returned null or other value".to_string(),
))
}
})
}
@ -32,8 +34,6 @@ impl UserData for ScriptableClientManager {
impl From<Addr<ClientManager>> for ScriptableClientManager {
fn from(addr: Addr<ClientManager>) -> Self {
Self {
addr
}
Self { addr }
}
}
}