diff --git a/modules/you_done_it/server_node.cpp b/modules/you_done_it/server_node.cpp index 97c9b7f8..dde038ef 100644 --- a/modules/you_done_it/server_node.cpp +++ b/modules/you_done_it/server_node.cpp @@ -13,6 +13,9 @@ void ServerNode::_bind_methods() { ADD_SIGNAL(MethodInfo(sig_connection_lost)); ClassDB::bind_method(D_METHOD("open"), &self_type::open); + ClassDB::bind_method(D_METHOD("close"), &self_type::close); + ClassDB::bind_method(D_METHOD("is_open"), &self_type::is_open); + ClassDB::bind_static_method(self_type::get_class_static(), "get_singleton", &self_type::get_singleton); } void ServerNode::enter_tree() { @@ -25,17 +28,20 @@ void ServerNode::enter_tree() { } void ServerNode::process(double delta) { + bool new_is_connected{ ydi::server::has_client() }; + if (this->is_connected != new_is_connected) { + this->is_connected = new_is_connected; + emit_signal(this->is_connected ? sig_connection_established : sig_connection_lost); + } + if (!ydi::server::has_client()) { + return; + } Vector new_clues{}; if (ydi::server::receive::new_clues(new_clues)) { for (NetworkData::ClueID clue : new_clues) { emit_signal(sig_clue_revealed, clue); } } - bool new_is_connected{ ydi::server::has_client() }; - if (this->is_connected != new_is_connected) { - this->is_connected = new_is_connected; - emit_signal(this->is_connected ? sig_connection_established : sig_connection_lost); - } } void ServerNode::exit_tree() { @@ -69,6 +75,14 @@ ServerNode *ServerNode::get_singleton() { return singleton_instance; } -void ServerNode::open() { - ydi::server::open(); +bool ServerNode::open() { + return ydi::server::open(); +} + +void ServerNode::close() { + ydi::server::close(); +} + +bool ServerNode::is_open() const { + return ydi::server::is_running(); } diff --git a/modules/you_done_it/server_node.h b/modules/you_done_it/server_node.h index ab6d8a91..c522354a 100644 --- a/modules/you_done_it/server_node.h +++ b/modules/you_done_it/server_node.h @@ -15,7 +15,9 @@ protected: public: static ServerNode *get_singleton(); - void open(); + bool open(); + void close(); + bool is_open() const; public: static String const sig_clue_revealed; diff --git a/modules/you_done_it/ydi_server.cpp b/modules/you_done_it/ydi_server.cpp index 160b2602..cc768388 100644 --- a/modules/you_done_it/ydi_server.cpp +++ b/modules/you_done_it/ydi_server.cpp @@ -99,10 +99,10 @@ void receive_thread_entry() { } } -void open() { +bool open() { if (service) { print_error("Server: Detected attempt to open duplicate Server, exiting without action."); - return; + return false; } print_line("Server: Starting"); service.emplace(); @@ -111,7 +111,7 @@ void open() { } catch (...) { service.reset(); print_line("Server: Failed to create context"); - return; + return false; } print_line("Server: Created zmq context"); try { @@ -121,7 +121,7 @@ void open() { service->context.reset(); service.reset(); print_line("Server: Failed to create socket"); - return; + return false; } print_line("Server: Created socket"); try { @@ -133,12 +133,13 @@ void open() { service->context.reset(); service.reset(); print_line("Server: Failed to bind socket"); - return; + return false; } print_line("Server: Bound socket"); receive_thread.emplace(receive_thread_entry); assert(receive_thread->joinable()); print_line("Server: Startup complete!"); + return true; } void close() { @@ -170,16 +171,22 @@ void close() { } bool has_client() { - if (service) { - std::scoped_lock lock{ service->mtx }; - return service->client.has_value(); - } else { + if (!service) { return false; } + std::scoped_lock lock{ service->mtx }; + return service->client.has_value(); +} + +bool is_running() { + return service.has_value(); } namespace receive { bool new_clues(Vector &out) { + if (!service) { + return false; + } std::scoped_lock lock{ service->mtx }; bool const has_new{ !service->new_clues.is_empty() }; if (has_new) { diff --git a/modules/you_done_it/ydi_server.h b/modules/you_done_it/ydi_server.h index 56940f14..a8683324 100644 --- a/modules/you_done_it/ydi_server.h +++ b/modules/you_done_it/ydi_server.h @@ -5,9 +5,10 @@ #include namespace ydi::server { -void open(); +bool open(); void close(); bool has_client(); +bool is_running(); namespace receive { bool new_clues(Vector &out);