Skip to content

Commit e62a01c

Browse files
authored
Add metadata endpoint to refresh friend listing (#36386)
Alternative to / closes #36341 See also: ppy/osu-server-spectator#415 This is a simple solution by adding a spectator endpoint to refresh the friend listing. A more complicated form of this is to make adding/removing friends only via spectator, but that would require osu-web changes too.
1 parent a60f262 commit e62a01c

File tree

4 files changed

+29
-0
lines changed

4 files changed

+29
-0
lines changed

osu.Game/Online/Metadata/IMetadataServer.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,5 +53,10 @@ public interface IMetadataServer
5353
/// Signals to the server that the current user would like to stop receiving updates about the state of the multiplayer room with the given <paramref name="id"/>.
5454
/// </summary>
5555
Task EndWatchingMultiplayerRoom(long id);
56+
57+
/// <summary>
58+
/// Refresh this user's friend listing.
59+
/// </summary>
60+
Task RefreshFriends();
5661
}
5762
}

osu.Game/Online/Metadata/MetadataClient.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using osu.Framework.Bindables;
1010
using osu.Framework.Graphics;
1111
using osu.Game.Online.API;
12+
using osu.Game.Online.API.Requests.Responses;
1213
using osu.Game.Online.Multiplayer;
1314
using osu.Game.Users;
1415

@@ -21,6 +22,16 @@ public abstract partial class MetadataClient : Component, IMetadataClient, IMeta
2122
[Resolved]
2223
private IAPIProvider api { get; set; } = null!;
2324

25+
private readonly IBindableList<APIRelation> localFriends = new BindableList<APIRelation>();
26+
27+
protected override void LoadComplete()
28+
{
29+
base.LoadComplete();
30+
31+
localFriends.BindTo(api.LocalUserState.Friends);
32+
localFriends.BindCollectionChanged((_, _) => RefreshFriends().FireAndForget());
33+
}
34+
2435
#region Beatmap metadata updates
2536

2637
public abstract Task<BeatmapUpdates> GetChangesSince(int queueId);
@@ -152,6 +163,8 @@ public void Dispose()
152163

153164
public abstract Task EndWatchingMultiplayerRoom(long id);
154165

166+
public abstract Task RefreshFriends();
167+
155168
public event Action<MultiplayerRoomScoreSetEvent>? MultiplayerRoomScoreSet;
156169

157170
Task IMetadataClient.MultiplayerRoomScoreSet(MultiplayerRoomScoreSetEvent roomScoreSetEvent)

osu.Game/Online/Metadata/OnlineMetadataClient.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,15 @@ public override async Task EndWatchingMultiplayerRoom(long id)
288288
Logger.Log($@"{nameof(OnlineMetadataClient)} stopped watching multiplayer room with ID {id}", LoggingTarget.Network);
289289
}
290290

291+
public override async Task RefreshFriends()
292+
{
293+
if (connector?.IsConnected.Value != true)
294+
throw new OperationCanceledException();
295+
296+
Debug.Assert(connection != null);
297+
await connection.InvokeAsync(nameof(IMetadataServer.RefreshFriends)).ConfigureAwait(false);
298+
}
299+
291300
public override async Task DisconnectRequested()
292301
{
293302
await base.DisconnectRequested().ConfigureAwait(false);

osu.Game/Tests/Visual/Metadata/TestMetadataClient.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ public override Task<MultiplayerPlaylistItemStats[]> BeginWatchingMultiplayerRoo
128128

129129
public override Task EndWatchingMultiplayerRoom(long id) => Task.CompletedTask;
130130

131+
public override Task RefreshFriends() => Task.CompletedTask;
132+
131133
public void Disconnect()
132134
{
133135
isConnected.Value = false;

0 commit comments

Comments
 (0)