From bf9dd78b4e89c2cdcc2e5753e214769a05220a51 Mon Sep 17 00:00:00 2001 From: Buggem's Fedora PC <66670928+Buggem@users.noreply.github.com> Date: Sat, 25 Jan 2025 14:31:55 +1100 Subject: [PATCH] Make the RPC less invasive, only change when we NEED to. Thanks Flibit for the idea! :D --- desktop_version/src/DiscordNetwork.c | 39 ++++++++++++++++------------ desktop_version/src/GOGNetwork.c | 8 +++++- desktop_version/src/Network.c | 35 ++++++++++++++++++++----- desktop_version/src/Network.h | 4 ++- desktop_version/src/SteamNetwork.c | 10 +++++-- desktop_version/src/main.cpp | 12 +++++++-- 6 files changed, 79 insertions(+), 29 deletions(-) diff --git a/desktop_version/src/DiscordNetwork.c b/desktop_version/src/DiscordNetwork.c index 5470d4b866..cbb6a9b8b1 100644 --- a/desktop_version/src/DiscordNetwork.c +++ b/desktop_version/src/DiscordNetwork.c @@ -32,10 +32,10 @@ struct DISCORD_application { struct IDiscordActivityManager* activityMan; } app; -struct DiscordActivity activity; +static struct DiscordActivity activity; -bool discordDetected = false; -bool discordPostInit = false; +static bool discordDetected = false; +static bool discordPostInit = false; static void* libHandle = NULL; @@ -142,42 +142,47 @@ int32_t DISCORD_init(void) return 1; } -void DISCORD_update(const char* area, const char* roomname) +int32_t DISCORD_update(void) { if (libHandle == NULL) { - // no discord or just shutdown - return; + // no Discord or just shutdown + return 0; } if (app.core == NULL || !discordDetected) { // No Discord - return; + return 0; } + if (!DISCORD_REQUIRE(app.core->run_callbacks(app.core))) { - // Something or other is wrong, but do we care? - return; + // Something or other is wrong, but do we care? + return 0; } + return 1; +} +void DISCORD_unlockAchievement(const char *name) +{ + // No "achievements" in Discord +} + +void DISCORD_setRPC(const char *area, const char *roomname) +{ if (app.activityMan == NULL) { - vlog_debug("No activityMan! - it\'s fine, we can recreate this" ); + vlog_debug("No activityMan! - it\'s fine, we can recreate this" ); app.activityMan = app.core->get_activity_manager(app.core); } if (SDL_strcmp(activity.state, roomname) != 0 || SDL_strcmp(activity.assets.large_text, area) != 0) { - SDL_strlcpy(activity.state, roomname, sizeof(activity.state)); + SDL_strlcpy(activity.state, roomname, sizeof(activity.state)); SDL_strlcpy(activity.assets.large_image, "vvvvvv", sizeof(activity.assets.large_image)); SDL_strlcpy(activity.assets.large_text, area, sizeof(activity.assets.large_text)); app.activityMan->update_activity(app.activityMan, &activity, NULL, NULL); } -} -void DISCORD_unlockAchievement(const char *name) -{ - // No "achievements" in Discord -} - +} #endif // MakeAndPlay diff --git a/desktop_version/src/GOGNetwork.c b/desktop_version/src/GOGNetwork.c index bdd08bbe6e..2d97afda8b 100644 --- a/desktop_version/src/GOGNetwork.c +++ b/desktop_version/src/GOGNetwork.c @@ -15,12 +15,18 @@ void GOG_shutdown(void) { } -void GOG_update(const char* area, const char* roomname) +int32_t GOG_update(void) { + return 0; } void GOG_unlockAchievement(const char* name) { } +void GOG_setRPC(const char* area, const char* roomname) +{ +} + + #endif /* MAKEANDPLAY */ diff --git a/desktop_version/src/Network.c b/desktop_version/src/Network.c index 7a52a7d535..13712376b0 100644 --- a/desktop_version/src/Network.c +++ b/desktop_version/src/Network.c @@ -36,8 +36,9 @@ #define DECLARE_BACKEND(name) \ int32_t name##_init(void); \ void name##_shutdown(void); \ - void name##_update(const char *area, const char *roomname); \ - void name##_unlockAchievement(const char *name); + int32_t name##_update(void); \ + void name##_unlockAchievement(const char *name); \ + void name##_setRPC(const char *area, const char *roomname); #ifdef STEAM_NETWORK DECLARE_BACKEND(STEAM) #endif @@ -54,8 +55,9 @@ typedef struct NetworkBackend int32_t IsInit; int32_t (*Init)(void); void (*Shutdown)(void); - void (*Update)(const char*, const char*); + int32_t (*Update)(void); void (*UnlockAchievement)(const char*); + void (*SetRPC)(const char*, const char*); } NetworkBackend; #if NUM_BACKENDS > 0 @@ -69,7 +71,9 @@ int NETWORK_init(void) backends[index].Init = name##_init; \ backends[index].Shutdown = name##_shutdown; \ backends[index].Update = name##_update; \ - backends[index].UnlockAchievement = name##_unlockAchievement; + backends[index].UnlockAchievement = name##_unlockAchievement; \ + backends[index].SetRPC = name##_setRPC; + #ifdef STEAM_NETWORK ASSIGN_BACKEND(STEAM, 0) #endif @@ -104,16 +108,22 @@ void NETWORK_shutdown(void) #endif } -void NETWORK_update(const char *area, const char *roomname) + +int32_t NETWORK_update(void) { + int32_t result = 0; #if NUM_BACKENDS > 0 int32_t i; for (i = 0; i < NUM_BACKENDS; i += 1) if (backends[i].IsInit) { - backends[i].Update(area, roomname); + if ( backends[i].Update() ) + { + result |= (1 << i); + } } #endif + return result; } void NETWORK_unlockAchievement(const char *name) @@ -129,3 +139,16 @@ void NETWORK_unlockAchievement(const char *name) UNUSED(name); #endif } + +void NETWORK_setRPC(const char *area, const char *roomname) +{ + #if NUM_BACKENDS > 0 + int32_t i; + for (i = 0; i < NUM_BACKENDS; i += 1) + if (backends[i].IsInit) + { + backends[i].SetRPC(area, roomname); + } + #endif +} + diff --git a/desktop_version/src/Network.h b/desktop_version/src/Network.h index 39ed5ce5bc..76de343907 100644 --- a/desktop_version/src/Network.h +++ b/desktop_version/src/Network.h @@ -11,7 +11,7 @@ int32_t NETWORK_init(void); void NETWORK_shutdown(void); -void NETWORK_update(const char *area, const char *roomname); +int32_t NETWORK_update(void); void NETWORK_unlockAchievement(const char *name); @@ -19,6 +19,8 @@ int32_t NETWORK_getAchievementProgress(const char *name); void NETWORK_setAchievementProgress(const char *name, int32_t stat); +void NETWORK_setRPC(const char *area, const char *roomname); + #ifdef __cplusplus } #endif diff --git a/desktop_version/src/SteamNetwork.c b/desktop_version/src/SteamNetwork.c index fe4b92f22a..cb9b5f64ab 100644 --- a/desktop_version/src/SteamNetwork.c +++ b/desktop_version/src/SteamNetwork.c @@ -234,11 +234,11 @@ void STEAM_shutdown(void) } } -void STEAM_update(const char* area, const char* roomname) +int32_t STEAM_update(void) { if (!libHandle) { - return; + return 0; } SteamAPI_ManualDispatch_RunFrame(steamPipe); @@ -252,6 +252,7 @@ void STEAM_update(const char* area, const char* roomname) } SteamAPI_ManualDispatch_FreeLastCallback(steamPipe); } + return 1; } void STEAM_unlockAchievement(const char* name) @@ -266,4 +267,9 @@ void STEAM_unlockAchievement(const char* name) } } +void STEAM_setRPC(const char* area, const char* roomname) +{ + // TODO: implement staem rpc :) +} + #endif /* MAKEANDPLAY */ diff --git a/desktop_version/src/main.cpp b/desktop_version/src/main.cpp index efe183e409..57f5cd8ba8 100644 --- a/desktop_version/src/main.cpp +++ b/desktop_version/src/main.cpp @@ -75,6 +75,10 @@ static volatile Uint64 f_timePrev = 0; // RPC variables static const char* rpcArea = ""; static const char* rpcRoomname = ""; +static const char* old_rpcArea = ""; +static const char* old_rpcRoomname = ""; + + enum FuncType { @@ -999,8 +1003,12 @@ static enum LoopCode loop_begin(void) if (map.custommode) { rpcArea = game.customleveltitle.c_str(); } - // Update network APIs once per frame - NETWORK_update(rpcArea, rpcRoomname); + // Update network APIs once per frame (nested in if loop) + if( NETWORK_update() && ( SDL_strcmp(rpcArea, old_rpcArea) != 0 || SDL_strcmp(rpcRoomname, old_rpcRoomname) != 0 ) ) + NETWORK_setRPC(rpcArea, rpcRoomname); + + old_rpcArea = rpcArea; + old_rpcRoomname = rpcRoomname; return Loop_continue; }