From 3b004c57bc6096e65013dfd337113149e08ea6d6 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 15 Mar 2025 21:18:20 +0000 Subject: [PATCH] Codechange: Use EnumBitSet for AdminUpdateFrequency. (#13819) --- docs/admin_network.md | 2 +- src/debug.cpp | 2 +- src/network/core/tcp_admin.h | 22 +++++++------- src/network/network_admin.cpp | 54 +++++++++++++++++----------------- src/network/network_admin.h | 2 +- src/network/network_server.cpp | 10 +++---- 6 files changed, 46 insertions(+), 46 deletions(-) diff --git a/docs/admin_network.md b/docs/admin_network.md index 7dae8a0de8..9a1171f392 100644 --- a/docs/admin_network.md +++ b/docs/admin_network.md @@ -223,7 +223,7 @@ Last updated: 2024-03-26 ## 5.1) Receiving chat - Register `ADMIN_UPDATE_CHAT` at `ADMIN_FREQUENCY_AUTOMATIC` to receive chat. + Register `ADMIN_UPDATE_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 5c33cc8ff0..96764893b6 100644 --- a/src/debug.cpp +++ b/src/debug.cpp @@ -266,7 +266,7 @@ void DebugReconsiderSendRemoteMessages() bool enable = _settings_client.gui.developer >= 2; for (ServerNetworkAdminSocketHandler *as : ServerNetworkAdminSocketHandler::IterateActive()) { - if (as->update_frequency[ADMIN_UPDATE_CONSOLE] & ADMIN_FREQUENCY_AUTOMATIC) { + if (as->update_frequency[ADMIN_UPDATE_CONSOLE].Test(AdminUpdateFrequency::Automatic)) { enable = true; break; } diff --git a/src/network/core/tcp_admin.h b/src/network/core/tcp_admin.h index c6d8bf5f38..92d0d1781e 100644 --- a/src/network/core/tcp_admin.h +++ b/src/network/core/tcp_admin.h @@ -93,16 +93,16 @@ enum AdminUpdateType : uint8_t { }; /** Update frequencies an admin can register. */ -enum AdminUpdateFrequency : uint8_t { - ADMIN_FREQUENCY_POLL = 0x01, ///< The admin can poll this. - ADMIN_FREQUENCY_DAILY = 0x02, ///< The admin gets information about this on a daily basis. - ADMIN_FREQUENCY_WEEKLY = 0x04, ///< The admin gets information about this on a weekly basis. - ADMIN_FREQUENCY_MONTHLY = 0x08, ///< The admin gets information about this on a monthly basis. - ADMIN_FREQUENCY_QUARTERLY = 0x10, ///< The admin gets information about this on a quarterly basis. - ADMIN_FREQUENCY_ANUALLY = 0x20, ///< The admin gets information about this on a yearly basis. - ADMIN_FREQUENCY_AUTOMATIC = 0x40, ///< The admin gets information about this when it changes. +enum class AdminUpdateFrequency : uint8_t { + Poll, ///< The admin can poll this. + Daily, ///< The admin gets information about this on a daily basis. + Weekly, ///< The admin gets information about this on a weekly basis. + Monthly, ///< The admin gets information about this on a monthly basis. + Quarterly, ///< The admin gets information about this on a quarterly basis. + Annually, ///< The admin gets information about this on a yearly basis. + Automatic, ///< The admin gets information about this when it changes. }; -DECLARE_ENUM_AS_BIT_SET(AdminUpdateFrequency) +using AdminUpdateFrequencies = EnumBitSet; /** Reasons for removing a company - communicated to admins. */ enum AdminCompanyRemoveReason : uint8_t { @@ -142,7 +142,7 @@ protected: /** * Register updates to be sent at certain frequencies (as announced in the PROTOCOL packet): * uint16_t Update type (see #AdminUpdateType). Note integer type - see "Certain Packet Information" in docs/admin_network.md. - * uint16_t Update frequency (see #AdminUpdateFrequency), setting #ADMIN_FREQUENCY_POLL is always ignored. + * uint16_t Update frequency (see #AdminUpdateFrequency), setting #AdminUpdateFrequency::Poll is always ignored. * @param p The packet that was just received. * @return The state the network should have. */ @@ -150,7 +150,7 @@ 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 #ADMIN_FREQUENCY_POLL is advertised in the PROTOCOL packet. Note integer type - see "Certain Packet Information" in docs/admin_network.md. + * 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. diff --git a/src/network/network_admin.cpp b/src/network/network_admin.cpp index f5c540f624..c8a2295b94 100644 --- a/src/network/network_admin.cpp +++ b/src/network/network_admin.cpp @@ -43,17 +43,17 @@ static const std::chrono::seconds ADMIN_AUTHORISATION_TIMEOUT(10); /** Frequencies, which may be registered for a certain update type. */ -static const AdminUpdateFrequency _admin_update_type_frequencies[] = { - ADMIN_FREQUENCY_POLL | ADMIN_FREQUENCY_DAILY | ADMIN_FREQUENCY_WEEKLY | ADMIN_FREQUENCY_MONTHLY | ADMIN_FREQUENCY_QUARTERLY | ADMIN_FREQUENCY_ANUALLY, ///< ADMIN_UPDATE_DATE - ADMIN_FREQUENCY_POLL | ADMIN_FREQUENCY_AUTOMATIC, ///< ADMIN_UPDATE_CLIENT_INFO - ADMIN_FREQUENCY_POLL | ADMIN_FREQUENCY_AUTOMATIC, ///< ADMIN_UPDATE_COMPANY_INFO - ADMIN_FREQUENCY_POLL | ADMIN_FREQUENCY_WEEKLY | ADMIN_FREQUENCY_MONTHLY | ADMIN_FREQUENCY_QUARTERLY | ADMIN_FREQUENCY_ANUALLY, ///< ADMIN_UPDATE_COMPANY_ECONOMY - ADMIN_FREQUENCY_POLL | ADMIN_FREQUENCY_WEEKLY | ADMIN_FREQUENCY_MONTHLY | ADMIN_FREQUENCY_QUARTERLY | ADMIN_FREQUENCY_ANUALLY, ///< ADMIN_UPDATE_COMPANY_STATS - ADMIN_FREQUENCY_AUTOMATIC, ///< ADMIN_UPDATE_CHAT - ADMIN_FREQUENCY_AUTOMATIC, ///< ADMIN_UPDATE_CONSOLE - ADMIN_FREQUENCY_POLL, ///< ADMIN_UPDATE_CMD_NAMES - ADMIN_FREQUENCY_AUTOMATIC, ///< ADMIN_UPDATE_CMD_LOGGING - ADMIN_FREQUENCY_AUTOMATIC, ///< ADMIN_UPDATE_GAMESCRIPT +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); @@ -76,8 +76,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] & ADMIN_FREQUENCY_AUTOMATIC) { - this->update_frequency[ADMIN_UPDATE_CONSOLE] = (AdminUpdateFrequency)0; + if (this->update_frequency[ADMIN_UPDATE_CONSOLE].Test(AdminUpdateFrequency::Automatic)) { + this->update_frequency[ADMIN_UPDATE_CONSOLE] = {}; DebugReconsiderSendRemoteMessages(); } } @@ -155,7 +155,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendProtocol() for (int i = 0; i < ADMIN_UPDATE_END; i++) { p->Send_bool (true); p->Send_uint16(i); - p->Send_uint16(_admin_update_type_frequencies[i]); + p->Send_uint16(_admin_update_type_frequencies[i].base()); } p->Send_bool(false); @@ -661,9 +661,9 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_UPDATE_FREQUENC if (this->status <= ADMIN_STATUS_AUTHENTICATE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED); AdminUpdateType type = (AdminUpdateType)p.Recv_uint16(); - AdminUpdateFrequency freq = (AdminUpdateFrequency)p.Recv_uint16(); + AdminUpdateFrequencies freq = static_cast(p.Recv_uint16()); - if (type >= ADMIN_UPDATE_END || (_admin_update_type_frequencies[type] & freq) != freq) { + if (type >= ADMIN_UPDATE_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(NETWORK_ERROR_ILLEGAL_PACKET); @@ -879,7 +879,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_AUTH_RESPONSE(P void NetworkAdminClientInfo(const NetworkClientSocket *cs, bool new_client) { for (ServerNetworkAdminSocketHandler *as : ServerNetworkAdminSocketHandler::IterateActive()) { - if (as->update_frequency[ADMIN_UPDATE_CLIENT_INFO] & ADMIN_FREQUENCY_AUTOMATIC) { + if (as->update_frequency[ADMIN_UPDATE_CLIENT_INFO].Test(AdminUpdateFrequency::Automatic)) { as->SendClientInfo(cs, cs->GetInfo()); if (new_client) { as->SendClientJoin(cs->client_id); @@ -895,7 +895,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] & ADMIN_FREQUENCY_AUTOMATIC) { + if (as->update_frequency[ADMIN_UPDATE_CLIENT_INFO].Test(AdminUpdateFrequency::Automatic)) { as->SendClientUpdate(ci); } } @@ -908,7 +908,7 @@ void NetworkAdminClientUpdate(const NetworkClientInfo *ci) void NetworkAdminClientQuit(ClientID client_id) { for (ServerNetworkAdminSocketHandler *as : ServerNetworkAdminSocketHandler::IterateActive()) { - if (as->update_frequency[ADMIN_UPDATE_CLIENT_INFO] & ADMIN_FREQUENCY_AUTOMATIC) { + if (as->update_frequency[ADMIN_UPDATE_CLIENT_INFO].Test(AdminUpdateFrequency::Automatic)) { as->SendClientQuit(client_id); } } @@ -922,7 +922,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] & ADMIN_FREQUENCY_AUTOMATIC) { + if (as->update_frequency[ADMIN_UPDATE_CLIENT_INFO].Test(AdminUpdateFrequency::Automatic)) { as->SendClientError(client_id, error_code); } } @@ -940,7 +940,7 @@ void NetworkAdminCompanyNew(const Company *company) } for (ServerNetworkAdminSocketHandler *as : ServerNetworkAdminSocketHandler::IterateActive()) { - if (as->update_frequency[ADMIN_UPDATE_COMPANY_INFO] != ADMIN_FREQUENCY_AUTOMATIC) continue; + if (as->update_frequency[ADMIN_UPDATE_COMPANY_INFO] != AdminUpdateFrequency::Automatic) continue; as->SendCompanyNew(company->index); as->SendCompanyInfo(company); @@ -956,7 +956,7 @@ void NetworkAdminCompanyUpdate(const Company *company) if (company == nullptr) return; for (ServerNetworkAdminSocketHandler *as : ServerNetworkAdminSocketHandler::IterateActive()) { - if (as->update_frequency[ADMIN_UPDATE_COMPANY_INFO] != ADMIN_FREQUENCY_AUTOMATIC) continue; + if (as->update_frequency[ADMIN_UPDATE_COMPANY_INFO] != AdminUpdateFrequency::Automatic) continue; as->SendCompanyUpdate(company); } @@ -983,7 +983,7 @@ void NetworkAdminChat(NetworkAction action, DestType desttype, ClientID client_i if (from_admin) return; for (ServerNetworkAdminSocketHandler *as : ServerNetworkAdminSocketHandler::IterateActive()) { - if (as->update_frequency[ADMIN_UPDATE_CHAT] & ADMIN_FREQUENCY_AUTOMATIC) { + if (as->update_frequency[ADMIN_UPDATE_CHAT].Test(AdminUpdateFrequency::Automatic)) { as->SendChat(action, desttype, client_id, msg, data); } } @@ -1008,7 +1008,7 @@ void NetworkServerSendAdminRcon(AdminID admin_index, TextColour colour_code, con void NetworkAdminConsole(const std::string_view origin, const std::string_view string) { for (ServerNetworkAdminSocketHandler *as : ServerNetworkAdminSocketHandler::IterateActive()) { - if (as->update_frequency[ADMIN_UPDATE_CONSOLE] & ADMIN_FREQUENCY_AUTOMATIC) { + if (as->update_frequency[ADMIN_UPDATE_CONSOLE].Test(AdminUpdateFrequency::Automatic)) { as->SendConsole(origin, string); } } @@ -1021,7 +1021,7 @@ void NetworkAdminConsole(const std::string_view origin, const std::string_view s void NetworkAdminGameScript(const std::string_view json) { for (ServerNetworkAdminSocketHandler *as : ServerNetworkAdminSocketHandler::IterateActive()) { - if (as->update_frequency[ADMIN_UPDATE_GAMESCRIPT] & ADMIN_FREQUENCY_AUTOMATIC) { + if (as->update_frequency[ADMIN_UPDATE_GAMESCRIPT].Test(AdminUpdateFrequency::Automatic)) { as->SendGameScript(json); } } @@ -1037,7 +1037,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] & ADMIN_FREQUENCY_AUTOMATIC) { + if (as->update_frequency[ADMIN_UPDATE_CMD_LOGGING].Test(AdminUpdateFrequency::Automatic)) { as->SendCmdLogging(client_id, cp); } } @@ -1061,7 +1061,7 @@ void NetworkAdminUpdate(AdminUpdateFrequency freq) { for (ServerNetworkAdminSocketHandler *as : ServerNetworkAdminSocketHandler::IterateActive()) { for (int i = 0; i < ADMIN_UPDATE_END; i++) { - if (as->update_frequency[i] & freq) { + if (as->update_frequency[i].Test(freq)) { /* Update the admin for the required details */ switch (i) { case ADMIN_UPDATE_DATE: diff --git a/src/network/network_admin.h b/src/network/network_admin.h index 7028849deb..4551d0afaf 100644 --- a/src/network/network_admin.h +++ b/src/network/network_admin.h @@ -43,7 +43,7 @@ protected: NetworkRecvStatus SendAuthRequest(); NetworkRecvStatus SendEnableEncryption(); public: - std::array update_frequency{}; ///< Admin requested update intervals. + std::array update_frequency{}; ///< Admin requested update intervals. std::chrono::steady_clock::time_point connect_time{}; ///< Time of connection. NetworkAddress address{}; ///< Address of the admin. diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index d51c453874..eaa5e93ace 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -1874,7 +1874,7 @@ static IntervalTimer _economy_network_yearly({TimerGameEconomy { if (!_network_server) return; - NetworkAdminUpdate(ADMIN_FREQUENCY_ANUALLY); + NetworkAdminUpdate(AdminUpdateFrequency::Annually); }); /** Quarterly "callback". Called whenever the economy quarter changes. */ @@ -1883,7 +1883,7 @@ static IntervalTimer _network_quarterly({TimerGameEconomy::QUA if (!_network_server) return; NetworkAutoCleanCompanies(); - NetworkAdminUpdate(ADMIN_FREQUENCY_QUARTERLY); + NetworkAdminUpdate(AdminUpdateFrequency::Quarterly); }); /** Economy monthly "callback". Called whenever the economy month changes. */ @@ -1892,7 +1892,7 @@ static IntervalTimer _network_monthly({TimerGameEconomy::MONTH if (!_network_server) return; NetworkAutoCleanCompanies(); - NetworkAdminUpdate(ADMIN_FREQUENCY_MONTHLY); + NetworkAdminUpdate(AdminUpdateFrequency::Monthly); }); /** Economy weekly "callback". Called whenever the economy week changes. */ @@ -1900,7 +1900,7 @@ static IntervalTimer _network_weekly({TimerGameEconomy::WEEK, { if (!_network_server) return; - NetworkAdminUpdate(ADMIN_FREQUENCY_WEEKLY); + NetworkAdminUpdate(AdminUpdateFrequency::Weekly); }); /** Daily "callback". Called whenever the economy date changes. */ @@ -1908,7 +1908,7 @@ static IntervalTimer _economy_network_daily({TimerGameEconomy: { if (!_network_server) return; - NetworkAdminUpdate(ADMIN_FREQUENCY_DAILY); + NetworkAdminUpdate(AdminUpdateFrequency::Daily); }); /**