Fix possible crash due to race in DiscordRichPresence

This commit is contained in:
Dan Balasescu 2024-04-08 23:25:45 +09:00
parent b226a05637
commit 7d8fe51178
No known key found for this signature in database
1 changed files with 16 additions and 6 deletions

View File

@ -36,8 +36,6 @@ internal partial class DiscordRichPresence : Component
[Resolved]
private IBindable<RulesetInfo> ruleset { get; set; } = null!;
private IBindable<APIUser> user = null!;
[Resolved]
private IAPIProvider api { get; set; } = null!;
@ -50,9 +48,11 @@ internal partial class DiscordRichPresence : Component
[Resolved]
private MultiplayerClient multiplayerClient { get; set; } = null!;
[Resolved]
private OsuConfigManager config { get; set; } = null!;
private readonly IBindable<UserStatus?> status = new Bindable<UserStatus?>();
private readonly IBindable<UserActivity> activity = new Bindable<UserActivity>();
private readonly Bindable<DiscordRichPresenceMode> privacyMode = new Bindable<DiscordRichPresenceMode>();
private readonly RichPresence presence = new RichPresence
@ -65,8 +65,10 @@ internal partial class DiscordRichPresence : Component
},
};
private IBindable<APIUser>? user;
[BackgroundDependencyLoader]
private void load(OsuConfigManager config)
private void load()
{
client = new DiscordRpcClient(client_id)
{
@ -87,6 +89,13 @@ private void load(OsuConfigManager config)
client.OnJoin += onJoin;
}
client.Initialize();
}
protected override void LoadComplete()
{
base.LoadComplete();
config.BindWith(OsuSetting.DiscordRichPresence, privacyMode);
user = api.LocalUser.GetBoundCopy();
@ -104,8 +113,6 @@ private void load(OsuConfigManager config)
activity.BindValueChanged(_ => schedulePresenceUpdate());
privacyMode.BindValueChanged(_ => schedulePresenceUpdate());
multiplayerClient.RoomUpdated += onRoomUpdated;
client.Initialize();
}
private void onReady(object _, ReadyMessage __)
@ -146,6 +153,9 @@ private void schedulePresenceUpdate()
private void updatePresence(bool hideIdentifiableInformation)
{
if (user == null)
return;
// user activity
if (activity.Value != null)
{