From f3f95c64d96ce3eabe90f43f39c6e2ef94924edb Mon Sep 17 00:00:00 2001 From: qxdFox Date: Sun, 2 Nov 2025 20:01:31 +0100 Subject: [PATCH] Fix discord RPC and allow turning it on/off without restart --- src/engine/client/client.cpp | 2 +- src/engine/client/discord.cpp | 55 ++++++++++++++++---- src/engine/discord.h | 2 +- src/engine/shared/config_variables_tclient.h | 6 +-- 4 files changed, 49 insertions(+), 16 deletions(-) diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp index bf5265c656a..4b0b945a02c 100644 --- a/src/engine/client/client.cpp +++ b/src/engine/client/client.cpp @@ -3029,7 +3029,7 @@ void CClient::Update() else GameClient()->OnUpdate(); - Discord()->Update(); + Discord()->Update(g_Config.m_TcDiscordRPC); Steam()->Update(); if(Steam()->GetConnectAddress()) { diff --git a/src/engine/client/discord.cpp b/src/engine/client/discord.cpp index 5789da7e2e2..d5e36c9f3ef 100644 --- a/src/engine/client/discord.cpp +++ b/src/engine/client/discord.cpp @@ -36,10 +36,27 @@ class CDiscord : public IDiscord IDiscordActivityEvents m_ActivityEvents; IDiscordActivityManager *m_pActivityManager; + FDiscordCreate m_pfnDiscordCreate; + bool m_Enabled; + public: bool Init(FDiscordCreate pfnDiscordCreate) { - m_pCore = 0; + m_pfnDiscordCreate = pfnDiscordCreate; + m_Enabled = false; + return InitDiscord(); + } + bool InitDiscord() + { + if(m_pCore) + { + m_pCore->destroy(m_pCore); + m_pCore = 0; + m_pActivityManager = 0; + } + if(!m_Enabled) + return false; + mem_zero(&m_ActivityEvents, sizeof(m_ActivityEvents)); m_ActivityEvents.on_activity_join = &CDiscord::OnActivityJoin; @@ -54,7 +71,8 @@ class CDiscord : public IDiscord Params.event_data = this; Params.activity_events = &m_ActivityEvents; - int Error = pfnDiscordCreate(DISCORD_VERSION, &Params, &m_pCore); + int Error = m_pfnDiscordCreate(DISCORD_VERSION, &Params, &m_pCore); + if(Error != DiscordResult_Ok) { dbg_msg("discord", "error initializing discord instance, error=%d", Error); @@ -72,18 +90,27 @@ class CDiscord : public IDiscord return false; } - void Update() override + void Update(bool Enabled) override { - // update every 5 seconds, rate limit is 5 updates per 20 seconds - if(m_UpdateActivity && time_get() > m_LastActivityUpdate + time_freq() * 5) + bool NeedsUpdate = m_Enabled != Enabled; + m_Enabled = Enabled; + + if(NeedsUpdate) + InitDiscord(); + + if(m_pCore && m_Enabled) { - m_UpdateActivity = false; - m_LastActivityUpdate = time_get(); + // update every 5 seconds, rate limit is 5 updates per 20 seconds + if(m_UpdateActivity && time_get() > m_LastActivityUpdate + time_freq() * 5) + { + m_UpdateActivity = false; + m_LastActivityUpdate = time_get(); - m_pActivityManager->update_activity(m_pActivityManager, &m_Activity, 0, 0); - } + m_pActivityManager->update_activity(m_pActivityManager, &m_Activity, 0, 0); + } - m_pCore->run_callbacks(m_pCore); + m_pCore->run_callbacks(m_pCore); + } } void ClearGameInfo() override @@ -186,6 +213,12 @@ class CDiscord : public IDiscord IClient *m_pClient = pSelf->Kernel()->RequestInterface(); m_pClient->Connect(pSecret); } + + ~CDiscord() + { + if(m_pCore) + m_pCore->destroy(m_pCore); + } }; static IDiscord *CreateDiscordImpl() @@ -212,7 +245,7 @@ static IDiscord *CreateDiscordImpl() class CDiscordStub : public IDiscord { - void Update() override {} + void Update(bool Enabled) override {} void ClearGameInfo() override {} void SetGameInfo(const CServerInfo &ServerInfo, const char *pMapName, bool Registered) override {} void UpdateServerInfo(const CServerInfo &ServerInfo, const char *pMapName) override {} diff --git a/src/engine/discord.h b/src/engine/discord.h index 54d263bf213..ea25e737c00 100644 --- a/src/engine/discord.h +++ b/src/engine/discord.h @@ -11,7 +11,7 @@ class IDiscord : public IInterface { MACRO_INTERFACE("discord") public: - virtual void Update() = 0; + virtual void Update(bool Enabled) = 0; virtual void ClearGameInfo() = 0; virtual void SetGameInfo(const CServerInfo &ServerInfo, const char *pMapName, bool Registered) = 0; diff --git a/src/engine/shared/config_variables_tclient.h b/src/engine/shared/config_variables_tclient.h index 7687dd979f7..24e023948af 100644 --- a/src/engine/shared/config_variables_tclient.h +++ b/src/engine/shared/config_variables_tclient.h @@ -211,9 +211,6 @@ MACRO_CONFIG_INT(TcAutoVoteWhenFar, tc_auto_vote_when_far, 0, 0, 1, CFGFLAG_CLIE MACRO_CONFIG_STR(TcAutoVoteWhenFarMessage, tc_auto_vote_when_far_message, 128, "", CFGFLAG_CLIENT | CFGFLAG_SAVE, "Message to send when auto far vote happens, leave empty to disable") MACRO_CONFIG_INT(TcAutoVoteWhenFarTime, tc_auto_vote_when_far_time, 5, 0, 20, CFGFLAG_CLIENT | CFGFLAG_SAVE, "How long until auto vote far happens") -// Integration -// MACRO_CONFIG_INT(TcDiscordRPC, tc_discord_rpc, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Toggle discord RPC (requires restart)") // broken - // Font MACRO_CONFIG_STR(TcCustomFont, tc_custom_font, 255, "DejaVu Sans", CFGFLAG_CLIENT | CFGFLAG_SAVE, "Custom font face") @@ -264,3 +261,6 @@ MACRO_CONFIG_INT(TcExecuteOnJoinDelay, tc_execute_on_join_delay, 2, 7, 50000, CF // Custom Communities MACRO_CONFIG_STR(TcCustomCommunitiesUrl, tc_custom_communities_url, 256, "https://raw.githubusercontent.com/SollyBunny/ddnet-custom-communities/refs/heads/main/custom-communities-ddnet-info.json", CFGFLAG_CLIENT | CFGFLAG_SAVE, "URL to fetch custom communities from (must be https), empty to disable") + +// Discord RPC +MACRO_CONFIG_INT(TcDiscordRPC, tc_discord_rpc, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Toggle discord RPC (requires restart)") // broken