From d2526780bec00b17d00947fdaae57411f183786f Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Sat, 15 Oct 2022 21:41:07 +0100 Subject: [PATCH] Include list of connected clients in server desync logs Save full date including fractional part in NetworkClientInfo --- src/crashlog.cpp | 7 +++++++ src/network/network_base.h | 2 ++ src/network/network_server.cpp | 22 ++++++++++++++++++++++ 3 files changed, 31 insertions(+) diff --git a/src/crashlog.cpp b/src/crashlog.cpp index 2653490dd3..ba4005c67e 100644 --- a/src/crashlog.cpp +++ b/src/crashlog.cpp @@ -262,6 +262,13 @@ char *CrashLog::LogConfiguration(char *buffer, const char *last) const buffer += seprintf(buffer, last, "\n"); } + if (_network_server) { + extern char *NetworkServerDumpClients(char *buffer, const char *last); + buffer += seprintf(buffer, last, "Clients:\n"); + buffer = NetworkServerDumpClients(buffer, last); + buffer += seprintf(buffer, last, "\n"); + } + return buffer; } diff --git a/src/network/network_base.h b/src/network/network_base.h index 479f340f18..5e9f63f9f0 100644 --- a/src/network/network_base.h +++ b/src/network/network_base.h @@ -26,6 +26,8 @@ struct NetworkClientInfo : NetworkClientInfoPool::PoolItem<&_networkclientinfo_p std::string client_name; ///< Name of the client CompanyID client_playas; ///< As which company is this client playing (CompanyID) Date join_date; ///< Gamedate the client has joined + DateFract join_date_fract; + uint8 join_tick_skip_counter; /** * Create a new client. diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index 2724f5ca0d..e2bfc4339e 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -937,6 +937,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet *p) NetworkClientInfo *ci = new NetworkClientInfo(this->client_id); this->SetInfo(ci); ci->join_date = _date; + ci->join_date_fract = _date_fract; + ci->join_tick_skip_counter = _tick_skip_counter; ci->client_name = client_name; ci->client_playas = playas; DEBUG(desync, 1, "client: date{%08x; %02x; %02x}; client: %02x; company: %02x", _date, _date_fract, _tick_skip_counter, (int)ci->index, (int)ci->client_playas); @@ -2277,3 +2279,23 @@ void NetworkServerNewCompany(const Company *c, NetworkClientInfo *ci) NetworkServerSendChat(NETWORK_ACTION_COMPANY_NEW, DESTTYPE_BROADCAST, 0, "", ci->client_id, c->index + 1); } } + +char *NetworkServerDumpClients(char *buffer, const char *last) +{ + for (NetworkClientInfo *ci : NetworkClientInfo::Iterate()) { + YearMonthDay ymd; + ConvertDateToYMD(ci->join_date, &ymd); + buffer += seprintf(buffer, last, " #%d: name: '%s', company: %u", + ci->client_id, + ci->client_name.c_str(), + ci->client_playas); + if (ci->join_date != 0) { + YearMonthDay ymd; + ConvertDateToYMD(ci->join_date, &ymd); + buffer += seprintf(buffer, last, ", joined: %4i-%02i-%02i, %2i, %3i", + ymd.year, ymd.month + 1, ymd.day, ci->join_date_fract, ci->join_tick_skip_counter); + } + buffer += seprintf(buffer, last, "\n"); + } + return buffer; +}