Codechange: make AdminUpdateType a scoped enum

This commit is contained in:
Peter Nelson
2026-06-11 20:49:41 +01:00
committed by Peter Nelson
parent bd86fe69c0
commit 412c692afe
5 changed files with 75 additions and 76 deletions
+18 -18
View File
@@ -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
+1 -1
View File
@@ -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;
}
+14 -14
View File
@@ -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.
*/
+41 -42
View File
@@ -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<AdminUpdateFrequencies, AdminUpdateType, AdminUpdateType::End> _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<AdminUpdateType>(p.Recv_uint16());
AdminUpdateFrequencies freq = static_cast<AdminUpdateFrequencies>(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<AdminUpdateType>(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;
+1 -1
View File
@@ -44,7 +44,7 @@ protected:
NetworkRecvStatus SendAuthRequest();
NetworkRecvStatus SendEnableEncryption();
public:
std::array<AdminUpdateFrequencies, ADMIN_UPDATE_END> update_frequency{}; ///< Admin requested update intervals.
EnumIndexArray<AdminUpdateFrequencies, AdminUpdateType, AdminUpdateType::End> update_frequency{}; ///< Admin requested update intervals.
std::chrono::steady_clock::time_point connect_time{}; ///< Time of connection.
NetworkAddress address{}; ///< Address of the admin.