Merge pull request #2279 from CookiePLMonster/retroachievements-discord-rpc

Show RetroAchievements rich presence in Discord-RPC
This commit is contained in:
Connor McLaughlin 2021-06-20 01:18:51 +10:00 committed by GitHub
commit 995bab72c4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 50 additions and 7 deletions

View File

@ -45,6 +45,7 @@ static bool ActivateAchievement(Achievement* achievement);
static void DeactivateAchievement(Achievement* achievement);
static void SendPing();
static void SendPlaying();
static void UpdateRichPresence();
/// Uses a temporarily (second) CD image to resolve the hash.
static void GameChanged();
@ -306,6 +307,8 @@ void Update()
if (!s_test_mode)
{
UpdateRichPresence();
const s32 ping_frequency =
s_rich_presence_enabled ? RICH_PRESENCE_PING_FREQUENCY : NO_RICH_PRESENCE_PING_FREQUENCY;
if (static_cast<s32>(s_last_ping_time.GetTimeSeconds()) >= ping_frequency)
@ -633,6 +636,7 @@ static void GetUserUnlocksCallback(s32 status_code, const FrontendCommon::HTTPDo
ActivateLockedAchievements();
DisplayAchievementSummary();
SendPlaying();
UpdateRichPresence();
SendPing();
GetHostInterface()->OnAchievementsRefreshed();
}
@ -1045,6 +1049,9 @@ void SendPlaying()
static void UpdateRichPresence()
{
if (!s_has_rich_presence)
return;
char buffer[512];
int res = rc_runtime_get_richpresence(&s_rcheevos_runtime, buffer, sizeof(buffer), CheevosPeek, nullptr, nullptr);
if (res <= 0)
@ -1076,9 +1083,6 @@ void SendPing()
if (!HasActiveGame())
return;
if (s_has_rich_presence)
UpdateRichPresence();
char url[512];
char post_data[512];
int res = rc_url_ping(url, sizeof(url), post_data, sizeof(post_data), s_username.c_str(), s_login_token.c_str(),

View File

@ -1028,7 +1028,7 @@ void CommonHostInterface::OnRunningGameChanged(const std::string& path, CDImage*
}
#ifdef WITH_DISCORD_PRESENCE
UpdateDiscordPresence();
UpdateDiscordPresence(false);
#endif
#ifdef WITH_CHEEVOS
@ -3764,7 +3764,7 @@ void CommonHostInterface::InitializeDiscordPresence()
Discord_Initialize("705325712680288296", &handlers, 0, nullptr);
m_discord_presence_active = true;
UpdateDiscordPresence();
UpdateDiscordPresence(false);
}
void CommonHostInterface::ShutdownDiscordPresence()
@ -3775,13 +3775,31 @@ void CommonHostInterface::ShutdownDiscordPresence()
Discord_ClearPresence();
Discord_Shutdown();
m_discord_presence_active = false;
#ifdef WITH_CHEEVOS
m_discord_presence_cheevos_string.clear();
#endif
}
void CommonHostInterface::UpdateDiscordPresence()
void CommonHostInterface::UpdateDiscordPresence(bool rich_presence_only)
{
if (!m_discord_presence_active)
return;
#ifdef WITH_CHEEVOS
// Update only if RetroAchievements rich presence has changed
const std::string& new_rich_presence = Cheevos::GetRichPresenceString();
if (new_rich_presence == m_discord_presence_cheevos_string && rich_presence_only)
{
return;
}
m_discord_presence_cheevos_string = new_rich_presence;
#else
if (rich_presence_only)
{
return;
}
#endif
// https://discord.com/developers/docs/rich-presence/how-to#updating-presence-update-presence-payload-fields
DiscordRichPresence rp = {};
rp.largeImageKey = "duckstation_logo";
@ -3799,6 +3817,22 @@ void CommonHostInterface::UpdateDiscordPresence()
details_string.AppendString("No Game Running");
}
#ifdef WITH_CHEEVOS
SmallString state_string;
// Trim to 128 bytes as per Discord-RPC requirements
if (m_discord_presence_cheevos_string.length() >= 128)
{
// 124 characters + 3 dots + null terminator
state_string = m_discord_presence_cheevos_string.substr(0, 124);
state_string.AppendString("...");
}
else
{
state_string = m_discord_presence_cheevos_string;
}
rp.state = state_string;
#endif
rp.details = details_string;
Discord_UpdatePresence(&rp);
@ -3809,6 +3843,8 @@ void CommonHostInterface::PollDiscordPresence()
if (!m_discord_presence_active)
return;
UpdateDiscordPresence(true);
Discord_RunCallbacks();
}

View File

@ -502,7 +502,7 @@ private:
void SetDiscordPresenceEnabled(bool enabled);
void InitializeDiscordPresence();
void ShutdownDiscordPresence();
void UpdateDiscordPresence();
void UpdateDiscordPresence(bool rich_presence_only);
void PollDiscordPresence();
#endif
@ -551,5 +551,8 @@ private:
// discord rich presence
bool m_discord_presence_enabled = false;
bool m_discord_presence_active = false;
#ifdef WITH_CHEEVOS
std::string m_discord_presence_cheevos_string;
#endif
#endif
};