From 4eb4ce2229fd4c533540ff28088ccb88ffe31ba3 Mon Sep 17 00:00:00 2001 From: Michal Gubriansky Date: Fri, 2 Aug 2024 13:36:35 +0200 Subject: [PATCH 1/3] * ability to download more leaderboard scores then just the immediate player one * leaderboard score now also holds the username of the player in question --- native/stats.cpp | 13 ++++++++----- steam/Api.hx | 38 ++++++++++++++++++++++++++++---------- 2 files changed, 36 insertions(+), 15 deletions(-) diff --git a/native/stats.cpp b/native/stats.cpp index 8847d2a..6586401 100644 --- a/native/stats.cpp +++ b/native/stats.cpp @@ -43,16 +43,16 @@ bool CallbackHandler::UploadScore(const std::string& leaderboardId, int score, i } -static std::string toLeaderboardScore(const char* leaderboardName, int score, int detail, int rank){ +static std::string toLeaderboardScore(const char* leaderboardName, int score, int detail, int rank, std::string userName){ std::ostringstream data; - data << leaderboardName << "," << score << "," << detail << "," << rank; + data << leaderboardName << "," << score << "," << detail << "," << rank << "," << userName; return data.str(); } void CallbackHandler::OnScoreUploaded(LeaderboardScoreUploaded_t *pCallback, bool bIOFailure){ if (pCallback->m_bSuccess && !bIOFailure){ std::string leaderboardName = SteamUserStats()->GetLeaderboardName(pCallback->m_hSteamLeaderboard); - std::string data = toLeaderboardScore(SteamUserStats()->GetLeaderboardName(pCallback->m_hSteamLeaderboard), pCallback->m_nScore, -1, pCallback->m_nGlobalRankNew); + std::string data = toLeaderboardScore(SteamUserStats()->GetLeaderboardName(pCallback->m_hSteamLeaderboard), pCallback->m_nScore, -1, pCallback->m_nGlobalRankNew, ""); SendEvent(ScoreUploaded, true, data.c_str()); }else if (pCallback != NULL && pCallback->m_hSteamLeaderboard != 0) { SendEvent(ScoreUploaded, false, SteamUserStats()->GetLeaderboardName(pCallback->m_hSteamLeaderboard)); @@ -95,14 +95,17 @@ void CallbackHandler::OnScoreDownloaded(LeaderboardScoresDownloaded_t *pCallback if (haveData) data << ";"; - data << toLeaderboardScore(leaderboardId.c_str(), entry.m_nScore, details[0], entry.m_nGlobalRank).c_str(); + + std::string userName = SteamFriends()->GetFriendPersonaName(entry.m_steamIDUser); + + data << toLeaderboardScore(leaderboardId.c_str(), entry.m_nScore, details[0], entry.m_nGlobalRank, userName).c_str(); haveData = true; } if (haveData) SendEvent(ScoreDownloaded, true, data.str().c_str()); else - SendEvent(ScoreDownloaded, true, toLeaderboardScore(leaderboardId.c_str(), -1, -1, -1).c_str()); + SendEvent(ScoreDownloaded, true, toLeaderboardScore(leaderboardId.c_str(), -1, -1, -1, "").c_str()); } void CallbackHandler::RequestGlobalStats(){ diff --git a/steam/Api.hx b/steam/Api.hx index 8372399..abdbb40 100644 --- a/steam/Api.hx +++ b/steam/Api.hx @@ -7,7 +7,7 @@ private enum LeaderboardOp { FIND(id:String); UPLOAD(score:LeaderboardScore); - DOWNLOAD(id:String); + DOWNLOAD(download:LeaderboardDownload); } enum abstract SteamNotificationPosition(Int) to Int @@ -151,11 +151,11 @@ class Api return active && report("clearAchievement", [id], _ClearAchievement(@:privateAccess id.toUtf8())); } - public static function downloadLeaderboardScore(id:String):Bool { + public static function downloadLeaderboardScore(leaderboardDownload:LeaderboardDownload):Bool { if (!active) return false; var startProcessingNow = (leaderboardOps.length == 0); - findLeaderboardIfNecessary(id); - leaderboardOps.add(LeaderboardOp.DOWNLOAD(id)); + findLeaderboardIfNecessary(leaderboardDownload.leaderboardId); + leaderboardOps.add(LeaderboardOp.DOWNLOAD(leaderboardDownload)); if (startProcessingNow) processNextLeaderboardOp(); return true; } @@ -445,8 +445,8 @@ class Api case UPLOAD(score): if (!report("Leaderboard.UPLOAD", [score.toString()], _UploadScore(@:privateAccess score.leaderboardId.toUtf8(), score.score, score.detail))) processNextLeaderboardOp(); - case DOWNLOAD(id): - if (!report("Leaderboard.DOWNLOAD", [id], _DownloadScores(@:privateAccess id.toUtf8(), 0, 0))) + case DOWNLOAD(lb): + if (!report("Leaderboard.DOWNLOAD", [lb.toString()], _DownloadScores(@:privateAccess lb.leaderboardId.toUtf8(), lb.before, lb.after))) processNextLeaderboardOp(); } } @@ -552,24 +552,42 @@ class LeaderboardScore { public var score:Int; public var detail:Int; public var rank:Int; + public var userName:String; - public function new(leaderboardId_:String, score_:Int, detail_:Int, rank_:Int=-1) { + public function new(leaderboardId_:String, score_:Int, detail_:Int, rank_:Int=-1, userName_:String=null) { leaderboardId = leaderboardId_; score = score_; detail = detail_; rank = rank_; + userName = userName_; } public function toString():String { - return leaderboardId + "," + score + "," + detail + "," + rank; + return leaderboardId + "," + score + "," + detail + "," + rank + "," + userName; } public static function fromString(str:String):LeaderboardScore { var tokens = str.split(","); - if (tokens.length == 4) - return new LeaderboardScore(tokens[0], Util.str2Int(tokens[1]), Util.str2Int(tokens[2]), Util.str2Int(tokens[3])); + if (tokens.length == 5) + return new LeaderboardScore(tokens[0], Util.str2Int(tokens[1]), Util.str2Int(tokens[2]), Util.str2Int(tokens[3]), tokens[4]); else return null; } } +class LeaderboardDownload { + public var leaderboardId:String; + public var before:Int; + public var after:Int; + + public function new(leaderboardId_:String, before_:Int = 0, after_:Int = 0) { + leaderboardId = leaderboardId_; + before = before_; + after = after_; + } + + public function toString():String { + return leaderboardId + "," + before + "," + after; + } +} + From bcd6c853434d57037503f97e3144c063850d0640 Mon Sep 17 00:00:00 2001 From: Michal Gubriansky Date: Fri, 2 Aug 2024 21:08:23 +0200 Subject: [PATCH 2/3] add count for score entries so we know when we are done downloading all of them --- native/stats.cpp | 10 +++++----- steam/Api.hx | 10 ++++++---- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/native/stats.cpp b/native/stats.cpp index 6586401..4f391c9 100644 --- a/native/stats.cpp +++ b/native/stats.cpp @@ -43,16 +43,16 @@ bool CallbackHandler::UploadScore(const std::string& leaderboardId, int score, i } -static std::string toLeaderboardScore(const char* leaderboardName, int score, int detail, int rank, std::string userName){ +static std::string toLeaderboardScore(const char* leaderboardName, int score, int detail, int rank, std::string userName, int numEntries){ std::ostringstream data; - data << leaderboardName << "," << score << "," << detail << "," << rank << "," << userName; + data << leaderboardName << "," << score << "," << detail << "," << rank << "," << userName << "," << numEntries; return data.str(); } void CallbackHandler::OnScoreUploaded(LeaderboardScoreUploaded_t *pCallback, bool bIOFailure){ if (pCallback->m_bSuccess && !bIOFailure){ std::string leaderboardName = SteamUserStats()->GetLeaderboardName(pCallback->m_hSteamLeaderboard); - std::string data = toLeaderboardScore(SteamUserStats()->GetLeaderboardName(pCallback->m_hSteamLeaderboard), pCallback->m_nScore, -1, pCallback->m_nGlobalRankNew, ""); + std::string data = toLeaderboardScore(SteamUserStats()->GetLeaderboardName(pCallback->m_hSteamLeaderboard), pCallback->m_nScore, -1, pCallback->m_nGlobalRankNew, "", 1); SendEvent(ScoreUploaded, true, data.c_str()); }else if (pCallback != NULL && pCallback->m_hSteamLeaderboard != 0) { SendEvent(ScoreUploaded, false, SteamUserStats()->GetLeaderboardName(pCallback->m_hSteamLeaderboard)); @@ -98,14 +98,14 @@ void CallbackHandler::OnScoreDownloaded(LeaderboardScoresDownloaded_t *pCallback std::string userName = SteamFriends()->GetFriendPersonaName(entry.m_steamIDUser); - data << toLeaderboardScore(leaderboardId.c_str(), entry.m_nScore, details[0], entry.m_nGlobalRank, userName).c_str(); + data << toLeaderboardScore(leaderboardId.c_str(), entry.m_nScore, details[0], entry.m_nGlobalRank, userName, numEntries).c_str(); haveData = true; } if (haveData) SendEvent(ScoreDownloaded, true, data.str().c_str()); else - SendEvent(ScoreDownloaded, true, toLeaderboardScore(leaderboardId.c_str(), -1, -1, -1, "").c_str()); + SendEvent(ScoreDownloaded, true, toLeaderboardScore(leaderboardId.c_str(), -1, -1, -1, "", 0).c_str()); } void CallbackHandler::RequestGlobalStats(){ diff --git a/steam/Api.hx b/steam/Api.hx index abdbb40..7189337 100644 --- a/steam/Api.hx +++ b/steam/Api.hx @@ -553,23 +553,25 @@ class LeaderboardScore { public var detail:Int; public var rank:Int; public var userName:String; + public var entriesCount:Int; - public function new(leaderboardId_:String, score_:Int, detail_:Int, rank_:Int=-1, userName_:String=null) { + public function new(leaderboardId_:String, score_:Int, detail_:Int, rank_:Int=-1, userName_:String=null, entriesCount_:Int=0) { leaderboardId = leaderboardId_; score = score_; detail = detail_; rank = rank_; userName = userName_; + entriesCount = entriesCount_; } public function toString():String { - return leaderboardId + "," + score + "," + detail + "," + rank + "," + userName; + return leaderboardId + "," + score + "," + detail + "," + rank + "," + userName + "," + entriesCount; } public static function fromString(str:String):LeaderboardScore { var tokens = str.split(","); - if (tokens.length == 5) - return new LeaderboardScore(tokens[0], Util.str2Int(tokens[1]), Util.str2Int(tokens[2]), Util.str2Int(tokens[3]), tokens[4]); + if (tokens.length == 6) + return new LeaderboardScore(tokens[0], Util.str2Int(tokens[1]), Util.str2Int(tokens[2]), Util.str2Int(tokens[3]), tokens[4], Util.str2Int(tokens[5])); else return null; } From d6fd130a5eb6beec9f37e7c7b37377c6a04588ed Mon Sep 17 00:00:00 2001 From: Michal Gubriansky Date: Sun, 18 Aug 2024 15:29:38 +0200 Subject: [PATCH 3/3] fix multiple scores parsing --- steam/Api.hx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/steam/Api.hx b/steam/Api.hx index 7189337..ac87d1a 100644 --- a/steam/Api.hx +++ b/steam/Api.hx @@ -495,7 +495,7 @@ class Api if (success) { var scores = data.split(";"); for (score in scores) { - var score = LeaderboardScore.fromString(data); + var score = LeaderboardScore.fromString(score); if (score != null && whenLeaderboardScoreDownloaded != null) whenLeaderboardScoreDownloaded(score); } }