YouDunIt/modules/you_done_it/client_node.cpp

79 lines
2 KiB
C++

#include "client_node.h"
#include "core/config/engine.h"
#include "scene/main/node.h"
#include "you_done_it/clue_data.h"
#include "you_done_it/clue_db.h"
#include "you_done_it/ydi_client.h"
ClientNode *ClientNode::singleton_instance{ nullptr };
String const ClientNode::sig_connection_changed{ "connection_changed" };
void ClientNode::_bind_methods() {
ClassDB::bind_method(D_METHOD("connect_to_server", "server_url"), &self_type::connect_to_server);
ADD_SIGNAL(MethodInfo(sig_connection_changed, PropertyInfo(Variant::INT, "connected", PROPERTY_HINT_ENUM, "Disconnected,Connected,Authenticated")));
}
void ClientNode::enter_tree() {
if (singleton_instance) {
print_error("Attempt to create duplicate ClientNode, aborting");
abort();
} else {
singleton_instance = this;
}
}
void ClientNode::process() {
NetworkData::ConnectionStatus const new_status{ ydi::client::status() };
if (new_status != this->state) {
this->state = new_status;
emit_signal(sig_connection_changed, new_status);
if (new_status == NetworkData::CONNECTION_AUTHENTICATED) {
reveal_backlog();
}
}
}
void ClientNode::exit_tree() {
ydi::client::disconnect();
if (singleton_instance == this) {
singleton_instance = nullptr;
}
}
void ClientNode::reveal_backlog() {
Ref<ClueDB> db{ ClueDB::get_singleton() };
for (int i{ 0 }; i < NetworkData::CLUE_MAX; ++i) {
Ref<ClueData> data{ db->get_clue((NetworkData::ClueID)i) };
if (data.is_valid() && data->get_revealed()) {
ydi::client::send::reveal_clue(data->get_id());
}
}
}
void ClientNode::_notification(int what) {
if (Engine::get_singleton()->is_editor_hint()) {
return;
}
switch (what) {
default:
return;
case NOTIFICATION_ENTER_TREE:
set_process(true);
return;
case NOTIFICATION_PROCESS:
process();
return;
case NOTIFICATION_EXIT_TREE:
exit_tree();
return;
}
}
ClientNode *ClientNode::get_singleton() {
return singleton_instance;
}
void ClientNode::connect_to_server(String const &url) {
ydi::client::connect(url);
}