From fb2293821ab009304c11be3d4d352ee8aa92debe Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= <dach.bartlomiej@gmail.com>
Date: Thu, 7 Sep 2023 11:26:51 +0200
Subject: [PATCH] Allow watching replay from multi/playlist results screens

---
 osu.Game/Online/API/Requests/Responses/SoloScoreInfo.cs      | 2 +-
 osu.Game/Online/Rooms/MultiplayerScore.cs                    | 5 ++++-
 osu.Game/Scoring/ScoreInfo.cs                                | 5 ++++-
 .../OnlinePlay/Multiplayer/MultiplayerResultsScreen.cs       | 2 +-
 4 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/osu.Game/Online/API/Requests/Responses/SoloScoreInfo.cs b/osu.Game/Online/API/Requests/Responses/SoloScoreInfo.cs
index 15f4bace969f..783522220ba2 100644
--- a/osu.Game/Online/API/Requests/Responses/SoloScoreInfo.cs
+++ b/osu.Game/Online/API/Requests/Responses/SoloScoreInfo.cs
@@ -189,7 +189,7 @@ public ScoreInfo ToScoreInfo(Mod[] mods, IBeatmapInfo? beatmap = null)
                 Statistics = Statistics,
                 MaximumStatistics = MaximumStatistics,
                 Date = EndedAt,
-                Hash = HasReplay ? "online" : string.Empty, // TODO: temporary?
+                HasOnlineReplay = HasReplay,
                 Mods = mods,
                 PP = PP,
             };
diff --git a/osu.Game/Online/Rooms/MultiplayerScore.cs b/osu.Game/Online/Rooms/MultiplayerScore.cs
index 21aa8df54b4a..e6307ab7f0ce 100644
--- a/osu.Game/Online/Rooms/MultiplayerScore.cs
+++ b/osu.Game/Online/Rooms/MultiplayerScore.cs
@@ -58,6 +58,9 @@ public class MultiplayerScore
         [JsonProperty("position")]
         public int? Position { get; set; }
 
+        [JsonProperty("has_replay")]
+        public bool HasReplay { get; set; }
+
         /// <summary>
         /// Any scores in the room around this score.
         /// </summary>
@@ -84,7 +87,7 @@ public ScoreInfo CreateScoreInfo(ScoreManager scoreManager, RulesetStore ruleset
                 User = User,
                 Accuracy = Accuracy,
                 Date = EndedAt,
-                Hash = string.Empty, // todo: temporary?
+                HasOnlineReplay = HasReplay,
                 Rank = Rank,
                 Mods = Mods?.Select(m => m.ToMod(rulesetInstance)).ToArray() ?? Array.Empty<Mod>(),
                 Position = Position,
diff --git a/osu.Game/Scoring/ScoreInfo.cs b/osu.Game/Scoring/ScoreInfo.cs
index 992271d072e0..6b03e876c481 100644
--- a/osu.Game/Scoring/ScoreInfo.cs
+++ b/osu.Game/Scoring/ScoreInfo.cs
@@ -94,7 +94,10 @@ public class ScoreInfo : RealmObject, IHasGuidPrimaryKey, IHasRealmFiles, ISoftD
 
         public double Accuracy { get; set; }
 
-        public bool HasReplay => !string.IsNullOrEmpty(Hash);
+        public bool HasReplay => !string.IsNullOrEmpty(Hash) || HasOnlineReplay;
+
+        [Ignored]
+        public bool HasOnlineReplay { get; set; }
 
         public DateTimeOffset Date { get; set; }
 
diff --git a/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerResultsScreen.cs b/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerResultsScreen.cs
index 9708a94cd70f..f665ed2d41f3 100644
--- a/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerResultsScreen.cs
+++ b/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerResultsScreen.cs
@@ -10,7 +10,7 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer
     public partial class MultiplayerResultsScreen : PlaylistsResultsScreen
     {
         public MultiplayerResultsScreen(ScoreInfo score, long roomId, PlaylistItem playlistItem)
-            : base(score, roomId, playlistItem, false, false)
+            : base(score, roomId, playlistItem, false)
         {
         }
     }