From 412c692afefee04b0c61c6b6a81d7e73c7520be9 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 11 Jun 2026 20:49:41 +0100 Subject: [PATCH] Codechange: make AdminUpdateType a scoped enum --- docs/admin_network.md | 36 +++++++-------- src/debug.cpp | 2 +- src/network/core/tcp_admin.h | 28 ++++++------ src/network/network_admin.cpp | 83 +++++++++++++++++------------------ src/network/network_admin.h | 2 +- 5 files changed, 75 insertions(+), 76 deletions(-) diff --git a/docs/admin_network.md b/docs/admin_network.md index 9067a614b9..5bfbefb231 100644 --- a/docs/admin_network.md +++ b/docs/admin_network.md @@ -114,11 +114,11 @@ Last updated: 2024-03-26 Additional debug information can be found with a debug level of `net=3`. - `ADMIN_UPDATE_DATE` results in the server sending: + `AdminUpdateType::Date` results in the server sending: - PacketAdminType::ServerDate - `ADMIN_UPDATE_CLIENT_INFO` results in the server sending: + `AdminUpdateType::ClientInfo` results in the server sending: - PacketAdminType::ServerClientJoin - PacketAdminType::ServerClientInfo @@ -126,31 +126,31 @@ Last updated: 2024-03-26 - PacketAdminType::ServerClientQuit - PacketAdminType::ServerClientError - `ADMIN_UPDATE_COMPANY_INFO` results in the server sending: + `AdminUpdateType::CompanyInfo` results in the server sending: - PacketAdminType::ServerCompanyNew - PacketAdminType::ServerCompanyInfo - PacketAdminType::ServerCompanyUpdate - PacketAdminType::ServerCompanyRemove - `ADMIN_UPDATE_COMPANY_ECONOMY` results in the server sending: + `AdminUpdateType::CompanyEconomy` results in the server sending: - PacketAdminType::ServerCompanyEconomy - `ADMIN_UPDATE_COMPANY_STATS` results in the server sending: + `AdminUpdateType::CompanyStats` results in the server sending: - PacketAdminType::ServerCompanyStatistics - `ADMIN_UPDATE_CHAT` results in the server sending: + `AdminUpdateType::Chat` results in the server sending: - PacketAdminType::ServerChat - `ADMIN_UPDATE_CONSOLE` results in the server sending: + `AdminUpdateType::Console` results in the server sending: - PacketAdminType::ServerConsole - `ADMIN_UPDATE_CMD_LOGGING` results in the server sending: + `AdminUpdateType::CmdLogging` results in the server sending: - PacketAdminType::ServerCommandLogging @@ -158,17 +158,17 @@ Last updated: 2024-03-26 Certain `AdminUpdateTypes` can also be polled: - - ADMIN_UPDATE_DATE - - ADMIN_UPDATE_CLIENT_INFO - - ADMIN_UPDATE_COMPANY_INFO - - ADMIN_UPDATE_COMPANY_ECONOMY - - ADMIN_UPDATE_COMPANY_STATS - - ADMIN_UPDATE_CMD_NAMES + - AdminUpdateType::Date + - AdminUpdateType::ClientInfo + - AdminUpdateType::CompanyInfo + - AdminUpdateType::CompanyEconomy + - AdminUpdateType::CompanyStats + - AdminUpdateType::CmdNames Please note the potential gotcha in the "Certain packet information" section below when using the `ADMIN_POLL` packet. - `ADMIN_UPDATE_CLIENT_INFO` and `ADMIN_UPDATE_COMPANY_INFO` accept an additional + `AdminUpdateType::ClientInfo` and `AdminUpdateType::CompanyInfo` accept an additional parameter. This parameter is used to specify a certain client or company. Setting this parameter to `UINT32_MAX (0xFFFFFFFF)` will tell the server you want to receive updates for all clients or companies. @@ -181,7 +181,7 @@ Last updated: 2024-03-26 ## 4.0) Sending rcon commands - Rcon runs separate from the `ADMIN_UPDATE_CONSOLE` `AdminUpdateType`. Requesting + Rcon runs separate from the `AdminUpdateType::Console` `AdminUpdateType`. Requesting the execution of a remote console command is done with the packet `PacketAdminType::AdminRemoteConsoleCommand`. @@ -190,7 +190,7 @@ Last updated: 2024-03-26 The server will reply with one or more `PacketAdminType::ServerRemoteConsoleCommand` packets. Finally an `PacketAdminType::AdminRemoteConsoleCommandEnd` packet will be sent. Applications will not receive the answer twice if they have asked for the `AdminUpdateType` - `ADMIN_UPDATE_CONSOLE`, as the result is not printed on the servers console + `AdminUpdateType::Console`, as the result is not printed on the servers console (just like clients rcon commands). Furthermore, sending a `say` command (or any similar command) will not @@ -223,7 +223,7 @@ Last updated: 2024-03-26 ## 5.1) Receiving chat - Register `ADMIN_UPDATE_CHAT` at `AdminUpdateFrequency::Automatic` to receive chat. + Register `AdminUpdateType::Chat` at `AdminUpdateFrequency::Automatic` to receive chat. The application will be able to receive all chat the server can see. The configuration option `network.server_admin_chat` specifies whether diff --git a/src/debug.cpp b/src/debug.cpp index 7e2fbf7c4e..a03bc16a99 100644 --- a/src/debug.cpp +++ b/src/debug.cpp @@ -263,7 +263,7 @@ void DebugReconsiderSendRemoteMessages() bool enable = _settings_client.gui.developer >= 2; for (ServerNetworkAdminSocketHandler *as : ServerNetworkAdminSocketHandler::IterateActive()) { - if (as->update_frequency[ADMIN_UPDATE_CONSOLE].Test(AdminUpdateFrequency::Automatic)) { + if (as->update_frequency[AdminUpdateType::Console].Test(AdminUpdateFrequency::Automatic)) { enable = true; break; } diff --git a/src/network/core/tcp_admin.h b/src/network/core/tcp_admin.h index de4a04ec63..b5e3496737 100644 --- a/src/network/core/tcp_admin.h +++ b/src/network/core/tcp_admin.h @@ -77,18 +77,18 @@ enum class AdminStatus : uint8_t { }; /** Update types an admin can register a frequency for */ -enum AdminUpdateType : uint8_t { - ADMIN_UPDATE_DATE, ///< Updates about the date of the game. - ADMIN_UPDATE_CLIENT_INFO, ///< Updates about the information of clients. - ADMIN_UPDATE_COMPANY_INFO, ///< Updates about the generic information of companies. - ADMIN_UPDATE_COMPANY_ECONOMY, ///< Updates about the economy of companies. - ADMIN_UPDATE_COMPANY_STATS, ///< Updates about the statistics of companies. - ADMIN_UPDATE_CHAT, ///< The admin would like to have chat messages. - ADMIN_UPDATE_CONSOLE, ///< The admin would like to have console messages. - ADMIN_UPDATE_CMD_NAMES, ///< The admin would like a list of all DoCommand names. - ADMIN_UPDATE_CMD_LOGGING, ///< The admin would like to have DoCommand information. - ADMIN_UPDATE_GAMESCRIPT, ///< The admin would like to have gamescript messages. - ADMIN_UPDATE_END, ///< Must ALWAYS be on the end of this list!! (period) +enum class AdminUpdateType : uint8_t { + Date, ///< Updates about the date of the game. + ClientInfo, ///< Updates about the information of clients. + CompanyInfo, ///< Updates about the generic information of companies. + CompanyEconomy, ///< Updates about the economy of companies. + CompanyStats, ///< Updates about the statistics of companies. + Chat, ///< The admin would like to have chat messages. + Console, ///< The admin would like to have console messages. + CmdNames, ///< The admin would like a list of all DoCommand names. + CmdLogging, ///< The admin would like to have DoCommand information. + Gamescript, ///< The admin would like to have gamescript messages. + End, ///< Must ALWAYS be on the end of this list!! (period) }; /** Update frequencies an admin can register. */ @@ -151,8 +151,8 @@ protected: * Poll the server for certain updates, an invalid poll (e.g. not existent id) gets silently dropped: * uint8_t #AdminUpdateType the server should answer for, only if #AdminUpdateFrequency::Poll is advertised in the PROTOCOL packet. Note integer type - see "Certain Packet Information" in docs/admin_network.md. * uint32_t ID relevant to the packet type, e.g. - * - the client ID for #ADMIN_UPDATE_CLIENT_INFO. Use UINT32_MAX to show all clients. - * - the company ID for #ADMIN_UPDATE_COMPANY_INFO. Use UINT32_MAX to show all companies. + * - the client ID for #AdminUpdateType::ClientInfo. Use UINT32_MAX to show all clients. + * - the company ID for #AdminUpdateType::CompanyInfo. Use UINT32_MAX to show all companies. * @param p The packet that was just received. * @return The state the network should have. */ diff --git a/src/network/network_admin.cpp b/src/network/network_admin.cpp index 3b8eb8cb1b..0671360964 100644 --- a/src/network/network_admin.cpp +++ b/src/network/network_admin.cpp @@ -8,6 +8,7 @@ /** @file network_admin.cpp Server part of the admin network protocol. */ #include "../stdafx.h" + #include "../strings_func.h" #include "../timer/timer_game_calendar.h" #include "../timer/timer_game_calendar.h" @@ -45,20 +46,18 @@ static const std::chrono::seconds ADMIN_AUTHORISATION_TIMEOUT{10}; /** Frequencies, which may be registered for a certain update type. */ -static const AdminUpdateFrequencies _admin_update_type_frequencies[] = { - {AdminUpdateFrequency::Poll, AdminUpdateFrequency::Daily, AdminUpdateFrequency::Weekly, AdminUpdateFrequency::Monthly, AdminUpdateFrequency::Quarterly, AdminUpdateFrequency::Annually}, // ADMIN_UPDATE_DATE - {AdminUpdateFrequency::Poll, AdminUpdateFrequency::Automatic, }, // ADMIN_UPDATE_CLIENT_INFO - {AdminUpdateFrequency::Poll, AdminUpdateFrequency::Automatic, }, // ADMIN_UPDATE_COMPANY_INFO - {AdminUpdateFrequency::Poll, AdminUpdateFrequency::Weekly, AdminUpdateFrequency::Monthly, AdminUpdateFrequency::Quarterly, AdminUpdateFrequency::Annually}, // ADMIN_UPDATE_COMPANY_ECONOMY - {AdminUpdateFrequency::Poll, AdminUpdateFrequency::Weekly, AdminUpdateFrequency::Monthly, AdminUpdateFrequency::Quarterly, AdminUpdateFrequency::Annually}, // ADMIN_UPDATE_COMPANY_STATS - { AdminUpdateFrequency::Automatic, }, // ADMIN_UPDATE_CHAT - { AdminUpdateFrequency::Automatic, }, // ADMIN_UPDATE_CONSOLE - {AdminUpdateFrequency::Poll, }, // ADMIN_UPDATE_CMD_NAMES - { AdminUpdateFrequency::Automatic, }, // ADMIN_UPDATE_CMD_LOGGING - { AdminUpdateFrequency::Automatic, }, // ADMIN_UPDATE_GAMESCRIPT -}; -/** Sanity check. */ -static_assert(lengthof(_admin_update_type_frequencies) == ADMIN_UPDATE_END); +static const EnumIndexArray _admin_update_type_frequencies{{{ + {AdminUpdateFrequency::Poll, AdminUpdateFrequency::Daily, AdminUpdateFrequency::Weekly, AdminUpdateFrequency::Monthly, AdminUpdateFrequency::Quarterly, AdminUpdateFrequency::Annually}, // AdminUpdateType::Date + {AdminUpdateFrequency::Poll, AdminUpdateFrequency::Automatic, }, // AdminUpdateType::ClientInfo + {AdminUpdateFrequency::Poll, AdminUpdateFrequency::Automatic, }, // AdminUpdateType::CompanyInfo + {AdminUpdateFrequency::Poll, AdminUpdateFrequency::Weekly, AdminUpdateFrequency::Monthly, AdminUpdateFrequency::Quarterly, AdminUpdateFrequency::Annually}, // AdminUpdateType::CompanyEconomy + {AdminUpdateFrequency::Poll, AdminUpdateFrequency::Weekly, AdminUpdateFrequency::Monthly, AdminUpdateFrequency::Quarterly, AdminUpdateFrequency::Annually}, // AdminUpdateType::CompanyStats + { AdminUpdateFrequency::Automatic, }, // AdminUpdateType::Chat + { AdminUpdateFrequency::Automatic, }, // AdminUpdateType::Console + {AdminUpdateFrequency::Poll, }, // AdminUpdateType::CmdNames + { AdminUpdateFrequency::Automatic, }, // AdminUpdateType::CmdLogging + { AdminUpdateFrequency::Automatic, }, // AdminUpdateType::Gamescript +}}}; /** * Create a new socket for the server side of the admin network. @@ -80,8 +79,8 @@ ServerNetworkAdminSocketHandler::~ServerNetworkAdminSocketHandler() Debug(net, 3, "[admin] '{}' ({}) has disconnected", this->admin_name, this->admin_version); if (_redirect_console_to_admin == this->index) _redirect_console_to_admin = AdminID::Invalid(); - if (this->update_frequency[ADMIN_UPDATE_CONSOLE].Test(AdminUpdateFrequency::Automatic)) { - this->update_frequency[ADMIN_UPDATE_CONSOLE] = {}; + if (this->update_frequency[AdminUpdateType::Console].Test(AdminUpdateFrequency::Automatic)) { + this->update_frequency[AdminUpdateType::Console] = {}; DebugReconsiderSendRemoteMessages(); } } @@ -160,9 +159,9 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendProtocol() /* announce the protocol version */ p->Send_uint8(NETWORK_GAME_ADMIN_VERSION); - for (AdminUpdateType i : EnumRange(ADMIN_UPDATE_END)) { + for (AdminUpdateType i : EnumRange(AdminUpdateType::End)) { p->Send_bool (true); - p->Send_uint16(i); + p->Send_uint16(to_underlying(i)); p->Send_uint16(_admin_update_type_frequencies[i].base()); } @@ -701,10 +700,10 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::ReceiveAdminUpdateFrequency(P { if (this->status <= AdminStatus::Authenticate) return this->SendError(NetworkErrorCode::NotExpected); - AdminUpdateType type = (AdminUpdateType)p.Recv_uint16(); + AdminUpdateType type = static_cast(p.Recv_uint16()); AdminUpdateFrequencies freq = static_cast(p.Recv_uint16()); - if (type >= ADMIN_UPDATE_END || !_admin_update_type_frequencies[type].All(freq)) { + if (type >= AdminUpdateType::End || !_admin_update_type_frequencies[type].All(freq)) { /* The server does not know of this UpdateType. */ Debug(net, 1, "[admin] Not supported update frequency {} ({}) from '{}' ({})", type, freq, this->admin_name, this->admin_version); return this->SendError(NetworkErrorCode::IllegalPacket); @@ -712,7 +711,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::ReceiveAdminUpdateFrequency(P this->update_frequency[type] = freq; - if (type == ADMIN_UPDATE_CONSOLE) DebugReconsiderSendRemoteMessages(); + if (type == AdminUpdateType::Console) DebugReconsiderSendRemoteMessages(); return NETWORK_RECV_STATUS_OKAY; } @@ -721,16 +720,16 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::ReceiveAdminPoll(Packet &p) { if (this->status <= AdminStatus::Authenticate) return this->SendError(NetworkErrorCode::NotExpected); - AdminUpdateType type = (AdminUpdateType)p.Recv_uint8(); + AdminUpdateType type = static_cast(p.Recv_uint8()); uint32_t d1 = p.Recv_uint32(); switch (type) { - case ADMIN_UPDATE_DATE: + case AdminUpdateType::Date: /* The admin is requesting the current date. */ this->SendDate(); break; - case ADMIN_UPDATE_CLIENT_INFO: + case AdminUpdateType::ClientInfo: /* The admin is requesting client info. */ if (d1 == UINT32_MAX) { this->SendClientInfo(nullptr, NetworkClientInfo::GetByClientID(CLIENT_ID_SERVER)); @@ -747,7 +746,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::ReceiveAdminPoll(Packet &p) } break; - case ADMIN_UPDATE_COMPANY_INFO: + case AdminUpdateType::CompanyInfo: /* The admin is asking for company info. */ if (d1 == UINT32_MAX) { for (const Company *company : Company::Iterate()) { @@ -759,17 +758,17 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::ReceiveAdminPoll(Packet &p) } break; - case ADMIN_UPDATE_COMPANY_ECONOMY: + case AdminUpdateType::CompanyEconomy: /* The admin is requesting economy info. */ this->SendCompanyEconomy(); break; - case ADMIN_UPDATE_COMPANY_STATS: + case AdminUpdateType::CompanyStats: /* the admin is requesting company stats. */ this->SendCompanyStats(); break; - case ADMIN_UPDATE_CMD_NAMES: + case AdminUpdateType::CmdNames: /* The admin is requesting the names of DoCommands. */ this->SendCmdNames(); break; @@ -928,7 +927,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::ReceiveAdminAuthenticationRes void NetworkAdminClientInfo(const NetworkClientSocket *cs, bool new_client) { for (ServerNetworkAdminSocketHandler *as : ServerNetworkAdminSocketHandler::IterateActive()) { - if (as->update_frequency[ADMIN_UPDATE_CLIENT_INFO].Test(AdminUpdateFrequency::Automatic)) { + if (as->update_frequency[AdminUpdateType::ClientInfo].Test(AdminUpdateFrequency::Automatic)) { as->SendClientInfo(cs, cs->GetInfo()); if (new_client) { as->SendClientJoin(cs->client_id); @@ -944,7 +943,7 @@ void NetworkAdminClientInfo(const NetworkClientSocket *cs, bool new_client) void NetworkAdminClientUpdate(const NetworkClientInfo *ci) { for (ServerNetworkAdminSocketHandler *as : ServerNetworkAdminSocketHandler::IterateActive()) { - if (as->update_frequency[ADMIN_UPDATE_CLIENT_INFO].Test(AdminUpdateFrequency::Automatic)) { + if (as->update_frequency[AdminUpdateType::ClientInfo].Test(AdminUpdateFrequency::Automatic)) { as->SendClientUpdate(ci); } } @@ -957,7 +956,7 @@ void NetworkAdminClientUpdate(const NetworkClientInfo *ci) void NetworkAdminClientQuit(ClientID client_id) { for (ServerNetworkAdminSocketHandler *as : ServerNetworkAdminSocketHandler::IterateActive()) { - if (as->update_frequency[ADMIN_UPDATE_CLIENT_INFO].Test(AdminUpdateFrequency::Automatic)) { + if (as->update_frequency[AdminUpdateType::ClientInfo].Test(AdminUpdateFrequency::Automatic)) { as->SendClientQuit(client_id); } } @@ -971,7 +970,7 @@ void NetworkAdminClientQuit(ClientID client_id) void NetworkAdminClientError(ClientID client_id, NetworkErrorCode error_code) { for (ServerNetworkAdminSocketHandler *as : ServerNetworkAdminSocketHandler::IterateActive()) { - if (as->update_frequency[ADMIN_UPDATE_CLIENT_INFO].Test(AdminUpdateFrequency::Automatic)) { + if (as->update_frequency[AdminUpdateType::ClientInfo].Test(AdminUpdateFrequency::Automatic)) { as->SendClientError(client_id, error_code); } } @@ -989,7 +988,7 @@ void NetworkAdminCompanyNew(const Company *company) } for (ServerNetworkAdminSocketHandler *as : ServerNetworkAdminSocketHandler::IterateActive()) { - if (as->update_frequency[ADMIN_UPDATE_COMPANY_INFO] != AdminUpdateFrequency::Automatic) continue; + if (as->update_frequency[AdminUpdateType::CompanyInfo] != AdminUpdateFrequency::Automatic) continue; as->SendCompanyNew(company->index); as->SendCompanyInfo(company); @@ -1005,7 +1004,7 @@ void NetworkAdminCompanyUpdate(const Company *company) if (company == nullptr) return; for (ServerNetworkAdminSocketHandler *as : ServerNetworkAdminSocketHandler::IterateActive()) { - if (as->update_frequency[ADMIN_UPDATE_COMPANY_INFO] != AdminUpdateFrequency::Automatic) continue; + if (as->update_frequency[AdminUpdateType::CompanyInfo] != AdminUpdateFrequency::Automatic) continue; as->SendCompanyUpdate(company); } @@ -1038,7 +1037,7 @@ void NetworkAdminChat(NetworkAction action, NetworkChatDestinationType desttype, if (from_admin) return; for (ServerNetworkAdminSocketHandler *as : ServerNetworkAdminSocketHandler::IterateActive()) { - if (as->update_frequency[ADMIN_UPDATE_CHAT].Test(AdminUpdateFrequency::Automatic)) { + if (as->update_frequency[AdminUpdateType::Chat].Test(AdminUpdateFrequency::Automatic)) { as->SendChat(action, desttype, client_id, msg, data); } } @@ -1063,7 +1062,7 @@ void NetworkServerSendAdminRcon(AdminID admin_index, ExtendedTextColour colour_c void NetworkAdminConsole(std::string_view origin, std::string_view string) { for (ServerNetworkAdminSocketHandler *as : ServerNetworkAdminSocketHandler::IterateActive()) { - if (as->update_frequency[ADMIN_UPDATE_CONSOLE].Test(AdminUpdateFrequency::Automatic)) { + if (as->update_frequency[AdminUpdateType::Console].Test(AdminUpdateFrequency::Automatic)) { as->SendConsole(origin, string); } } @@ -1076,7 +1075,7 @@ void NetworkAdminConsole(std::string_view origin, std::string_view string) void NetworkAdminGameScript(std::string_view json) { for (ServerNetworkAdminSocketHandler *as : ServerNetworkAdminSocketHandler::IterateActive()) { - if (as->update_frequency[ADMIN_UPDATE_GAMESCRIPT].Test(AdminUpdateFrequency::Automatic)) { + if (as->update_frequency[AdminUpdateType::Gamescript].Test(AdminUpdateFrequency::Automatic)) { as->SendGameScript(json); } } @@ -1092,7 +1091,7 @@ void NetworkAdminCmdLogging(const NetworkClientSocket *owner, const CommandPacke ClientID client_id = owner == nullptr ? _network_own_client_id : owner->client_id; for (ServerNetworkAdminSocketHandler *as : ServerNetworkAdminSocketHandler::IterateActive()) { - if (as->update_frequency[ADMIN_UPDATE_CMD_LOGGING].Test(AdminUpdateFrequency::Automatic)) { + if (as->update_frequency[AdminUpdateType::CmdLogging].Test(AdminUpdateFrequency::Automatic)) { as->SendCmdLogging(client_id, cp); } } @@ -1115,19 +1114,19 @@ void ServerNetworkAdminSocketHandler::WelcomeAll() void NetworkAdminUpdate(AdminUpdateFrequency freq) { for (ServerNetworkAdminSocketHandler *as : ServerNetworkAdminSocketHandler::IterateActive()) { - for (AdminUpdateType i : EnumRange(ADMIN_UPDATE_END)) { + for (AdminUpdateType i : EnumRange(AdminUpdateType::End)) { if (as->update_frequency[i].Test(freq)) { /* Update the admin for the required details */ switch (i) { - case ADMIN_UPDATE_DATE: + case AdminUpdateType::Date: as->SendDate(); break; - case ADMIN_UPDATE_COMPANY_ECONOMY: + case AdminUpdateType::CompanyEconomy: as->SendCompanyEconomy(); break; - case ADMIN_UPDATE_COMPANY_STATS: + case AdminUpdateType::CompanyStats: as->SendCompanyStats(); break; diff --git a/src/network/network_admin.h b/src/network/network_admin.h index d0ca4fa0ff..54ee94770c 100644 --- a/src/network/network_admin.h +++ b/src/network/network_admin.h @@ -44,7 +44,7 @@ protected: NetworkRecvStatus SendAuthRequest(); NetworkRecvStatus SendEnableEncryption(); public: - std::array update_frequency{}; ///< Admin requested update intervals. + EnumIndexArray update_frequency{}; ///< Admin requested update intervals. std::chrono::steady_clock::time_point connect_time{}; ///< Time of connection. NetworkAddress address{}; ///< Address of the admin.