// called on game shutdown void G_WriteClientSessionData( const gclient_t *client ) { const clientSession_t *sess = &client->sess; cJSON *root; fileHandle_t f; char fileName[MAX_QPATH] = {}; Com_sprintf( fileName, sizeof(fileName), "session/client%02i.json", client - level.clients ); Com_Printf( "Writing session file %s\n", fileName ); root = cJSON_CreateObject(); cJSON_AddIntegerToObject( root, "sessionTeam", sess->sessionTeam ); cJSON_AddIntegerToObject( root, "spectatorTime", sess->spectatorTime ); cJSON_AddIntegerToObject( root, "spectatorState", sess->spectatorState ); cJSON_AddIntegerToObject( root, "spectatorClient", sess->spectatorClient ); cJSON_AddIntegerToObject( root, "wins", sess->wins ); cJSON_AddIntegerToObject( root, "losses", sess->losses ); cJSON_AddIntegerToObject( root, "setForce", sess->setForce ); cJSON_AddIntegerToObject( root, "saberLevel", sess->saberLevel ); cJSON_AddIntegerToObject( root, "selectedFP", sess->selectedFP ); cJSON_AddIntegerToObject( root, "duelTeam", sess->duelTeam ); cJSON_AddIntegerToObject( root, "siegeDesiredTeam", sess->siegeDesiredTeam ); cJSON_AddStringToObject( root, "siegeClass", *sess->siegeClass ? sess->siegeClass : "none" ); cJSON_AddStringToObject( root, "IP", sess->IP ); if ( client->pers.adminUser ) { char checksum[33] = {}; char combined[MAX_STRING_CHARS] = {}; Com_sprintf( combined, sizeof(combined), "%s%s", client->pers.adminUser->user, client->pers.adminUser->password ); Crypto::ChecksumMD5( combined, strlen( combined ), checksum ); cJSON_AddStringToObject( root, "admin", checksum ); } cJSON_AddBooleanToObject( root, "empowered", !!client->pers.adminData.empowered ); cJSON_AddBooleanToObject( root, "merc", !!client->pers.adminData.merc ); cJSON_AddBooleanToObject( root, "silenced", !!client->pers.adminData.silenced ); cJSON_AddBooleanToObject( root, "slept", !!client->pers.adminData.isSlept ); cJSON_AddIntegerToObject( root, "tempprivs", !!client->pers.tempprivs); trap->FS_Open( fileName, &f, FS_WRITE ); Q_FSWriteJSON( root, f ); }
void G_WriteSessionData( void ) { int i; fileHandle_t f; const gclient_t *client = NULL; cJSON *root = cJSON_CreateObject(); cJSON_AddIntegerToObject( root, "gametype", level.gametype ); trap->Print( "G_WriteSessionData: writing %s...", metaFileName ); trap->FS_Open( metaFileName, &f, FS_WRITE ); Q_FSWriteJSON( root, f ); for ( i = 0, client = level.clients; i < level.maxclients; i++, client++ ) { if ( client->pers.connected == CON_CONNECTED ) { G_WriteClientSessionData( client ); } } trap->Print( "done\n" ); }
// Called on game shutdown void G_WriteClientSessionData( const gclient_t *client ) { const clientSession_t *sess = &client->sess; cJSON *root; fileHandle_t f; char fileName[MAX_QPATH] = {}; Com_sprintf( fileName, sizeof(fileName), "session/client%02i.json", (int)(client - level.clients) ); Com_Printf( "Writing session file %s\n", fileName ); root = cJSON_CreateObject(); cJSON_AddIntegerToObject( root, "sessionTeam", sess->sessionTeam ); cJSON_AddIntegerToObject( root, "spectatorNum", sess->spectatorNum ); cJSON_AddIntegerToObject( root, "spectatorState", sess->spectatorState ); cJSON_AddIntegerToObject( root, "spectatorClient", sess->spectatorClient ); cJSON_AddIntegerToObject( root, "wins", sess->wins ); cJSON_AddIntegerToObject( root, "losses", sess->losses ); cJSON_AddIntegerToObject( root, "setForce", sess->setForce ); cJSON_AddIntegerToObject( root, "saberLevel", sess->saberLevel ); cJSON_AddIntegerToObject( root, "selectedFP", sess->selectedFP ); cJSON_AddIntegerToObject( root, "updateUITime", sess->updateUITime ); cJSON_AddIntegerToObject( root, "teamLeader", sess->teamLeader ); cJSON_AddIntegerToObject( root, "duelTeam", sess->duelTeam ); cJSON_AddIntegerToObject( root, "siegeDesiredTeam", sess->siegeDesiredTeam ); cJSON_AddStringToObject( root, "siegeClass", *sess->siegeClass ? sess->siegeClass : "none" ); cJSON_AddStringToObject( root, "saberType", *sess->saberType ? sess->saberType : "" ); cJSON_AddStringToObject( root, "saber2Type", *sess->saber2Type ? sess->saber2Type : "" ); cJSON_AddStringToObject( root, "IP", sess->IP ); cJSON_AddIntegerToObject( root, "connTime", sess->connTime ); cJSON_AddIntegerToObject( root, "noq3fill", sess->noq3fill ); cJSON_AddIntegerToObject( root, "validated", sess->validated ); cJSON_AddIntegerToObject( root, "adminRank", sess->adminRank ); cJSON_AddIntegerToObject( root, "canUseCheats", sess->canUseCheats ? 1 : 0 ); trap->FS_Open( fileName, &f, FS_WRITE ); Q_FSWriteJSON( root, f ); }