diff options
Diffstat (limited to 'gcsdk/gcleaderboardapi.cpp')
| -rw-r--r-- | gcsdk/gcleaderboardapi.cpp | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/gcsdk/gcleaderboardapi.cpp b/gcsdk/gcleaderboardapi.cpp new file mode 100644 index 0000000..2883acc --- /dev/null +++ b/gcsdk/gcleaderboardapi.cpp @@ -0,0 +1,93 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//============================================================================= + +#include "stdafx.h" + +#include "gcsdk/enumutils.h" +#include "gcsdk/gcbase.h" +#include "gcsdk/http.h" +#include "gcsdk/job.h" +#include "steam/isteamuserstats.h" +#include "gcleaderboardapi.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +using namespace GCSDK; + +// @note Tom Bui: copied from steam +ENUMSTRINGS_START( ELeaderboardSortMethod ) +{ k_ELeaderboardSortMethodNone, "" }, +{ k_ELeaderboardSortMethodAscending, "Ascending" }, +{ k_ELeaderboardSortMethodDescending, "Descending" }, +ENUMSTRINGS_REVERSE( ELeaderboardSortMethod, k_ELeaderboardSortMethodNone ) + +ENUMSTRINGS_START( ELeaderboardDisplayType ) +{ k_ELeaderboardDisplayTypeNone, "" }, +{ k_ELeaderboardDisplayTypeNumeric, "Numeric" }, +{ k_ELeaderboardDisplayTypeTimeSeconds, "Seconds" }, +{ k_ELeaderboardDisplayTypeTimeMilliSeconds, "MilliSeconds" }, +ENUMSTRINGS_REVERSE( ELeaderboardDisplayType, k_ELeaderboardDisplayTypeNone ) + +ENUMSTRINGS_START( ELeaderboardUploadScoreMethod ) +{ k_ELeaderboardUploadScoreMethodNone, "" }, +{ k_ELeaderboardUploadScoreMethodKeepBest, "KeepBest" }, +{ k_ELeaderboardUploadScoreMethodForceUpdate, "ForceUpdate" }, +ENUMSTRINGS_REVERSE( ELeaderboardUploadScoreMethod, k_ELeaderboardUploadScoreMethodNone ) + +namespace GCSDK +{ + uint32 Leaderboard_YieldingFind( const char *pName, ELeaderboardSortMethod eLeaderboardSortMethod, ELeaderboardDisplayType eLeaderboardDisplayType, bool bCreateIfNotFound ) + { + CSteamAPIRequest apiRequest( k_EHTTPMethodPOST, "ISteamLeaderboards", "FindOrCreateLeaderboard", 1 ); + apiRequest.SetPOSTParamUInt32( "appid", GGCBase()->GetAppID() ); + apiRequest.SetPOSTParamString( "name", pName ); + + apiRequest.SetPOSTParamString( "sortmethod", PchNameFromELeaderboardSortMethod( eLeaderboardSortMethod ) ); + apiRequest.SetPOSTParamString( "displaytype", PchNameFromELeaderboardDisplayType( eLeaderboardDisplayType ) ); + apiRequest.SetPOSTParamBool( "createifnotfound", bCreateIfNotFound ); + + KeyValuesAD kvAPIResponse( "response" ); + const EResult eCallResult = GGCBase()->YieldingSendHTTPRequestKV( &apiRequest, kvAPIResponse ); + const EResult eAPIResult = eCallResult == k_EResultOK ? static_cast<EResult>( kvAPIResponse->GetInt( "result", k_EResultFail ) ) : k_EResultFail; + if ( eAPIResult == k_EResultOK ) + { + KeyValues *pKVEntry = kvAPIResponse->FindKey( pName ); + if ( pKVEntry ) + { + return pKVEntry->GetInt( "leaderBoardID", kInvalidLeaderboardID ); + } + } + return kInvalidLeaderboardID; + } + + bool Leaderboard_YieldingSetScore( uint32 unLeaderboardID, const CSteamID &steamID, ELeaderboardUploadScoreMethod eLeaderboardUploadScoreMethod, int score ) + { + Assert( unLeaderboardID != kInvalidLeaderboardID ); + if ( unLeaderboardID == kInvalidLeaderboardID ) + return false; + + CSteamAPIRequest apiRequest( k_EHTTPMethodPOST, "ISteamLeaderboards", "SetLeaderboardScore", 1 ); + apiRequest.SetPOSTParamUInt32( "appid", GGCBase()->GetAppID() ); + apiRequest.SetPOSTParamUInt32( "leaderboardid", unLeaderboardID ); + apiRequest.SetPOSTParamUInt64( "steamid", steamID.ConvertToUint64() ); + apiRequest.SetPOSTParamInt32( "score", score ); + + apiRequest.SetPOSTParamString( "scoremethod", PchNameFromELeaderboardUploadScoreMethod( eLeaderboardUploadScoreMethod ) ); + + KeyValuesAD kvAPIResponse( "response" ); + const EResult eCallResult = GGCBase()->YieldingSendHTTPRequestKV( &apiRequest, kvAPIResponse ); + const EResult eAPIResult = eCallResult == k_EResultOK ? static_cast<EResult>( kvAPIResponse->GetInt( "result", k_EResultFail ) ) : k_EResultFail; + if ( eAPIResult == k_EResultOK ) + return true; + + EmitError( SPEW_GC, __FUNCTION__ ": error code %u/%u setting leaderboard %u to %i (%s) for user '%s'.\n", + eCallResult, eAPIResult, unLeaderboardID, score, PchNameFromELeaderboardUploadScoreMethod( eLeaderboardUploadScoreMethod ), steamID.Render() ); + return false; + } + +}; // namespace GCSDK |