Mitigate rich presence race condition (#411)

This commit is contained in:
pizzaboxer 2023-07-22 12:32:11 +01:00
parent cefe7cd22a
commit 61255925e6
No known key found for this signature in database
GPG Key ID: 59D4A1DBAD0F2BA8

View File

@ -25,7 +25,7 @@ namespace Bloxstrap.Integrations
App.Logger.WriteLine($"[DiscordRichPresence::DiscordRichPresence] Received ready from user {e.User.Username} ({e.User.ID})"); App.Logger.WriteLine($"[DiscordRichPresence::DiscordRichPresence] Received ready from user {e.User.Username} ({e.User.ID})");
_rpcClient.OnPresenceUpdate += (_, e) => _rpcClient.OnPresenceUpdate += (_, e) =>
App.Logger.WriteLine("[DiscordRichPresence::DiscordRichPresence] Updated presence"); App.Logger.WriteLine("[DiscordRichPresence::DiscordRichPresence] Presence updated");
_rpcClient.OnError += (_, e) => _rpcClient.OnError += (_, e) =>
App.Logger.WriteLine($"[DiscordRichPresence::DiscordRichPresence] An RPC error occurred - {e.Message}"); App.Logger.WriteLine($"[DiscordRichPresence::DiscordRichPresence] An RPC error occurred - {e.Message}");
@ -114,10 +114,11 @@ namespace Bloxstrap.Integrations
} }
string icon = "roblox"; 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<UniverseIdResponse>($"https://apis.roblox.com/universes/v1/places/{_activityWatcher.ActivityPlaceId}/universe"); var universeIdResponse = await Http.GetJson<UniverseIdResponse>($"https://apis.roblox.com/universes/v1/places/{placeId}/universe");
if (universeIdResponse is null) if (universeIdResponse is null)
{ {
App.Logger.WriteLine($"[DiscordRichPresence::SetCurrentGame] Could not get Universe ID!"); App.Logger.WriteLine($"[DiscordRichPresence::SetCurrentGame] Could not get Universe ID!");
@ -159,7 +160,7 @@ namespace Bloxstrap.Integrations
new Button new Button
{ {
Label = "See Details", 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 buttons.Insert(0, new Button
{ {
Label = "Join", 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) if (universeDetails.Name.Length < 2)
universeDetails.Name = $"{universeDetails.Name}\x2800\x2800\x2800"; 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 _currentPresence = new RichPresence
{ {
Details = universeDetails.Name, Details = universeDetails.Name,
@ -198,8 +205,6 @@ namespace Bloxstrap.Integrations
public void UpdatePresence() public void UpdatePresence()
{ {
App.Logger.WriteLine($"[DiscordRichPresence::UpdatePresence] Updating presence");
if (_currentPresence is null) if (_currentPresence is null)
{ {
App.Logger.WriteLine($"[DiscordRichPresence::UpdatePresence] Presence is empty, clearing"); App.Logger.WriteLine($"[DiscordRichPresence::UpdatePresence] Presence is empty, clearing");
@ -207,6 +212,8 @@ namespace Bloxstrap.Integrations
return; return;
} }
App.Logger.WriteLine($"[DiscordRichPresence::UpdatePresence] Updating presence");
if (_visible) if (_visible)
_rpcClient.SetPresence(_currentPresence); _rpcClient.SetPresence(_currentPresence);
} }
@ -216,6 +223,7 @@ namespace Bloxstrap.Integrations
App.Logger.WriteLine("[DiscordRichPresence::Dispose] Cleaning up Discord RPC and Presence"); App.Logger.WriteLine("[DiscordRichPresence::Dispose] Cleaning up Discord RPC and Presence");
_rpcClient.ClearPresence(); _rpcClient.ClearPresence();
_rpcClient.Dispose(); _rpcClient.Dispose();
GC.SuppressFinalize(this);
} }
} }
} }