diff --git a/osu.Game/Online/Multiplayer/IMultiplayerLoungeServer.cs b/osu.Game/Online/Multiplayer/IMultiplayerLoungeServer.cs
index 4640640c5f..a04ec53578 100644
--- a/osu.Game/Online/Multiplayer/IMultiplayerLoungeServer.cs
+++ b/osu.Game/Online/Multiplayer/IMultiplayerLoungeServer.cs
@@ -15,6 +15,16 @@ public interface IMultiplayerLoungeServer
///
/// The databased room ID.
/// If the user is already in the requested (or another) room.
+ /// If the room required a password.
Task JoinRoom(long roomId);
+
+ ///
+ /// Request to join a multiplayer room with a provided password.
+ ///
+ /// The databased room ID.
+ /// The password for the join request.
+ /// If the user is already in the requested (or another) room.
+ /// If the room provided password was incorrect.
+ Task JoinRoom(long roomId, string password);
}
}
diff --git a/osu.Game/Online/Multiplayer/InvalidPasswordException.cs b/osu.Game/Online/Multiplayer/InvalidPasswordException.cs
new file mode 100644
index 0000000000..0441aea287
--- /dev/null
+++ b/osu.Game/Online/Multiplayer/InvalidPasswordException.cs
@@ -0,0 +1,22 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using System;
+using System.Runtime.Serialization;
+using Microsoft.AspNetCore.SignalR;
+
+namespace osu.Game.Online.Multiplayer
+{
+ [Serializable]
+ public class InvalidPasswordException : HubException
+ {
+ public InvalidPasswordException()
+ {
+ }
+
+ protected InvalidPasswordException(SerializationInfo info, StreamingContext context)
+ : base(info, context)
+ {
+ }
+ }
+}
diff --git a/osu.Game/Online/Multiplayer/MultiplayerClient.cs b/osu.Game/Online/Multiplayer/MultiplayerClient.cs
index 2e65f7cf1c..a9f4dc9e2f 100644
--- a/osu.Game/Online/Multiplayer/MultiplayerClient.cs
+++ b/osu.Game/Online/Multiplayer/MultiplayerClient.cs
@@ -212,6 +212,8 @@ public Task ChangeSettings(Optional name = default, Optional
[Key(6)]
public long PlaylistItemId { get; set; }
+ [Key(7)]
+ public string Password { get; set; } = string.Empty;
+
public bool Equals(MultiplayerRoomSettings other)
=> BeatmapID == other.BeatmapID
&& BeatmapChecksum == other.BeatmapChecksum
&& RequiredMods.SequenceEqual(other.RequiredMods)
&& AllowedMods.SequenceEqual(other.AllowedMods)
&& RulesetID == other.RulesetID
+ && Password.Equals(other.Password, StringComparison.Ordinal)
&& Name.Equals(other.Name, StringComparison.Ordinal)
&& PlaylistItemId == other.PlaylistItemId;
@@ -49,6 +53,7 @@ public override string ToString() => $"Name:{Name}"
+ $" Beatmap:{BeatmapID} ({BeatmapChecksum})"
+ $" RequiredMods:{string.Join(',', RequiredMods)}"
+ $" AllowedMods:{string.Join(',', AllowedMods)}"
+ + $" Password:{(string.IsNullOrEmpty(Password) ? "no" : "yes")}"
+ $" Ruleset:{RulesetID}"
+ $" Item:{PlaylistItemId}";
}