Add Rich Presence to Achievement Dialog Header
This refactors the Rich Presence generation to store to a member field that can be exposed to the UI to display the Rich Presence in the achievement header. It still updates at its original rate of once per two minutes, but calls an update on the dialog when that ticks.
This commit is contained in:
parent
900439ea0d
commit
38bd04c439
|
@ -290,9 +290,11 @@ void AchievementManager::DoFrame()
|
||||||
time_t current_time = std::time(nullptr);
|
time_t current_time = std::time(nullptr);
|
||||||
if (difftime(current_time, m_last_ping_time) > 120)
|
if (difftime(current_time, m_last_ping_time) > 120)
|
||||||
{
|
{
|
||||||
RichPresence rp = GenerateRichPresence();
|
GenerateRichPresence();
|
||||||
m_queue.EmplaceItem([this, rp] { PingRichPresence(rp); });
|
m_queue.EmplaceItem([this] { PingRichPresence(m_rich_presence); });
|
||||||
m_last_ping_time = current_time;
|
m_last_ping_time = current_time;
|
||||||
|
if (m_update_callback)
|
||||||
|
m_update_callback();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -305,17 +307,17 @@ u32 AchievementManager::MemoryPeeker(u32 address, u32 num_bytes, void* ud)
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
return m_system->GetMMU()
|
return m_system->GetMMU()
|
||||||
.HostTryReadU8(threadguard, address)
|
.HostTryReadU8(threadguard, address, PowerPC::RequestedAddressSpace::Physical)
|
||||||
.value_or(PowerPC::ReadResult<u8>(false, 0u))
|
.value_or(PowerPC::ReadResult<u8>(false, 0u))
|
||||||
.value;
|
.value;
|
||||||
case 2:
|
case 2:
|
||||||
return m_system->GetMMU()
|
return m_system->GetMMU()
|
||||||
.HostTryReadU16(threadguard, address)
|
.HostTryReadU16(threadguard, address, PowerPC::RequestedAddressSpace::Physical)
|
||||||
.value_or(PowerPC::ReadResult<u16>(false, 0u))
|
.value_or(PowerPC::ReadResult<u16>(false, 0u))
|
||||||
.value;
|
.value;
|
||||||
case 4:
|
case 4:
|
||||||
return m_system->GetMMU()
|
return m_system->GetMMU()
|
||||||
.HostTryReadU32(threadguard, address)
|
.HostTryReadU32(threadguard, address, PowerPC::RequestedAddressSpace::Physical)
|
||||||
.value_or(PowerPC::ReadResult<u32>(false, 0u))
|
.value_or(PowerPC::ReadResult<u32>(false, 0u))
|
||||||
.value;
|
.value;
|
||||||
default:
|
default:
|
||||||
|
@ -411,6 +413,13 @@ void AchievementManager::GetAchievementProgress(AchievementId achievement_id, u3
|
||||||
rc_runtime_get_achievement_measured(&m_runtime, achievement_id, value, target);
|
rc_runtime_get_achievement_measured(&m_runtime, achievement_id, value, target);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AchievementManager::RichPresence AchievementManager::GetRichPresence()
|
||||||
|
{
|
||||||
|
std::lock_guard lg{m_lock};
|
||||||
|
RichPresence rich_presence = m_rich_presence;
|
||||||
|
return rich_presence;
|
||||||
|
}
|
||||||
|
|
||||||
void AchievementManager::CloseGame()
|
void AchievementManager::CloseGame()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
|
@ -585,18 +594,17 @@ void AchievementManager::ActivateDeactivateAchievement(AchievementId id, bool en
|
||||||
rc_runtime_deactivate_achievement(&m_runtime, id);
|
rc_runtime_deactivate_achievement(&m_runtime, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
AchievementManager::RichPresence AchievementManager::GenerateRichPresence()
|
void AchievementManager::GenerateRichPresence()
|
||||||
{
|
{
|
||||||
RichPresence rp_buffer;
|
|
||||||
Core::RunAsCPUThread([&] {
|
Core::RunAsCPUThread([&] {
|
||||||
|
std::lock_guard lg{m_lock};
|
||||||
rc_runtime_get_richpresence(
|
rc_runtime_get_richpresence(
|
||||||
&m_runtime, rp_buffer.data(), RP_SIZE,
|
&m_runtime, m_rich_presence.data(), RP_SIZE,
|
||||||
[](unsigned address, unsigned num_bytes, void* ud) {
|
[](unsigned address, unsigned num_bytes, void* ud) {
|
||||||
return static_cast<AchievementManager*>(ud)->MemoryPeeker(address, num_bytes, ud);
|
return static_cast<AchievementManager*>(ud)->MemoryPeeker(address, num_bytes, ud);
|
||||||
},
|
},
|
||||||
this, nullptr);
|
this, nullptr);
|
||||||
});
|
});
|
||||||
return rp_buffer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AchievementManager::ResponseType AchievementManager::AwardAchievement(AchievementId achievement_id)
|
AchievementManager::ResponseType AchievementManager::AwardAchievement(AchievementId achievement_id)
|
||||||
|
|
|
@ -94,6 +94,7 @@ public:
|
||||||
rc_api_fetch_game_data_response_t* GetGameData();
|
rc_api_fetch_game_data_response_t* GetGameData();
|
||||||
UnlockStatus GetUnlockStatus(AchievementId achievement_id) const;
|
UnlockStatus GetUnlockStatus(AchievementId achievement_id) const;
|
||||||
void GetAchievementProgress(AchievementId achievement_id, u32* value, u32* target);
|
void GetAchievementProgress(AchievementId achievement_id, u32* value, u32* target);
|
||||||
|
RichPresence GetRichPresence();
|
||||||
|
|
||||||
void CloseGame();
|
void CloseGame();
|
||||||
void Logout();
|
void Logout();
|
||||||
|
@ -111,7 +112,7 @@ private:
|
||||||
ResponseType FetchUnlockData(bool hardcore);
|
ResponseType FetchUnlockData(bool hardcore);
|
||||||
|
|
||||||
void ActivateDeactivateAchievement(AchievementId id, bool enabled, bool unofficial, bool encore);
|
void ActivateDeactivateAchievement(AchievementId id, bool enabled, bool unofficial, bool encore);
|
||||||
RichPresence GenerateRichPresence();
|
void GenerateRichPresence();
|
||||||
|
|
||||||
ResponseType AwardAchievement(AchievementId achievement_id);
|
ResponseType AwardAchievement(AchievementId achievement_id);
|
||||||
ResponseType SubmitLeaderboard(AchievementId leaderboard_id, int value);
|
ResponseType SubmitLeaderboard(AchievementId leaderboard_id, int value);
|
||||||
|
@ -137,6 +138,7 @@ private:
|
||||||
u32 m_game_id = 0;
|
u32 m_game_id = 0;
|
||||||
rc_api_fetch_game_data_response_t m_game_data{};
|
rc_api_fetch_game_data_response_t m_game_data{};
|
||||||
bool m_is_game_loaded = false;
|
bool m_is_game_loaded = false;
|
||||||
|
RichPresence m_rich_presence;
|
||||||
time_t m_last_ping_time = 0;
|
time_t m_last_ping_time = 0;
|
||||||
|
|
||||||
std::unordered_map<AchievementId, UnlockStatus> m_unlock_map;
|
std::unordered_map<AchievementId, UnlockStatus> m_unlock_map;
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include <rcheevos/include/rc_runtime.h>
|
#include <rcheevos/include/rc_runtime.h>
|
||||||
|
|
||||||
#include "Core/AchievementManager.h"
|
#include "Core/AchievementManager.h"
|
||||||
|
#include "Core/Config/AchievementSettings.h"
|
||||||
#include "Core/Core.h"
|
#include "Core/Core.h"
|
||||||
|
|
||||||
#include "DolphinQt/QtUtils/ModalMessageBox.h"
|
#include "DolphinQt/QtUtils/ModalMessageBox.h"
|
||||||
|
@ -101,11 +102,9 @@ void AchievementHeaderWidget::UpdateData()
|
||||||
m_game_progress_soft->setValue(point_spread.hard_unlocks);
|
m_game_progress_soft->setValue(point_spread.hard_unlocks);
|
||||||
m_game_progress_soft->setRange(0, point_spread.total_count);
|
m_game_progress_soft->setRange(0, point_spread.total_count);
|
||||||
m_game_progress_soft->setValue(point_spread.hard_unlocks + point_spread.soft_unlocks);
|
m_game_progress_soft->setValue(point_spread.hard_unlocks + point_spread.soft_unlocks);
|
||||||
// TODO: RP needs a minor refactor to work here, will be a future PR
|
m_rich_presence->setText(
|
||||||
// m_rich_presence->setText(QString::fromStdString(AchievementManager::GetInstance()->GenerateRichPresence()));
|
QString::fromUtf8(AchievementManager::GetInstance()->GetRichPresence().data()));
|
||||||
// m_rich_presence->setVisible(Config::Get(Config::RA_RICH_PRESENCE_ENABLED));
|
m_rich_presence->setVisible(Config::Get(Config::RA_RICH_PRESENCE_ENABLED));
|
||||||
m_rich_presence->setText(QString{});
|
|
||||||
m_rich_presence->setVisible(false);
|
|
||||||
|
|
||||||
m_user_box->setVisible(false);
|
m_user_box->setVisible(false);
|
||||||
m_game_box->setVisible(true);
|
m_game_box->setVisible(true);
|
||||||
|
|
Loading…
Reference in New Issue