mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2024-11-25 23:25:41 +00:00
Achievements: Fix requests being sent when not logged in
This commit is contained in:
parent
6aa2e9017b
commit
a35e1b7a25
|
@ -63,7 +63,7 @@ static void DeactivateAchievement(Achievement* achievement);
|
||||||
static void SendPing();
|
static void SendPing();
|
||||||
static void SendPlaying();
|
static void SendPlaying();
|
||||||
static void UpdateRichPresence();
|
static void UpdateRichPresence();
|
||||||
static Achievement* GetAchievementByID(u32 id);
|
static Achievement* GetMutableAchievementByID(u32 id);
|
||||||
static void ClearGameInfo(bool clear_achievements = true, bool clear_leaderboards = true);
|
static void ClearGameInfo(bool clear_achievements = true, bool clear_leaderboards = true);
|
||||||
static void ClearGameHash();
|
static void ClearGameHash();
|
||||||
static std::string GetUserAgent();
|
static std::string GetUserAgent();
|
||||||
|
@ -80,6 +80,7 @@ static void GetLbInfoCallback(s32 status_code, Common::HTTPDownloader::Request::
|
||||||
static void GetPatches(u32 game_id);
|
static void GetPatches(u32 game_id);
|
||||||
static std::string GetGameHash(CDImage* image);
|
static std::string GetGameHash(CDImage* image);
|
||||||
static void SetChallengeMode(bool enabled);
|
static void SetChallengeMode(bool enabled);
|
||||||
|
static void SendGetGameId();
|
||||||
static void GetGameIdCallback(s32 status_code, Common::HTTPDownloader::Request::Data data);
|
static void GetGameIdCallback(s32 status_code, Common::HTTPDownloader::Request::Data data);
|
||||||
static void SendPlayingCallback(s32 status_code, Common::HTTPDownloader::Request::Data data);
|
static void SendPlayingCallback(s32 status_code, Common::HTTPDownloader::Request::Data data);
|
||||||
static void UpdateRichPresence();
|
static void UpdateRichPresence();
|
||||||
|
@ -205,6 +206,18 @@ public:
|
||||||
Achievements::DownloadImage(api_request.url, std::move(cache_filename));
|
Achievements::DownloadImage(api_request.url, std::move(cache_filename));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string GetURL()
|
||||||
|
{
|
||||||
|
const int error = InitFunc(&api_request, this);
|
||||||
|
if (error != RC_OK)
|
||||||
|
{
|
||||||
|
FormattedError("%s failed: error %d (%s)", RAPIStructName<T>(), error, rc_error_str(error));
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
|
|
||||||
|
return api_request.url;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T, int (*ParseFunc)(T*, const char*), void (*DestroyFunc)(T*)>
|
template<typename T, int (*ParseFunc)(T*, const char*), void (*DestroyFunc)(T*)>
|
||||||
|
@ -278,7 +291,18 @@ void Achievements::LogFailedResponseJSON(const Common::HTTPDownloader::Request::
|
||||||
Log_ErrorPrintf("API call failed. Response JSON was:\n%s", str_data.c_str());
|
Log_ErrorPrintf("API call failed. Response JSON was:\n%s", str_data.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
static Achievements::Achievement* Achievements::GetAchievementByID(u32 id)
|
const Achievements::Achievement* Achievements::GetAchievementByID(u32 id)
|
||||||
|
{
|
||||||
|
for (const Achievement& ach : s_achievements)
|
||||||
|
{
|
||||||
|
if (ach.id == id)
|
||||||
|
return &ach;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
Achievements::Achievement* Achievements::GetMutableAchievementByID(u32 id)
|
||||||
{
|
{
|
||||||
for (Achievement& ach : s_achievements)
|
for (Achievement& ach : s_achievements)
|
||||||
{
|
{
|
||||||
|
@ -420,7 +444,7 @@ void Achievements::Initialize()
|
||||||
s_api_token = Host::GetBaseStringSettingValue("Cheevos", "Token");
|
s_api_token = Host::GetBaseStringSettingValue("Cheevos", "Token");
|
||||||
s_logged_in = (!s_username.empty() && !s_api_token.empty());
|
s_logged_in = (!s_username.empty() && !s_api_token.empty());
|
||||||
|
|
||||||
if (IsLoggedIn() && System::IsValid())
|
if (System::IsValid())
|
||||||
GameChanged(System::GetRunningPath(), nullptr);
|
GameChanged(System::GetRunningPath(), nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -742,6 +766,7 @@ bool Achievements::DoState(StateWrapper& sw)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
// internally this happens twice.. not great.
|
// internally this happens twice.. not great.
|
||||||
const int size = rc_runtime_progress_size(&s_rcheevos_runtime, nullptr);
|
const int size = rc_runtime_progress_size(&s_rcheevos_runtime, nullptr);
|
||||||
|
@ -757,7 +782,6 @@ bool Achievements::DoState(StateWrapper& sw)
|
||||||
data_size = 0;
|
data_size = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
sw.Do(&data_size);
|
sw.Do(&data_size);
|
||||||
if (data_size > 0)
|
if (data_size > 0)
|
||||||
|
@ -829,8 +853,8 @@ void Achievements::LoginCallback(s32 status_code, Common::HTTPDownloader::Reques
|
||||||
s_logged_in = true;
|
s_logged_in = true;
|
||||||
|
|
||||||
// If we have a game running, set it up.
|
// If we have a game running, set it up.
|
||||||
if (System::IsValid())
|
if (!s_game_hash.empty())
|
||||||
GameChanged(System::GetRunningPath(), nullptr);
|
SendGetGameId();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -968,7 +992,10 @@ void Achievements::DisplayAchievementSummary()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGuiFullscreen::AddNotification(10.0f, std::move(title), std::move(summary), s_game_icon);
|
Host::RunOnCPUThread([title = std::move(title), summary = std::move(summary), icon = s_game_icon]() {
|
||||||
|
if (FullscreenUI::IsInitialized())
|
||||||
|
ImGuiFullscreen::AddNotification(10.0f, std::move(title), std::move(summary), std::move(icon));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void Achievements::GetUserUnlocksCallback(s32 status_code, Common::HTTPDownloader::Request::Data data)
|
void Achievements::GetUserUnlocksCallback(s32 status_code, Common::HTTPDownloader::Request::Data data)
|
||||||
|
@ -990,7 +1017,7 @@ void Achievements::GetUserUnlocksCallback(s32 status_code, Common::HTTPDownloade
|
||||||
// flag achievements as unlocked
|
// flag achievements as unlocked
|
||||||
for (u32 i = 0; i < response.num_achievement_ids; i++)
|
for (u32 i = 0; i < response.num_achievement_ids; i++)
|
||||||
{
|
{
|
||||||
Achievement* cheevo = GetAchievementByID(response.achievement_ids[i]);
|
Achievement* cheevo = GetMutableAchievementByID(response.achievement_ids[i]);
|
||||||
if (!cheevo)
|
if (!cheevo)
|
||||||
{
|
{
|
||||||
Log_ErrorPrintf("Server returned unknown achievement %u", response.achievement_ids[i]);
|
Log_ErrorPrintf("Server returned unknown achievement %u", response.achievement_ids[i]);
|
||||||
|
@ -1075,7 +1102,7 @@ void Achievements::GetPatchesCallback(s32 status_code, Common::HTTPDownloader::R
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GetAchievementByID(defn.id))
|
if (GetMutableAchievementByID(defn.id))
|
||||||
{
|
{
|
||||||
Log_ErrorPrintf("Achievement %u already exists", defn.id);
|
Log_ErrorPrintf("Achievement %u already exists", defn.id);
|
||||||
continue;
|
continue;
|
||||||
|
@ -1351,6 +1378,12 @@ void Achievements::GameChanged(const std::string& path, CDImage* image)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (IsLoggedIn())
|
||||||
|
SendGetGameId();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Achievements::SendGetGameId()
|
||||||
|
{
|
||||||
RAPIRequest<rc_api_resolve_hash_request_t, rc_api_init_resolve_hash_request> request;
|
RAPIRequest<rc_api_resolve_hash_request_t, rc_api_init_resolve_hash_request> request;
|
||||||
request.username = s_username.c_str();
|
request.username = s_username.c_str();
|
||||||
request.api_token = s_api_token.c_str();
|
request.api_token = s_api_token.c_str();
|
||||||
|
@ -1643,7 +1676,7 @@ void Achievements::SubmitLeaderboardCallback(s32 status_code, Common::HTTPDownlo
|
||||||
|
|
||||||
void Achievements::UnlockAchievement(u32 achievement_id, bool add_notification /* = true*/)
|
void Achievements::UnlockAchievement(u32 achievement_id, bool add_notification /* = true*/)
|
||||||
{
|
{
|
||||||
Achievement* achievement = GetAchievementByID(achievement_id);
|
Achievement* achievement = GetMutableAchievementByID(achievement_id);
|
||||||
if (!achievement)
|
if (!achievement)
|
||||||
{
|
{
|
||||||
Log_ErrorPrintf("Attempting to unlock unknown achievement %u", achievement_id);
|
Log_ErrorPrintf("Attempting to unlock unknown achievement %u", achievement_id);
|
||||||
|
@ -1740,7 +1773,7 @@ std::string Achievements::GetAchievementProgressText(const Achievement& achievem
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string& Achievements::GetAchievementBadgePath(const Achievement& achievement)
|
const std::string& Achievements::GetAchievementBadgePath(const Achievement& achievement, bool download_if_missing)
|
||||||
{
|
{
|
||||||
std::string& badge_path = achievement.locked ? achievement.locked_badge_path : achievement.unlocked_badge_path;
|
std::string& badge_path = achievement.locked ? achievement.locked_badge_path : achievement.unlocked_badge_path;
|
||||||
if (!badge_path.empty() || achievement.badge_name.empty())
|
if (!badge_path.empty() || achievement.badge_name.empty())
|
||||||
|
@ -1754,13 +1787,25 @@ const std::string& Achievements::GetAchievementBadgePath(const Achievement& achi
|
||||||
return badge_path;
|
return badge_path;
|
||||||
|
|
||||||
// need to download it
|
// need to download it
|
||||||
|
if (download_if_missing)
|
||||||
|
{
|
||||||
RAPIRequest<rc_api_fetch_image_request_t, rc_api_init_fetch_image_request> request;
|
RAPIRequest<rc_api_fetch_image_request_t, rc_api_init_fetch_image_request> request;
|
||||||
request.image_name = achievement.badge_name.c_str();
|
request.image_name = achievement.badge_name.c_str();
|
||||||
request.image_type = achievement.locked ? RC_IMAGE_TYPE_ACHIEVEMENT_LOCKED : RC_IMAGE_TYPE_ACHIEVEMENT;
|
request.image_type = achievement.locked ? RC_IMAGE_TYPE_ACHIEVEMENT_LOCKED : RC_IMAGE_TYPE_ACHIEVEMENT;
|
||||||
request.DownloadImage(badge_path);
|
request.DownloadImage(badge_path);
|
||||||
|
}
|
||||||
|
|
||||||
return badge_path;
|
return badge_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string Achievements::GetAchievementBadgeURL(const Achievement& achievement)
|
||||||
|
{
|
||||||
|
RAPIRequest<rc_api_fetch_image_request_t, rc_api_init_fetch_image_request> request;
|
||||||
|
request.image_name = achievement.badge_name.c_str();
|
||||||
|
request.image_type = achievement.locked ? RC_IMAGE_TYPE_ACHIEVEMENT_LOCKED : RC_IMAGE_TYPE_ACHIEVEMENT;
|
||||||
|
return request.GetURL();
|
||||||
|
}
|
||||||
|
|
||||||
void Achievements::CheevosEventHandler(const rc_runtime_event_t* runtime_event)
|
void Achievements::CheevosEventHandler(const rc_runtime_event_t* runtime_event)
|
||||||
{
|
{
|
||||||
static const char* events[] = {"RC_RUNTIME_EVENT_ACHIEVEMENT_ACTIVATED", "RC_RUNTIME_EVENT_ACHIEVEMENT_PAUSED",
|
static const char* events[] = {"RC_RUNTIME_EVENT_ACHIEVEMENT_ACTIVATED", "RC_RUNTIME_EVENT_ACHIEVEMENT_PAUSED",
|
||||||
|
|
|
@ -143,9 +143,11 @@ const Leaderboard* GetLeaderboardByID(u32 id);
|
||||||
u32 GetLeaderboardCount();
|
u32 GetLeaderboardCount();
|
||||||
bool IsLeaderboardTimeType(const Leaderboard& leaderboard);
|
bool IsLeaderboardTimeType(const Leaderboard& leaderboard);
|
||||||
|
|
||||||
|
const Achievement* GetAchievementByID(u32 id);
|
||||||
std::pair<u32, u32> GetAchievementProgress(const Achievement& achievement);
|
std::pair<u32, u32> GetAchievementProgress(const Achievement& achievement);
|
||||||
std::string GetAchievementProgressText(const Achievement& achievement);
|
std::string GetAchievementProgressText(const Achievement& achievement);
|
||||||
const std::string& GetAchievementBadgePath(const Achievement& achievement);
|
const std::string& GetAchievementBadgePath(const Achievement& achievement, bool download_if_missing = true);
|
||||||
|
std::string GetAchievementBadgeURL(const Achievement& achievement);
|
||||||
|
|
||||||
void UnlockAchievement(u32 achievement_id, bool add_notification = true);
|
void UnlockAchievement(u32 achievement_id, bool add_notification = true);
|
||||||
void SubmitLeaderboard(u32 leaderboard_id, int value);
|
void SubmitLeaderboard(u32 leaderboard_id, int value);
|
||||||
|
|
Loading…
Reference in a new issue