diff options
Diffstat (limited to 'source/application/StarStatisticsService_pc_steam.cpp')
-rw-r--r-- | source/application/StarStatisticsService_pc_steam.cpp | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/source/application/StarStatisticsService_pc_steam.cpp b/source/application/StarStatisticsService_pc_steam.cpp new file mode 100644 index 0000000..00b37ba --- /dev/null +++ b/source/application/StarStatisticsService_pc_steam.cpp @@ -0,0 +1,130 @@ +#include "StarStatisticsService_pc_steam.hpp" +#include "StarLogging.hpp" + +namespace Star { + +SteamStatisticsService::SteamStatisticsService(PcPlatformServicesStatePtr) +: m_callbackUserStatsReceived(this, &SteamStatisticsService::onUserStatsReceived), + m_callbackUserStatsStored(this, &SteamStatisticsService::onUserStatsStored), + m_callbackAchievementStored(this, &SteamStatisticsService::onAchievementStored) { + m_appId = SteamUtils()->GetAppID(); + refresh(); +} + +bool SteamStatisticsService::initialized() const { + return m_initialized; +} + +Maybe<String> SteamStatisticsService::error() const { + return m_error; +} + +bool SteamStatisticsService::setStat(String const& name, String const& type, Json const& value) { + if (type == "int") + return SteamUserStats()->SetStat(name.utf8Ptr(), (int32_t)value.toInt()); + + if (type == "float") + return SteamUserStats()->SetStat(name.utf8Ptr(), value.toFloat()); + + return false; +} + +Json SteamStatisticsService::getStat(String const& name, String const& type, Json def) const { + if (type == "int") { + int32_t intValue = 0; + if (SteamUserStats()->GetStat(name.utf8Ptr(), &intValue)) + return Json(intValue); + } + + if (type == "float") { + float floatValue = 0.0f; + if (SteamUserStats()->GetStat(name.utf8Ptr(), &floatValue)) + return Json(floatValue); + } + + return def; +} + +bool SteamStatisticsService::reportEvent(String const&, Json const&) { + // Steam doesn't support events + return false; +} + +bool SteamStatisticsService::unlockAchievement(String const& name) { + if (!SteamUserStats()->SetAchievement(name.utf8Ptr())) { + Logger::error("Cannot set Steam achievement %s", name); + return false; + } + return true; +} + +StringSet SteamStatisticsService::achievementsUnlocked() const { + StringSet achievements; + for (uint32_t i = 0; i < SteamUserStats()->GetNumAchievements(); ++i) { + String achievement = SteamUserStats()->GetAchievementName(i); + + bool unlocked = false; + if (SteamUserStats()->GetAchievement(achievement.utf8Ptr(), &unlocked) && unlocked) { + achievements.add(achievement); + } + } + return {}; +} + +void SteamStatisticsService::refresh() { + if (!SteamUser()->BLoggedOn()) { + m_error = {"Not logged in"}; + return; + } + + SteamUserStats()->RequestCurrentStats(); +} + +void SteamStatisticsService::flush() { + SteamUserStats()->StoreStats(); +} + +bool SteamStatisticsService::reset() { + SteamUserStats()->ResetAllStats(true); + return true; +} + +void SteamStatisticsService::onUserStatsReceived(UserStatsReceived_t* callback) { + if (callback->m_nGameID != m_appId) + return; + + if (callback->m_eResult != k_EResultOK) { + m_error = {strf("Steam RequestCurrentStats failed with code %d", callback->m_eResult)}; + return; + } + + Logger::debug("Steam RequestCurrentStats successful"); + m_initialized = true; +} + +void SteamStatisticsService::onUserStatsStored(UserStatsStored_t* callback) { + if (callback->m_nGameID != m_appId) + return; + + if (callback->m_eResult == k_EResultOK) { + Logger::debug("Steam StoreStats successful"); + return; + } + + if (callback->m_eResult == k_EResultInvalidParam) { + // A stat we set broke a constraint and was reverted on the service. + Logger::info("Steam StoreStats: Some stats failed validation"); + return; + } + + m_error = {strf("Steam StoreStats failed with code %d", callback->m_eResult)}; +} + +void SteamStatisticsService::onAchievementStored(UserAchievementStored_t* callback) { + if (callback->m_nGameID != m_appId) + return; + + Logger::debug("Steam achievement %s stored successfully", callback->m_rgchAchievementName); +} + +} |