From: Chris D. <de...@st...> - 2011-01-16 09:15:10
|
Modified: branches/4.0/stepmania/src/GameState.cpp branches/4.0/stepmania/src/JsonUtil.cpp branches/4.0/stepmania/src/JsonUtil.h branches/4.0/stepmania/src/Profile.cpp branches/4.0/stepmania/src/Profile.h branches/4.0/stepmania/src/ProfileManager.cpp branches/4.0/stepmania/src/ProfileManager.h Log: Upload stats every time we write stats.json.gz. Currently synchronous, but that will change. Modified: branches/4.0/stepmania/src/GameState.cpp ============================================================================== --- branches/4.0/stepmania/src/GameState.cpp (original) +++ branches/4.0/stepmania/src/GameState.cpp Sun Jan 16 01:15:02 2011 @@ -383,6 +383,26 @@ void GameState::PlayersFinalized() ApplyModifiers( pn, CommonMetrics::DEFAULT_CPU_MODIFIERS ); } +void SaveAllProfiles( bool bEndGame ) +{ + PROFILEMAN->SaveMachineProfile(); + PROFILEMAN->UploadMachineProfie(); + FOREACH_HumanPlayer( pn ) + { + if( !PROFILEMAN->IsPersistentProfile(pn) ) + continue; + + bool bWasMemoryCard = PROFILEMAN->ProfileWasLoadedFromMemoryCard(pn); + if( bEndGame && bWasMemoryCard ) + MEMCARDMAN->MountCard( pn ); + PROFILEMAN->SaveProfile( pn ); + if( bEndGame && bWasMemoryCard ) + MEMCARDMAN->UnmountCard( pn ); + + PROFILEMAN->UnloadProfile( pn ); + } +} + void GameState::EndGame() { LOG->Trace( "GameState::EndGame" ); @@ -415,22 +435,7 @@ void GameState::EndGame() BOOKKEEPER->WriteToDisk(); - FOREACH_HumanPlayer( pn ) - { - if( !PROFILEMAN->IsPersistentProfile(pn) ) - continue; - - bool bWasMemoryCard = PROFILEMAN->ProfileWasLoadedFromMemoryCard(pn); - if( bWasMemoryCard ) - MEMCARDMAN->MountCard( pn ); - PROFILEMAN->SaveProfile( pn ); - if( bWasMemoryCard ) - MEMCARDMAN->UnmountCard( pn ); - - PROFILEMAN->UnloadProfile( pn ); - } - - PROFILEMAN->SaveMachineProfile(); + SaveAllProfiles( true ); // make sure we don't execute EndGame twice. m_timeGameStarted.SetZero(); @@ -534,7 +539,7 @@ void GameState::FinishStage() if( iOldStageIndex/iSaveProfileEvery < m_iCurrentStageIndex/iSaveProfileEvery ) { LOG->Trace( "Played %i stages; saving profiles ...", iSaveProfileEvery ); - PROFILEMAN->SaveAllProfiles(); + SaveAllProfiles(false); } } } Modified: branches/4.0/stepmania/src/JsonUtil.cpp ============================================================================== --- branches/4.0/stepmania/src/JsonUtil.cpp (original) +++ branches/4.0/stepmania/src/JsonUtil.cpp Sun Jan 16 01:15:02 2011 @@ -63,20 +63,25 @@ bool JsonUtil::WriteFile( const Json::Va return WriteFile( root, f, bMinified ); } -bool JsonUtil::WriteFile( const Json::Value &root, RageFileBasic &f, bool bMinified ) +RString JsonUtil::WriteString( const Json::Value &root, bool bMinified) { - std::string s; if( !bMinified ) { Json::StyledWriter writer; - s = writer.write(root); + return writer.write(root); } else { Json::FastWriter writer; - s = writer.write(root); + return writer.write(root); } +} + +bool JsonUtil::WriteFile( const Json::Value &root, RageFileBasic &f, bool bMinified ) +{ + // Optimization Opportunity: Write to the file stream as we serialize + RString s = WriteString(root, bMinified); f.Write(s); return true; } Modified: branches/4.0/stepmania/src/JsonUtil.h ============================================================================== --- branches/4.0/stepmania/src/JsonUtil.h (original) +++ branches/4.0/stepmania/src/JsonUtil.h Sun Jan 16 01:15:02 2011 @@ -14,6 +14,7 @@ namespace JsonUtil bool LoadFromFileShowErrors( Json::Value &root, const RString &sFile ); bool LoadFromFileShowErrors( Json::Value &root, RageFileBasic &f ); + RString WriteString( const Json::Value &root, bool bMinified); bool WriteFile( const Json::Value &root, const RString &sFile, bool bMinified ); bool WriteFile( const Json::Value &root, RageFileBasic &f, bool bMinified ); Modified: branches/4.0/stepmania/src/Profile.cpp ============================================================================== --- branches/4.0/stepmania/src/Profile.cpp (original) +++ branches/4.0/stepmania/src/Profile.cpp Sun Jan 16 01:15:02 2011 @@ -938,10 +938,67 @@ void Profile::RankingCategoryToHighScore JsonUtil::DeserializeStringToObjectMap( m_v, StringToRankingCategory, root ); } -bool Profile::SaveStatsJsonToDir( RString sDir, bool bSignData ) const +const RString MeterToString(int i) { - Json::Value root; - SaveGeneral( root["General"] ); + return ssprintf("%d",i); +} + +int StringToMeter(const RString &s) +{ + return atoi(s); +} + +void Profile::SaveStatsJson( Json::Value &root ) const +{ + { + // These are write-only elements that are normally never read again. + // This data is required by other apps (like internet ranking), but is + // redundant to the game app. + root["DisplayName"] = GetDisplayNameOrHighScoreName(); + root["CharacterID"] = m_sCharacterID; + root["LastUsedHighScoreName"] = m_sLastUsedHighScoreName; + root["WeightPounds"] = m_iWeightPounds; + root["IsMachine"] = IsMachine(); + root["IsWeightSet"] = m_iWeightPounds != 0; + + root["Guid"] = m_sGuid; + root["SortOrder"] = SortOrderToString(m_SortOrder); + root["LastDifficulty"] = DifficultyToString(m_LastDifficulty); + root["LastCourseDifficulty"] = CourseDifficultyToString(m_LastCourseDifficulty); + m_lastSong.Serialize( root["LastSong"] ); + m_lastCourse.Serialize( root["LastCourse"] ); + root["TotalPlays"] = m_iTotalPlays; + root["TotalPlaySeconds"] = m_iTotalPlaySeconds; + root["TotalGameplaySeconds"] = m_iTotalGameplaySeconds; + root["CurrentCombo"] = m_iCurrentCombo; + root["TotalCaloriesBurned"] = m_fTotalCaloriesBurned; + root["GoalType"] = m_GoalType; + root["GoalCalories"] = m_iGoalCalories; + root["GoalSeconds"] = m_iGoalSeconds; + root["LastPlayedMachineGuid"] = m_sLastPlayedMachineGuid; + root["LastPlayedDate"] = m_LastPlayedDate.GetString(); + root["TotalDancePoints"] = m_iTotalDancePoints; + root["NumExtraStagesPassed"] = m_iNumExtraStagesPassed; + root["NumExtraStagesFailed"] = m_iNumExtraStagesFailed; + root["NumToasties"] = m_iNumToasties; + root["TotalTapsAndHolds"] = m_iTotalTapsAndHolds; + root["TotalJumps"] = m_iTotalJumps; + root["TotalHolds"] = m_iTotalHolds; + root["TotalRolls"] = m_iTotalRolls; + root["TotalMines"] = m_iTotalMines; + root["TotalHands"] = m_iTotalHands; + root["SavedLuaData"] = m_SavedLuaData.Serialize(); + root["NumTotalSongsPlayed"] = m_iNumTotalSongsPlayed; + + JsonUtil::SerializeValueToValueMap( m_DefaultModifiersByGame, root["DefaultModifiersByGame"] ); + JsonUtil::SerializeArrayValues( m_UnlockedEntryIDs, root["UnlockEntryIDs"] ); + JsonUtil::SerializeStringToValueMap( m_iNumSongsPlayedByPlayMode, PlayModeToString, root["NumSongsPlayedByPlayMode"] ); + JsonUtil::SerializeObjectToValueMapAsArray(m_iNumSongsPlayedByStyle, "Style", "NumPlays", root["NumSongsPlayedByStyle"] ); + JsonUtil::SerializeStringToValueMap( m_iNumSongsPlayedByDifficulty, DifficultyToString, root["NumSongsPlayedByDifficulty"] ); + JsonUtil::SerializeStringToValueMap( m_iNumSongsPlayedByMeter, MeterToString, root["NumSongsPlayedByMeter"] ); + JsonUtil::SerializeStringToValueMap( m_iNumStagesPassedByPlayMode, PlayModeToString, root["NumStagesPassedByPlayMode"] ); + JsonUtil::SerializeStringToValueMap( m_iNumStagesPassedByGrade, GradeToString, root["NumStagesPassedByGrade"] ); + } JsonUtil::SerializeObjectToObjectMapAsArray( m_SongHighScores, "Song", "HighScoresForASong", root["SongScores"] ); JsonUtil::SerializeObjectToObjectMapAsArray( m_CourseHighScores, "Course", "HighScoresForACourse", root["CourseScores"] ); JsonUtil::SerializeStringToObjectMap( m_CategoryHighScores, StepsTypeToString, root["CategoryScores"] ); @@ -949,6 +1006,12 @@ bool Profile::SaveStatsJsonToDir( RStrin JsonUtil::SerializeStringToValueMap( m_mapDayToCaloriesBurned, DateTimeToString, root["CalorieData"] ); JsonUtil::SerializeArrayObjects( m_vRecentStepsScores, root["RecentSongScores"] ); JsonUtil::SerializeArrayObjects( m_vRecentCourseScores, root["RecentCourseScores"] ); +} + +bool Profile::SaveStatsJsonToDir( RString sDir, bool bSignData ) const +{ + Json::Value root; + SaveStatsJson( root ); RString fn = sDir + STATS_JSON_GZ; RageFile f; @@ -996,67 +1059,6 @@ void Profile::SaveEditableDataToDir( RSt ini.WriteFile( sDir + EDITABLE_INI ); } -const RString MeterToString(int i) -{ - return ssprintf("%d",i); -} - -int StringToMeter(const RString &s) -{ - return atoi(s); -} - -void Profile::SaveGeneral( Json::Value &root ) const -{ - // These are write-only elements that are normally never read again. - // This data is required by other apps (like internet ranking), but is - // redundant to the game app. - root["DisplayName"] = GetDisplayNameOrHighScoreName(); - root["CharacterID"] = m_sCharacterID; - root["LastUsedHighScoreName"] = m_sLastUsedHighScoreName; - root["WeightPounds"] = m_iWeightPounds; - root["IsMachine"] = IsMachine(); - root["IsWeightSet"] = m_iWeightPounds != 0; - - root["Guid"] = m_sGuid; - root["SortOrder"] = SortOrderToString(m_SortOrder); - root["LastDifficulty"] = DifficultyToString(m_LastDifficulty); - root["LastCourseDifficulty"] = CourseDifficultyToString(m_LastCourseDifficulty); - m_lastSong.Serialize( root["LastSong"] ); - m_lastCourse.Serialize( root["LastCourse"] ); - root["TotalPlays"] = m_iTotalPlays; - root["TotalPlaySeconds"] = m_iTotalPlaySeconds; - root["TotalGameplaySeconds"] = m_iTotalGameplaySeconds; - root["CurrentCombo"] = m_iCurrentCombo; - root["TotalCaloriesBurned"] = m_fTotalCaloriesBurned; - root["GoalType"] = m_GoalType; - root["GoalCalories"] = m_iGoalCalories; - root["GoalSeconds"] = m_iGoalSeconds; - root["LastPlayedMachineGuid"] = m_sLastPlayedMachineGuid; - root["LastPlayedDate"] = m_LastPlayedDate.GetString(); - root["TotalDancePoints"] = m_iTotalDancePoints; - root["NumExtraStagesPassed"] = m_iNumExtraStagesPassed; - root["NumExtraStagesFailed"] = m_iNumExtraStagesFailed; - root["NumToasties"] = m_iNumToasties; - root["TotalTapsAndHolds"] = m_iTotalTapsAndHolds; - root["TotalJumps"] = m_iTotalJumps; - root["TotalHolds"] = m_iTotalHolds; - root["TotalRolls"] = m_iTotalRolls; - root["TotalMines"] = m_iTotalMines; - root["TotalHands"] = m_iTotalHands; - root["SavedLuaData"] = m_SavedLuaData.Serialize(); - root["NumTotalSongsPlayed"] = m_iNumTotalSongsPlayed; - - JsonUtil::SerializeValueToValueMap( m_DefaultModifiersByGame, root["DefaultModifiersByGame"] ); - JsonUtil::SerializeArrayValues( m_UnlockedEntryIDs, root["UnlockEntryIDs"] ); - JsonUtil::SerializeStringToValueMap( m_iNumSongsPlayedByPlayMode, PlayModeToString, root["NumSongsPlayedByPlayMode"] ); - JsonUtil::SerializeObjectToValueMapAsArray(m_iNumSongsPlayedByStyle, "Style", "NumPlays", root["NumSongsPlayedByStyle"] ); - JsonUtil::SerializeStringToValueMap( m_iNumSongsPlayedByDifficulty, DifficultyToString, root["NumSongsPlayedByDifficulty"] ); - JsonUtil::SerializeStringToValueMap( m_iNumSongsPlayedByMeter, MeterToString, root["NumSongsPlayedByMeter"] ); - JsonUtil::SerializeStringToValueMap( m_iNumStagesPassedByPlayMode, PlayModeToString, root["NumStagesPassedByPlayMode"] ); - JsonUtil::SerializeStringToValueMap( m_iNumStagesPassedByGrade, GradeToString, root["NumStagesPassedByGrade"] ); -} - ProfileLoadResult Profile::LoadEditableDataFromDir( RString sDir ) { RString fn = sDir + EDITABLE_INI; Modified: branches/4.0/stepmania/src/Profile.h ============================================================================== --- branches/4.0/stepmania/src/Profile.h (original) +++ branches/4.0/stepmania/src/Profile.h Sun Jan 16 01:15:02 2011 @@ -330,8 +330,8 @@ public: void LoadGeneral( const Json::Value &root ); void SaveEditableDataToDir( RString sDir ) const; + void SaveStatsJson( Json::Value &root ) const; bool SaveStatsJsonToDir( RString sDir, bool bSignData ) const; - void SaveGeneral( Json::Value &root ) const; void SaveStatsWebPageToDir( RString sDir ) const; void SaveMachinePublicKeyToDir( RString sDir ) const; Modified: branches/4.0/stepmania/src/ProfileManager.cpp ============================================================================== --- branches/4.0/stepmania/src/ProfileManager.cpp (original) +++ branches/4.0/stepmania/src/ProfileManager.cpp Sun Jan 16 01:15:02 2011 @@ -23,6 +23,8 @@ #include "HighScore.h" #include "Character.h" #include "CharacterManager.h" +#include "FileDownload.h" +#include "ScreenManager.h" ProfileManager* PROFILEMAN = NULL; // global and accessable from anywhere in our program @@ -288,18 +290,6 @@ bool ProfileManager::FastLoadProfileName return false; } -void ProfileManager::SaveAllProfiles() const -{ - this->SaveMachineProfile(); - - FOREACH_HumanPlayer( pn ) - { - if( !IsPersistentProfile(pn) ) - continue; - - this->SaveProfile( pn ); - } -} bool ProfileManager::SaveProfile( PlayerNumber pn ) const { @@ -519,6 +509,21 @@ void ProfileManager::SaveMachineProfile( m_pMachineProfile->SaveAllToDir( MACHINE_PROFILE_DIR, false ); /* don't sign machine profiles */ } +void ProfileManager::UploadMachineProfie() const +{ + //TODO: Copy the stats file to temp before uploaing + RString sFile = MACHINE_PROFILE_DIR+"Stats.json.gz"; + RString sUrl = "unknown url"; + { + FileTransfer ft; + // TODO: Don't stream file because it will block future writes. + ft.StartUpload( "http://www.stepmania.com/api.php?action=upload_stats", sFile, "" ); + ft.BlockUntilFinished(); + if( ft.GetResponseCode() != 200 ) + SCREENMAN->SystemMessage( "Bad response code upload_stats " + ft.GetResponseCode() ); + } +} + void ProfileManager::LoadMachineProfile() { ProfileLoadResult lr = m_pMachineProfile->LoadAllFromDir(MACHINE_PROFILE_DIR, false); Modified: branches/4.0/stepmania/src/ProfileManager.h ============================================================================== --- branches/4.0/stepmania/src/ProfileManager.h (original) +++ branches/4.0/stepmania/src/ProfileManager.h Sun Jan 16 01:15:02 2011 @@ -66,6 +66,7 @@ public: // void LoadMachineProfile(); void SaveMachineProfile() const; + void UploadMachineProfie() const; bool IsPersistentProfile( PlayerNumber pn ) const { return !m_sProfileDir[pn].empty(); } bool IsPersistentProfile( ProfileSlot slot ) const; |