From c66a755ef7d67d36d01089de8201d4142bc0a93e Mon Sep 17 00:00:00 2001 From: Ted John Date: Mon, 30 May 2016 22:25:43 +0100 Subject: [PATCH] request server gameinfo for window --- src/network/network.cpp | 62 +++++++++++++++++++++++++++++++++++++++ src/network/network.h | 13 ++++++++ src/windows/multiplayer.c | 33 ++++++++++++++------- 3 files changed, 98 insertions(+), 10 deletions(-) diff --git a/src/network/network.cpp b/src/network/network.cpp index ed020487db..eb94b4a959 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -111,6 +111,7 @@ Network::Network() client_command_handlers[NETWORK_COMMAND_SHOWERROR] = &Network::Client_Handle_SHOWERROR; client_command_handlers[NETWORK_COMMAND_GROUPLIST] = &Network::Client_Handle_GROUPLIST; client_command_handlers[NETWORK_COMMAND_EVENT] = &Network::Client_Handle_EVENT; + client_command_handlers[NETWORK_COMMAND_GAMEINFO] = &Network::Client_Handle_GAMEINFO; client_command_handlers[NETWORK_COMMAND_TOKEN] = &Network::Client_Handle_TOKEN; server_command_handlers.resize(NETWORK_COMMAND_MAX, 0); server_command_handlers[NETWORK_COMMAND_AUTH] = &Network::Server_Handle_AUTH; @@ -142,6 +143,12 @@ bool Network::Init() #endif status = NETWORK_STATUS_READY; + + ServerName = std::string(); + ServerDescription = std::string(); + ServerProviderName = std::string(); + ServerProviderEmail = std::string(); + ServerProviderWebsite = std::string(); return true; } @@ -303,6 +310,12 @@ bool Network::BeginServer(unsigned short port, const char* address) return false; } + ServerName = gConfigNetwork.server_name; + ServerDescription = gConfigNetwork.server_description; + ServerProviderName = gConfigNetwork.provider_name; + ServerProviderEmail = gConfigNetwork.provider_email; + ServerProviderWebsite = gConfigNetwork.provider_website; + cheats_reset(); LoadGroups(); BeginChatLog(); @@ -1487,6 +1500,9 @@ void Network::Client_Handle_AUTH(NetworkConnection& connection, NetworkPacket& p { packet >> (uint32&)connection.AuthStatus >> (uint8&)player_id; switch(connection.AuthStatus) { + case NETWORK_AUTH_OK: + Client_Send_GAMEINFO(); + break; case NETWORK_AUTH_BADNAME: connection.SetLastDisconnectReason(STR_MULTIPLAYER_BAD_PLAYER_NAME); shutdown(connection.Socket, SHUT_RDWR); @@ -1518,6 +1534,8 @@ void Network::Client_Handle_AUTH(NetworkConnection& connection, NetworkPacket& p shutdown(connection.Socket, SHUT_RDWR); break; default: + connection.SetLastDisconnectReason(STR_MULTIPLAYER_INCORRECT_SOFTWARE_VERSION); + shutdown(connection.Socket, SHUT_RDWR); break; } } @@ -1913,6 +1931,39 @@ void Network::Client_Handle_EVENT(NetworkConnection& connection, NetworkPacket& } } +void Network::Client_Send_GAMEINFO() +{ + log_verbose("requesting gameinfo"); + std::unique_ptr packet = std::move(NetworkPacket::Allocate()); + *packet << (uint32)NETWORK_COMMAND_GAMEINFO; + server_connection.QueuePacket(std::move(packet)); +} + +std::string json_stdstring_value(const json_t * string) +{ + const char * cstr = json_string_value(string); + return cstr == nullptr ? std::string() : std::string(cstr); +} + +void Network::Client_Handle_GAMEINFO(NetworkConnection& connection, NetworkPacket& packet) +{ + const char * jsonString = packet.ReadString(); + + json_error_t error; + json_t *root = json_loads(jsonString, 0, &error); + + ServerName = json_stdstring_value(json_object_get(root, "name")); + ServerDescription = json_stdstring_value(json_object_get(root, "description")); + + json_t *jsonProvider = json_object_get(root, "provider"); + if (jsonProvider != nullptr) { + ServerProviderName = json_stdstring_value(json_object_get(root, "name")); + ServerProviderEmail = json_stdstring_value(json_object_get(root, "email")); + ServerProviderWebsite = json_stdstring_value(json_object_get(root, "website")); + } + json_decref(root); +} + int network_init() { return gNetwork.Init(); @@ -2394,6 +2445,12 @@ static void network_get_keymap_path(utf8 *buffer, size_t bufferSize) Path::Append(buffer, bufferSize, "keymappings.json"); } +const utf8 * network_get_server_name() { return gNetwork.ServerName.c_str(); } +const utf8 * network_get_server_description() { return gNetwork.ServerDescription.c_str(); } +const utf8 * network_get_server_provider_name() { return gNetwork.ServerProviderName.c_str(); } +const utf8 * network_get_server_provider_email() { return gNetwork.ServerProviderEmail.c_str(); } +const utf8 * network_get_server_provider_website() { return gNetwork.ServerProviderWebsite.c_str(); } + #else int network_get_mode() { return NETWORK_MODE_NONE; } int network_get_status() { return NETWORK_STATUS_NONE; } @@ -2441,4 +2498,9 @@ void network_set_password(const char* password) {} uint8 network_get_current_player_id() { return 0; } int network_get_current_player_group_index() { return 0; } void network_append_chat_log(const utf8 *text) { } +const utf8 * network_get_server_name() { return nullptr; } +const utf8 * network_get_server_description() { return nullptr; } +const utf8 * network_get_server_provider_name() { return nullptr; } +const utf8 * network_get_server_provider_email() { return nullptr; } +const utf8 * network_get_server_provider_website() { return nullptr; } #endif /* DISABLE_NETWORK */ diff --git a/src/network/network.h b/src/network/network.h index 61994aed56..7a81d6f4df 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -144,6 +144,7 @@ public: void Server_Send_GROUPLIST(NetworkConnection& connection); void Server_Send_EVENT_PLAYER_JOINED(const char *playerName); void Server_Send_EVENT_PLAYER_DISCONNECTED(const char *playerName, const char *reason); + void Client_Send_GAMEINFO(); std::vector> player_list; std::vector> group_list; @@ -151,6 +152,12 @@ public: std::vector challenge; NetworkUserManager _userManager; + std::string ServerName; + std::string ServerDescription; + std::string ServerProviderName; + std::string ServerProviderEmail; + std::string ServerProviderWebsite; + private: bool ProcessConnection(NetworkConnection& connection); void ProcessPacket(NetworkConnection& connection, NetworkPacket& packet); @@ -226,6 +233,7 @@ private: void Server_Handle_PING(NetworkConnection& connection, NetworkPacket& packet); void Client_Handle_PINGLIST(NetworkConnection& connection, NetworkPacket& packet); void Client_Handle_SETDISCONNECTMSG(NetworkConnection& connection, NetworkPacket& packet); + void Client_Handle_GAMEINFO(NetworkConnection& connection, NetworkPacket& packet); void Server_Handle_GAMEINFO(NetworkConnection& connection, NetworkPacket& packet); void Client_Handle_SHOWERROR(NetworkConnection& connection, NetworkPacket& packet); void Client_Handle_GROUPLIST(NetworkConnection& connection, NetworkPacket& packet); @@ -292,6 +300,11 @@ void network_set_password(const char* password); void network_print_error(); void network_append_chat_log(const utf8 *text); +const utf8 * network_get_server_name(); +const utf8 * network_get_server_description(); +const utf8 * network_get_server_provider_name(); +const utf8 * network_get_server_provider_email(); +const utf8 * network_get_server_provider_website(); #ifdef __cplusplus } diff --git a/src/windows/multiplayer.c b/src/windows/multiplayer.c index 053e242a9d..0e4461ceb3 100644 --- a/src/windows/multiplayer.c +++ b/src/windows/multiplayer.c @@ -442,23 +442,36 @@ static void window_multiplayer_information_paint(rct_window *w, rct_drawpixelinf int x = 3; int y = 50; int width = w->width - 6; - gfx_draw_string_left_wrapped(dpi, &gConfigNetwork.server_name, x, y, width, STR_STRING, w->colours[1]); - y += 11 + 3; - if (!str_is_null_or_empty(gConfigNetwork.server_description)) { - gfx_draw_string_left_wrapped(dpi, &gConfigNetwork.server_description, x, y, width, STR_STRING, w->colours[1]); + + const utf8 * name = network_get_server_name(); + { + gfx_draw_string_left_wrapped(dpi, (void*)&name, x, y, width, STR_STRING, w->colours[1]); + y += 11; + } + y += 3; + + const utf8 * description = network_get_server_description(); + if (!str_is_null_or_empty(description)) { + gfx_draw_string_left_wrapped(dpi, (void*)&description, x, y, width, STR_STRING, w->colours[1]); y += 11; } y += 8; - if (!str_is_null_or_empty(gConfigNetwork.provider_name)) { - gfx_draw_string_left(dpi, STR_PROVIDER_NAME, &gConfigNetwork.provider_name, 0, x, y); + + const utf8 * providerName = network_get_server_provider_name(); + if (!str_is_null_or_empty(providerName)) { + gfx_draw_string_left(dpi, STR_PROVIDER_NAME, (void*)&providerName, 0, x, y); y += 11; } - if (!str_is_null_or_empty(gConfigNetwork.provider_email)) { - gfx_draw_string_left(dpi, STR_PROVIDER_EMAIL, &gConfigNetwork.provider_email, 0, x, y); + + const utf8 * providerEmail = network_get_server_provider_email(); + if (!str_is_null_or_empty(providerEmail)) { + gfx_draw_string_left(dpi, STR_PROVIDER_EMAIL, (void*)&providerEmail, 0, x, y); y += 11; } - if (!str_is_null_or_empty(gConfigNetwork.provider_website)) { - gfx_draw_string_left(dpi, STR_PROVIDER_WEBSITE, &gConfigNetwork.provider_website, 0, x, y); + + const utf8 * providerWebsite = network_get_server_provider_website(); + if (!str_is_null_or_empty(providerWebsite)) { + gfx_draw_string_left(dpi, STR_PROVIDER_WEBSITE, (void*)&providerWebsite, 0, x, y); } } }