Skip to content

Commit

Permalink
Mitigate rich presence race condition (#411)
Browse files Browse the repository at this point in the history
  • Loading branch information
pizzaboxer committed Jul 22, 2023
1 parent cefe7cd commit 6125592
Showing 1 changed file with 15 additions and 7 deletions.
22 changes: 15 additions & 7 deletions Bloxstrap/Integrations/DiscordRichPresence.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public DiscordRichPresence(RobloxActivity activityWatcher)
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}");
Expand Down Expand Up @@ -114,10 +114,11 @@ public async Task<bool> SetCurrentGame()
}

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)
{
App.Logger.WriteLine($"[DiscordRichPresence::SetCurrentGame] Could not get Universe ID!");
Expand Down Expand Up @@ -159,7 +160,7 @@ public async Task<bool> SetCurrentGame()
new Button
{
Label = "See Details",
Url = $"https://www.roblox.com/games/{_activityWatcher.ActivityPlaceId}"
Url = $"https://www.roblox.com/games/{placeId}"
}
};

Expand All @@ -168,14 +169,20 @@ public async Task<bool> SetCurrentGame()
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}"
});
}

// so turns out discord rejects the presence set request if the place name is less than 2 characters long lol
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,
Expand All @@ -198,15 +205,15 @@ public async Task<bool> SetCurrentGame()

public void UpdatePresence()
{
App.Logger.WriteLine($"[DiscordRichPresence::UpdatePresence] Updating presence");

if (_currentPresence is null)
{
App.Logger.WriteLine($"[DiscordRichPresence::UpdatePresence] Presence is empty, clearing");
_rpcClient.ClearPresence();
return;
}

App.Logger.WriteLine($"[DiscordRichPresence::UpdatePresence] Updating presence");

if (_visible)
_rpcClient.SetPresence(_currentPresence);
}
Expand All @@ -216,6 +223,7 @@ public void Dispose()
App.Logger.WriteLine("[DiscordRichPresence::Dispose] Cleaning up Discord RPC and Presence");
_rpcClient.ClearPresence();
_rpcClient.Dispose();
GC.SuppressFinalize(this);
}
}
}

0 comments on commit 6125592

Please sign in to comment.