removing strong references from scriping managers

This commit is contained in:
michael-bailey 2023-01-19 21:24:40 +00:00
parent c1616ce11f
commit 4381311fe3
7 changed files with 124 additions and 104 deletions

View File

@ -1,4 +1,4 @@
max_width = 90 max_width = 80
hard_tabs = true hard_tabs = true
tab_spaces = 2 tab_spaces = 2
imports_layout = "HorizontalVertical" imports_layout = "HorizontalVertical"

View File

@ -1,20 +1,23 @@
use crate::client_management::ClientManager; use actix::{Addr, WeakAddr};
use crate::lua::lua_manager::LuaManager;
use crate::network::NetworkManager; use crate::{
use crate::Server; client_management::ClientManager,
use actix::Addr; lua::lua_manager::LuaManager,
network::NetworkManager,
Server,
};
pub struct Builder { pub struct Builder {
pub(super) server: Addr<Server>, pub(super) server: WeakAddr<Server>,
pub(super) network_manager: Addr<NetworkManager>, pub(super) network_manager: WeakAddr<NetworkManager>,
pub(super) client_manager: Addr<ClientManager>, pub(super) client_manager: WeakAddr<ClientManager>,
} }
impl Builder { impl Builder {
pub(super) fn new( pub(super) fn new(
server: Addr<Server>, server: WeakAddr<Server>,
network_manager: Addr<NetworkManager>, network_manager: WeakAddr<NetworkManager>,
client_manager: Addr<ClientManager>, client_manager: WeakAddr<ClientManager>,
) -> Self { ) -> Self {
Builder { Builder {
server, server,

View File

@ -2,29 +2,31 @@
//! //!
//! Holds the LuaManger struct and implements it's methods //! Holds the LuaManger struct and implements it's methods
use crate::client_management::ClientManager; use actix::{fut::wrap_future, Actor, Addr, AsyncContext, Context, WeakAddr};
use crate::lua::builder::Builder;
use crate::network::NetworkManager;
use crate::scripting::scriptable_server::ScriptableServer;
use crate::Server;
use actix::fut::wrap_future;
use actix::{Actor, Addr, AsyncContext, Context};
use mlua::{Lua, Thread}; use mlua::{Lua, Thread};
use crate::{
client_management::ClientManager,
lua::builder::Builder,
network::NetworkManager,
scripting::scriptable_server::ScriptableServer,
Server,
};
/// # LuaManager /// # LuaManager
/// Holds common server objects /// Holds common server objects
/// todo: change to weak references /// todo: change to weak references
pub struct LuaManager { pub struct LuaManager {
pub(super) server: Addr<Server>, pub(super) server: WeakAddr<Server>,
pub(super) _network_manager: Addr<NetworkManager>, pub(super) _network_manager: WeakAddr<NetworkManager>,
pub(super) _client_manager: Addr<ClientManager>, pub(super) _client_manager: WeakAddr<ClientManager>,
} }
impl LuaManager { impl LuaManager {
pub fn create( pub fn create(
server: Addr<Server>, server: WeakAddr<Server>,
network_manager: Addr<NetworkManager>, network_manager: WeakAddr<NetworkManager>,
client_manager: Addr<ClientManager>, client_manager: WeakAddr<ClientManager>,
) -> Builder { ) -> Builder {
Builder::new(server, network_manager, client_manager) Builder::new(server, network_manager, client_manager)
} }

View File

@ -1,24 +1,26 @@
use actix::{Actor, Addr}; use actix::{Actor, Addr, WeakAddr};
use crate::client_management::ClientManager;
use crate::network::NetworkManager;
use crate::rhai::rhai_manager::RhaiManager;
use crate::Server;
use rhai::{Engine, Scope}; use rhai::{Engine, Scope};
use crate::{
client_management::ClientManager,
network::NetworkManager,
rhai::rhai_manager::RhaiManager,
Server,
};
pub struct Builder { pub struct Builder {
engine: Engine, engine: Engine,
server: Addr<Server>, server: WeakAddr<Server>,
network_manager: Addr<NetworkManager>, network_manager: WeakAddr<NetworkManager>,
client_manager: Addr<ClientManager>, client_manager: WeakAddr<ClientManager>,
scope: Scope<'static>, scope: Scope<'static>,
} }
impl Builder { impl Builder {
pub(super) fn new( pub(super) fn new(
server: Addr<Server>, server: WeakAddr<Server>,
network_manager: Addr<NetworkManager>, network_manager: WeakAddr<NetworkManager>,
client_manager: Addr<ClientManager>, client_manager: WeakAddr<ClientManager>,
) -> Self { ) -> Self {
Builder { Builder {
engine: Engine::new(), engine: Engine::new(),

View File

@ -1,24 +1,26 @@
use crate::client_management::ClientManager; use actix::{Actor, Addr, Context, WeakAddr};
use crate::network::NetworkManager;
use crate::rhai::builder::Builder;
use crate::Server;
use actix::{Actor, Addr, Context};
use rhai::{Engine, Scope}; use rhai::{Engine, Scope};
use crate::{
client_management::ClientManager,
network::NetworkManager,
rhai::builder::Builder,
Server,
};
pub struct RhaiManager { pub struct RhaiManager {
pub(super) engine: Engine, pub(super) engine: Engine,
pub(super) _scope: Scope<'static>, pub(super) _scope: Scope<'static>,
pub(super) _server: Addr<Server>, pub(super) _server: WeakAddr<Server>,
pub(super) _network_manager: Addr<NetworkManager>, pub(super) _network_manager: WeakAddr<NetworkManager>,
pub(super) _client_manager: Addr<ClientManager>, pub(super) _client_manager: WeakAddr<ClientManager>,
} }
impl RhaiManager { impl RhaiManager {
pub fn create( pub fn create(
server: Addr<Server>, server: WeakAddr<Server>,
network_manager: Addr<NetworkManager>, network_manager: WeakAddr<NetworkManager>,
client_manager: Addr<ClientManager>, client_manager: WeakAddr<ClientManager>,
) -> Builder { ) -> Builder {
Builder::new( Builder::new(
server.clone(), server.clone(),

View File

@ -1,70 +1,64 @@
use crate::scripting::scriptable_client_manager::ScriptableClientManager; use actix::{Addr, WeakAddr};
use crate::scripting::scriptable_network_manager::ScriptableNetworkManager; use mlua::{Error, UserData, UserDataMethods, Value::Nil};
use actix::Addr;
use mlua::{Error, UserData, UserDataMethods};
use crate::server::ServerDataResponse::{ClientManager, Name, NetworkManager, Owner}; use crate::{
use crate::server::*; scripting::{
scriptable_client_manager::ScriptableClientManager,
scriptable_network_manager::ScriptableNetworkManager,
},
server::{
ServerDataResponse::{ClientManager, Name, NetworkManager, Owner},
*,
},
};
#[derive(Clone)] #[derive(Clone)]
pub(crate) struct ScriptableServer { pub(crate) struct ScriptableServer {
pub(super) addr: Addr<Server>, pub(super) addr: WeakAddr<Server>,
} }
impl UserData for ScriptableServer { impl UserData for ScriptableServer {
fn add_methods<'lua, M: UserDataMethods<'lua, Self>>(methods: &mut M) { fn add_methods<'lua, M: UserDataMethods<'lua, Self>>(methods: &mut M) {
methods.add_async_method("name", |_lua, obj, ()| async move { methods.add_async_method("name", |_lua, obj, ()| async move {
let name: Option<ServerDataResponse> = let Some(send_fut) = obj.addr.upgrade().map(|addr| addr.send(ServerDataMessage::Name)) else {
obj.addr.send(ServerDataMessage::Name).await.ok(); return Err(Error::RuntimeError(
if let Some(Name(name)) = name { "[ScriptableServer:name] Server doesn't exist. Dunno how you got here".to_string(),
Ok(name)
} else {
Err(Error::RuntimeError(
"Name returned null or other value".to_string(),
)) ))
} };
let name: Option<ServerDataResponse> = send_fut.await.ok();
let Some(Name(name)) = name else {
return Err(Error::RuntimeError(
"[ScriptableServer:name] Name returned nil".to_string(),
))
};
Ok(name)
}); });
methods.add_async_method("owner", |_lua, obj, ()| async move { methods.add_async_method("owner", |_lua, obj, ()| async move {
let owner: Option<ServerDataResponse> = let Some(send_fut) = obj.addr.upgrade().map(|addr| addr.send(ServerDataMessage::Owner)) else {
obj.addr.send(ServerDataMessage::Owner).await.ok(); return Err(Error::RuntimeError(
if let Some(Owner(name)) = owner { "[ScriptableServer:owner] Server doesn't exist. Dunno how you got here".to_string(),
Ok(name)
} else {
Err(Error::RuntimeError(
"Name returned null or other value".to_string(),
)) ))
} };
});
methods.add_async_method("client_manager", |_lua, obj, ()| async move { let owner: Option<ServerDataResponse> = send_fut.await.ok();
let name: Option<ServerDataResponse> =
obj.addr.send(ServerDataMessage::ClientManager).await.ok();
if let Some(ClientManager(Some(cm))) = name {
Ok(ScriptableClientManager::from(cm))
} else {
Err(Error::RuntimeError(
"Name returned null or other value".to_string(),
))
}
});
methods.add_async_method("network_manager", |_lua, obj, ()| async move { let Some(Name(owner)) = owner else {
let name: Option<ServerDataResponse> = return Err(Error::RuntimeError(
obj.addr.send(ServerDataMessage::NetworkManager).await.ok(); "[ScriptableServer:owner] Owner returned nil".to_string(),
if let Some(NetworkManager(Some(nm))) = name {
Ok(ScriptableNetworkManager::from(nm))
} else {
Err(Error::RuntimeError(
"Name returned null or other value".to_string(),
)) ))
} };
Ok(owner)
}); });
} }
} }
impl From<Addr<Server>> for ScriptableServer { impl From<WeakAddr<Server>> for ScriptableServer {
fn from(addr: Addr<Server>) -> Self { fn from(addr: WeakAddr<Server>) -> Self {
Self { addr } Self { addr }
} }
} }

View File

@ -99,18 +99,27 @@ impl Actor for Server {
let addr = ctx.address().downgrade(); let addr = ctx.address().downgrade();
let nm = NetworkManager::create(addr.clone().recipient()).build(); let nm = NetworkManager::create(addr.clone().recipient()).build();
nm.do_send(NetworkMessage::StartListening);
self.network_manager.replace(nm.clone());
let cm = ClientManager::new(addr.recipient()); let cm = ClientManager::new(addr.recipient());
let rm = RhaiManager::create(
ctx.address().downgrade(),
nm.downgrade(),
cm.downgrade(),
)
.build();
let lm = LuaManager::create(
ctx.address().downgrade(),
nm.downgrade(),
cm.downgrade(),
)
.build();
self.network_manager.replace(nm.clone());
self.client_manager.replace(cm.clone()); self.client_manager.replace(cm.clone());
let rm = RhaiManager::create(ctx.address(), nm.clone(), cm.clone()).build();
self.rhai_manager.replace(rm); self.rhai_manager.replace(rm);
let lm = LuaManager::create(ctx.address(), nm, cm).build();
self.lua_manager.replace(lm); self.lua_manager.replace(lm);
nm.do_send(NetworkMessage::StartListening);
let name_fut = wrap_future( let name_fut = wrap_future(
ConfigManager::shared().send(GetValue("Server.Name".to_owned())), ConfigManager::shared().send(GetValue("Server.Name".to_owned())),
) )
@ -137,7 +146,11 @@ impl Actor for Server {
impl Handler<ServerDataMessage> for Server { impl Handler<ServerDataMessage> for Server {
type Result = ServerDataResponse; type Result = ServerDataResponse;
fn handle(&mut self, msg: ServerDataMessage, _ctx: &mut Self::Context) -> Self::Result { fn handle(
&mut self,
msg: ServerDataMessage,
_ctx: &mut Self::Context,
) -> Self::Result {
println!("[Server] got data message"); println!("[Server] got data message");
match msg { match msg {
ServerDataMessage::Name => ServerDataResponse::Name(self.name.clone()), ServerDataMessage::Name => ServerDataResponse::Name(self.name.clone()),
@ -154,7 +167,11 @@ impl Handler<ServerDataMessage> for Server {
impl Handler<NetworkOutput> for Server { impl Handler<NetworkOutput> for Server {
type Result = (); type Result = ();
fn handle(&mut self, msg: NetworkOutput, ctx: &mut Self::Context) -> Self::Result { fn handle(
&mut self,
msg: NetworkOutput,
ctx: &mut Self::Context,
) -> Self::Result {
println!("[ServerActor] received message"); println!("[ServerActor] received message");
match msg { match msg {
// This uses promise like funcionality to queue // This uses promise like funcionality to queue