Merge pull request #6744 from Zwelf/pr-fix-teehistorian-mapchange

Fix JoinVer and Join teehistorian chunks missing in some conditions
This commit is contained in:
heinrich5991 2023-08-25 11:15:43 +00:00 committed by GitHub
commit 1f13a693a5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 74 additions and 11 deletions

View file

@ -329,8 +329,9 @@ public:
virtual void OnSetAuthed(int ClientID, int Level) = 0; virtual void OnSetAuthed(int ClientID, int Level) = 0;
virtual bool PlayerExists(int ClientID) const = 0; virtual bool PlayerExists(int ClientID) const = 0;
virtual void OnClientEngineJoin(int ClientID, bool Sixup) = 0; virtual void TeehistorianRecordPlayerJoin(int ClientID, bool Sixup) = 0;
virtual void OnClientEngineDrop(int ClientID, const char *pReason) = 0; virtual void TeehistorianRecordPlayerDrop(int ClientID, const char *pReason) = 0;
virtual void TeehistorianRecordPlayerRejoin(int ClientID) = 0;
virtual void FillAntibot(CAntibotRoundData *pData) = 0; virtual void FillAntibot(CAntibotRoundData *pData) = 0;

View file

@ -1060,6 +1060,10 @@ int CServer::ClientRejoinCallback(int ClientID, void *pUser)
pThis->m_aClients[ClientID].Reset(); pThis->m_aClients[ClientID].Reset();
pThis->GameServer()->TeehistorianRecordPlayerRejoin(ClientID);
pThis->Antibot()->OnEngineClientDrop(ClientID, "rejoin");
pThis->Antibot()->OnEngineClientJoin(ClientID, false);
pThis->SendMap(ClientID); pThis->SendMap(ClientID);
return 0; return 0;
@ -1085,6 +1089,9 @@ int CServer::NewClientNoAuthCallback(int ClientID, void *pUser)
pThis->m_aClients[ClientID].m_DDNetVersionSettled = false; pThis->m_aClients[ClientID].m_DDNetVersionSettled = false;
pThis->m_aClients[ClientID].Reset(); pThis->m_aClients[ClientID].Reset();
pThis->GameServer()->TeehistorianRecordPlayerJoin(ClientID, false);
pThis->Antibot()->OnEngineClientJoin(ClientID, false);
pThis->SendCapabilities(ClientID); pThis->SendCapabilities(ClientID);
pThis->SendMap(ClientID); pThis->SendMap(ClientID);
#if defined(CONF_FAMILY_UNIX) #if defined(CONF_FAMILY_UNIX)
@ -1114,7 +1121,7 @@ int CServer::NewClientCallback(int ClientID, void *pUser, bool Sixup)
mem_zero(&pThis->m_aClients[ClientID].m_Addr, sizeof(NETADDR)); mem_zero(&pThis->m_aClients[ClientID].m_Addr, sizeof(NETADDR));
pThis->m_aClients[ClientID].Reset(); pThis->m_aClients[ClientID].Reset();
pThis->GameServer()->OnClientEngineJoin(ClientID, Sixup); pThis->GameServer()->TeehistorianRecordPlayerJoin(ClientID, Sixup);
pThis->Antibot()->OnEngineClientJoin(ClientID, Sixup); pThis->Antibot()->OnEngineClientJoin(ClientID, Sixup);
pThis->m_aClients[ClientID].m_Sixup = Sixup; pThis->m_aClients[ClientID].m_Sixup = Sixup;
@ -1199,7 +1206,7 @@ int CServer::DelClientCallback(int ClientID, const char *pReason, void *pUser)
pThis->m_aClients[ClientID].m_Sixup = false; pThis->m_aClients[ClientID].m_Sixup = false;
pThis->m_aClients[ClientID].m_RedirectDropTime = 0; pThis->m_aClients[ClientID].m_RedirectDropTime = 0;
pThis->GameServer()->OnClientEngineDrop(ClientID, pReason); pThis->GameServer()->TeehistorianRecordPlayerDrop(ClientID, pReason);
pThis->Antibot()->OnEngineClientDrop(ClientID, pReason); pThis->Antibot()->OnEngineClientDrop(ClientID, pReason);
#if defined(CONF_FAMILY_UNIX) #if defined(CONF_FAMILY_UNIX)
pThis->SendConnLoggingCommand(CLOSE_SESSION, pThis->m_NetServer.ClientAddr(ClientID)); pThis->SendConnLoggingCommand(CLOSE_SESSION, pThis->m_NetServer.ClientAddr(ClientID));
@ -2779,6 +2786,16 @@ int CServer::Run()
break; break;
} }
UpdateServerInfo(true); UpdateServerInfo(true);
for(int ClientID = 0; ClientID < MAX_CLIENTS; ClientID++)
{
if(m_aClients[ClientID].m_State != CClient::STATE_CONNECTING)
continue;
// When doing a map change, a new Teehistorian file is created. For players that are already
// on the server, no PlayerJoin event is produced in Teehistorian from the network engine.
// Record PlayerJoin events here to record the Sixup version and player join event.
GameServer()->TeehistorianRecordPlayerJoin(ClientID, m_aClients[ClientID].m_Sixup);
}
} }
else else
{ {

View file

@ -16,3 +16,4 @@ UUID(TEEHISTORIAN_LOAD_FAILURE, "teehistorian-load-failure@ddnet.tw")
UUID(TEEHISTORIAN_PLAYER_TEAM, "teehistorian-player-team@ddnet.tw") UUID(TEEHISTORIAN_PLAYER_TEAM, "teehistorian-player-team@ddnet.tw")
UUID(TEEHISTORIAN_TEAM_PRACTICE, "teehistorian-team-practice@ddnet.tw") UUID(TEEHISTORIAN_TEAM_PRACTICE, "teehistorian-team-practice@ddnet.tw")
UUID(TEEHISTORIAN_PLAYER_READY, "teehistorian-player-ready@ddnet.tw") UUID(TEEHISTORIAN_PLAYER_READY, "teehistorian-player-ready@ddnet.tw")
UUID(TEEHISTORIAN_PLAYER_REJOIN, "teehistorian-rejoinver6@ddnet.org")

View file

@ -1660,7 +1660,7 @@ void CGameContext::OnClientDrop(int ClientID, const char *pReason)
Server()->ExpireServerInfo(); Server()->ExpireServerInfo();
} }
void CGameContext::OnClientEngineJoin(int ClientID, bool Sixup) void CGameContext::TeehistorianRecordPlayerJoin(int ClientID, bool Sixup)
{ {
if(m_TeeHistorianActive) if(m_TeeHistorianActive)
{ {
@ -1668,7 +1668,7 @@ void CGameContext::OnClientEngineJoin(int ClientID, bool Sixup)
} }
} }
void CGameContext::OnClientEngineDrop(int ClientID, const char *pReason) void CGameContext::TeehistorianRecordPlayerDrop(int ClientID, const char *pReason)
{ {
if(m_TeeHistorianActive) if(m_TeeHistorianActive)
{ {
@ -1676,6 +1676,14 @@ void CGameContext::OnClientEngineDrop(int ClientID, const char *pReason)
} }
} }
void CGameContext::TeehistorianRecordPlayerRejoin(int ClientID)
{
if(m_TeeHistorianActive)
{
m_TeeHistorian.RecordPlayerRejoin(ClientID);
}
}
bool CGameContext::OnClientDDNetVersionKnown(int ClientID) bool CGameContext::OnClientDDNetVersionKnown(int ClientID)
{ {
IServer::CClientInfo Info; IServer::CClientInfo Info;

View file

@ -292,8 +292,9 @@ public:
void OnClientPredictedInput(int ClientID, void *pInput) override; void OnClientPredictedInput(int ClientID, void *pInput) override;
void OnClientPredictedEarlyInput(int ClientID, void *pInput) override; void OnClientPredictedEarlyInput(int ClientID, void *pInput) override;
void OnClientEngineJoin(int ClientID, bool Sixup) override; void TeehistorianRecordPlayerJoin(int ClientID, bool Sixup) override;
void OnClientEngineDrop(int ClientID, const char *pReason) override; void TeehistorianRecordPlayerDrop(int ClientID, const char *pReason) override;
void TeehistorianRecordPlayerRejoin(int ClientID) override;
bool IsClientReady(int ClientID) const override; bool IsClientReady(int ClientID) const override;
bool IsClientPlayer(int ClientID) const override; bool IsClientPlayer(int ClientID) const override;

View file

@ -8,7 +8,7 @@
static const char TEEHISTORIAN_NAME[] = "teehistorian@ddnet.tw"; static const char TEEHISTORIAN_NAME[] = "teehistorian@ddnet.tw";
static const CUuid TEEHISTORIAN_UUID = CalculateUuid(TEEHISTORIAN_NAME); static const CUuid TEEHISTORIAN_UUID = CalculateUuid(TEEHISTORIAN_NAME);
static const char TEEHISTORIAN_VERSION[] = "2"; static const char TEEHISTORIAN_VERSION[] = "2";
static const char TEEHISTORIAN_VERSION_MINOR[] = "4"; static const char TEEHISTORIAN_VERSION_MINOR[] = "5";
#define UUID(id, name) static const CUuid UUID_##id = CalculateUuid(name); #define UUID(id, name) static const CUuid UUID_##id = CalculateUuid(name);
#include <engine/shared/teehistorian_ex_chunks.h> #include <engine/shared/teehistorian_ex_chunks.h>
@ -508,6 +508,22 @@ void CTeeHistorian::RecordPlayerJoin(int ClientID, int Protocol)
Write(Buffer.Data(), Buffer.Size()); Write(Buffer.Data(), Buffer.Size());
} }
void CTeeHistorian::RecordPlayerRejoin(int ClientID)
{
EnsureTickWritten();
CPacker Buffer;
Buffer.Reset();
Buffer.AddInt(ClientID);
if(m_Debug)
{
dbg_msg("teehistorian", "player_rejoin cid=%d", ClientID);
}
WriteExtra(UUID_TEEHISTORIAN_PLAYER_REJOIN, Buffer.Data(), Buffer.Size());
}
void CTeeHistorian::RecordPlayerReady(int ClientID) void CTeeHistorian::RecordPlayerReady(int ClientID)
{ {
EnsureTickWritten(); EnsureTickWritten();

View file

@ -64,6 +64,7 @@ public:
void RecordPlayerInput(int ClientID, uint32_t UniqueClientID, const CNetObj_PlayerInput *pInput); void RecordPlayerInput(int ClientID, uint32_t UniqueClientID, const CNetObj_PlayerInput *pInput);
void RecordPlayerMessage(int ClientID, const void *pMsg, int MsgSize); void RecordPlayerMessage(int ClientID, const void *pMsg, int MsgSize);
void RecordPlayerJoin(int ClientID, int Protocol); void RecordPlayerJoin(int ClientID, int Protocol);
void RecordPlayerRejoin(int ClientID);
void RecordPlayerReady(int ClientID); void RecordPlayerReady(int ClientID);
void RecordPlayerDrop(int ClientID, const char *pReason); void RecordPlayerDrop(int ClientID, const char *pReason);
void RecordConsoleCommand(int ClientID, int FlagMask, const char *pCmd, IConsole::IResult *pResult); void RecordConsoleCommand(int ClientID, int FlagMask, const char *pCmd, IConsole::IResult *pResult);

View file

@ -101,7 +101,7 @@ protected:
void Expect(const unsigned char *pOutput, size_t OutputSize) void Expect(const unsigned char *pOutput, size_t OutputSize)
{ {
static CUuid TEEHISTORIAN_UUID = CalculateUuid("teehistorian@ddnet.tw"); static CUuid TEEHISTORIAN_UUID = CalculateUuid("teehistorian@ddnet.tw");
static const char PREFIX1[] = "{\"comment\":\"teehistorian@ddnet.tw\",\"version\":\"2\",\"version_minor\":\"4\",\"game_uuid\":\"a1eb7182-796e-3b3e-941d-38ca71b2a4a8\",\"server_version\":\"DDNet test\",\"start_time\":\""; static const char PREFIX1[] = "{\"comment\":\"teehistorian@ddnet.tw\",\"version\":\"2\",\"version_minor\":\"5\",\"game_uuid\":\"a1eb7182-796e-3b3e-941d-38ca71b2a4a8\",\"server_version\":\"DDNet test\",\"start_time\":\"";
static const char PREFIX2[] = "\",\"server_name\":\"server name\",\"server_port\":\"8303\",\"game_type\":\"game type\",\"map_name\":\"Kobra 3 Solo\",\"map_size\":\"903514\",\"map_sha256\":\"0123456789012345678901234567890123456789012345678901234567890123\",\"map_crc\":\"eceaf25c\",\"prng_description\":\"test-prng:02468ace\",\"config\":{},\"tuning\":{},\"uuids\":["; static const char PREFIX2[] = "\",\"server_name\":\"server name\",\"server_port\":\"8303\",\"game_type\":\"game type\",\"map_name\":\"Kobra 3 Solo\",\"map_size\":\"903514\",\"map_sha256\":\"0123456789012345678901234567890123456789012345678901234567890123\",\"map_crc\":\"eceaf25c\",\"prng_description\":\"test-prng:02468ace\",\"config\":{},\"tuning\":{},\"uuids\":[";
static const char PREFIX3[] = "]}"; static const char PREFIX3[] = "]}";
@ -708,6 +708,24 @@ TEST_F(TeeHistorian, TeamPractice)
Expect(EXPECTED, sizeof(EXPECTED)); Expect(EXPECTED, sizeof(EXPECTED));
} }
TEST_F(TeeHistorian, PlayerRejoinVer6)
{
const unsigned char EXPECTED[] = {
// EX uuid=c1e921d5-96f5-37bb-8a45-7a06f163d27e datalen=1
0x4a,
0xc1, 0xe9, 0x21, 0xd5, 0x96, 0xf5, 0x37, 0xbb,
0x8a, 0x45, 0x7a, 0x06, 0xf1, 0x63, 0xd2, 0x7e,
0x01,
// (PLAYER_REJOIN) cid=2
0x02,
// FINISH
0x40};
m_TH.RecordPlayerRejoin(2);
Finish();
Expect(EXPECTED, sizeof(EXPECTED));
}
TEST_F(TeeHistorian, PlayerReady) TEST_F(TeeHistorian, PlayerReady)
{ {
const unsigned char EXPECTED[] = { const unsigned char EXPECTED[] = {
@ -716,7 +734,7 @@ TEST_F(TeeHistorian, PlayerReady)
0x63, 0x85, 0x87, 0xc9, 0x3f, 0x75, 0x38, 0x87, 0x63, 0x85, 0x87, 0xc9, 0x3f, 0x75, 0x38, 0x87,
0x91, 0x8e, 0xa3, 0xc2, 0x61, 0x4f, 0xfa, 0xa0, 0x91, 0x8e, 0xa3, 0xc2, 0x61, 0x4f, 0xfa, 0xa0,
0x01, 0x01,
// (PLAYER_READY) cid=1 // (PLAYER_READY) cid=63
0x3f, 0x3f,
// FINISH // FINISH
0x40}; 0x40};