From 61255925e61dd6124b06b072bb0bfbb2ee160ec9 Mon Sep 17 00:00:00 2001 From: pizzaboxer Date: Sat, 22 Jul 2023 12:32:11 +0100 Subject: [PATCH] Mitigate rich presence race condition (#411) --- Bloxstrap/Integrations/DiscordRichPresence.cs | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/Bloxstrap/Integrations/DiscordRichPresence.cs b/Bloxstrap/Integrations/DiscordRichPresence.cs index caf4dfa..b5b3248 100644 --- a/Bloxstrap/Integrations/DiscordRichPresence.cs +++ b/Bloxstrap/Integrations/DiscordRichPresence.cs @@ -25,7 +25,7 @@ namespace Bloxstrap.Integrations App.Logger.WriteLine($"[DiscordRichPresence::DiscordRichPresence] Received ready from user {e.User.Username} ({e.User.ID})"); _rpcClient.OnPresenceUpdate += (_, e) => - App.Logger.WriteLine("[DiscordRichPresence::DiscordRichPresence] Updated presence"); + App.Logger.WriteLine("[DiscordRichPresence::DiscordRichPresence] Presence updated"); _rpcClient.OnError += (_, e) => App.Logger.WriteLine($"[DiscordRichPresence::DiscordRichPresence] An RPC error occurred - {e.Message}"); @@ -114,10 +114,11 @@ namespace Bloxstrap.Integrations } string icon = "roblox"; + long placeId = _activityWatcher.ActivityPlaceId; - App.Logger.WriteLine($"[DiscordRichPresence::SetCurrentGame] Setting presence for Place ID {_activityWatcher.ActivityPlaceId}"); + App.Logger.WriteLine($"[DiscordRichPresence::SetCurrentGame] Setting presence for Place ID {placeId}"); - var universeIdResponse = await Http.GetJson($"https://apis.roblox.com/universes/v1/places/{_activityWatcher.ActivityPlaceId}/universe"); + var universeIdResponse = await Http.GetJson($"https://apis.roblox.com/universes/v1/places/{placeId}/universe"); if (universeIdResponse is null) { App.Logger.WriteLine($"[DiscordRichPresence::SetCurrentGame] Could not get Universe ID!"); @@ -159,7 +160,7 @@ namespace Bloxstrap.Integrations new Button { Label = "See Details", - Url = $"https://www.roblox.com/games/{_activityWatcher.ActivityPlaceId}" + Url = $"https://www.roblox.com/games/{placeId}" } }; @@ -168,7 +169,7 @@ namespace Bloxstrap.Integrations buttons.Insert(0, new Button { Label = "Join", - Url = $"roblox://experiences/start?placeId={_activityWatcher.ActivityPlaceId}&gameInstanceId={_activityWatcher.ActivityJobId}" + Url = $"roblox://experiences/start?placeId={placeId}&gameInstanceId={_activityWatcher.ActivityJobId}" }); } @@ -176,6 +177,12 @@ namespace Bloxstrap.Integrations if (universeDetails.Name.Length < 2) universeDetails.Name = $"{universeDetails.Name}\x2800\x2800\x2800"; + if (!_activityWatcher.ActivityInGame || placeId != _activityWatcher.ActivityPlaceId) + { + App.Logger.WriteLine($"[DiscordRichPresence::SetCurrentGame] Aborting presence set because game activity has changed"); + return false; + } + _currentPresence = new RichPresence { Details = universeDetails.Name, @@ -198,8 +205,6 @@ namespace Bloxstrap.Integrations public void UpdatePresence() { - App.Logger.WriteLine($"[DiscordRichPresence::UpdatePresence] Updating presence"); - if (_currentPresence is null) { App.Logger.WriteLine($"[DiscordRichPresence::UpdatePresence] Presence is empty, clearing"); @@ -207,6 +212,8 @@ namespace Bloxstrap.Integrations return; } + App.Logger.WriteLine($"[DiscordRichPresence::UpdatePresence] Updating presence"); + if (_visible) _rpcClient.SetPresence(_currentPresence); } @@ -216,6 +223,7 @@ namespace Bloxstrap.Integrations App.Logger.WriteLine("[DiscordRichPresence::Dispose] Cleaning up Discord RPC and Presence"); _rpcClient.ClearPresence(); _rpcClient.Dispose(); + GC.SuppressFinalize(this); } } }