From ec02e16c8196f08f5b7c63ca1cedd94a40de629c Mon Sep 17 00:00:00 2001 From: smoogipoo Date: Fri, 22 Oct 2021 20:53:45 +0900 Subject: [PATCH] Add playlist item change event --- .../Online/Multiplayer/IMultiplayerClient.cs | 6 ++ .../Online/Multiplayer/MultiplayerClient.cs | 62 +++++++++++++------ 2 files changed, 50 insertions(+), 18 deletions(-) diff --git a/osu.Game/Online/Multiplayer/IMultiplayerClient.cs b/osu.Game/Online/Multiplayer/IMultiplayerClient.cs index 3eafb31510..81979c146c 100644 --- a/osu.Game/Online/Multiplayer/IMultiplayerClient.cs +++ b/osu.Game/Online/Multiplayer/IMultiplayerClient.cs @@ -118,5 +118,11 @@ namespace osu.Game.Online.Multiplayer /// /// The removed item. Task PlaylistItemRemoved(APIPlaylistItem item); + + /// + /// Signals that an item has been changed in the playlist. + /// + /// The changed item. + Task PlaylistItemChanged(APIPlaylistItem item); } } diff --git a/osu.Game/Online/Multiplayer/MultiplayerClient.cs b/osu.Game/Online/Multiplayer/MultiplayerClient.cs index 72ac13c2f2..1b321421e3 100644 --- a/osu.Game/Online/Multiplayer/MultiplayerClient.cs +++ b/osu.Game/Online/Multiplayer/MultiplayerClient.cs @@ -577,12 +577,7 @@ namespace osu.Game.Online.Multiplayer if (Room == null) return; - var set = await GetOnlineBeatmapSet(item.BeatmapID).ConfigureAwait(false); - - var beatmap = set.Beatmaps.Single(b => b.OnlineBeatmapID == item.BeatmapID); - beatmap.MD5Hash = item.BeatmapChecksum; - - var ruleset = Rulesets.GetRuleset(item.RulesetID); + var playlistItem = await createPlaylistItem(item).ConfigureAwait(false); await scheduleAsync(() => { @@ -591,18 +586,6 @@ namespace osu.Game.Online.Multiplayer Debug.Assert(APIRoom != null); - var playlistItem = new PlaylistItem - { - ID = item.ID, - Beatmap = { Value = beatmap }, - Ruleset = { Value = ruleset }, - }; - - var rulesetInstance = ruleset.CreateInstance(); - - playlistItem.RequiredMods.AddRange(item.RequiredMods.Select(m => m.ToMod(rulesetInstance))); - playlistItem.AllowedMods.AddRange(item.AllowedMods.Select(m => m.ToMod(rulesetInstance))); - APIRoom.Playlist.Add(playlistItem); RoomUpdated?.Invoke(); }).ConfigureAwait(false); @@ -625,6 +608,26 @@ namespace osu.Game.Online.Multiplayer }); } + public async Task PlaylistItemChanged(APIPlaylistItem item) + { + if (Room == null) + return; + + var playlistItem = await createPlaylistItem(item).ConfigureAwait(false); + + await scheduleAsync(() => + { + if (Room == null) + return; + + Debug.Assert(APIRoom != null); + + int index = APIRoom.Playlist.Where(p => p.ID == item.ID).Select((_, i) => i).Single(); + APIRoom.Playlist.RemoveAt(index); + APIRoom.Playlist.Insert(index, playlistItem); + }).ConfigureAwait(false); + } + /// /// Populates the for a given . /// @@ -663,6 +666,29 @@ namespace osu.Game.Online.Multiplayer /// The retrieval task. protected abstract Task GetOnlineBeatmapSet(int beatmapId, CancellationToken cancellationToken = default); + private async Task createPlaylistItem(APIPlaylistItem item) + { + var set = await GetOnlineBeatmapSet(item.BeatmapID).ConfigureAwait(false); + + var beatmap = set.Beatmaps.Single(b => b.OnlineBeatmapID == item.BeatmapID); + beatmap.MD5Hash = item.BeatmapChecksum; + + var ruleset = Rulesets.GetRuleset(item.RulesetID); + var rulesetInstance = ruleset.CreateInstance(); + + var playlistItem = new PlaylistItem + { + ID = item.ID, + Beatmap = { Value = beatmap }, + Ruleset = { Value = ruleset }, + }; + + playlistItem.RequiredMods.AddRange(item.RequiredMods.Select(m => m.ToMod(rulesetInstance))); + playlistItem.AllowedMods.AddRange(item.AllowedMods.Select(m => m.ToMod(rulesetInstance))); + + return playlistItem; + } + /// /// For the provided user ID, update whether the user is included in . ///