131 lines
3.5 KiB
C++
131 lines
3.5 KiB
C++
|
#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);
|
||
|
}
|
||
|
|
||
|
}
|