2019-01-24 16:43:03 +08:00
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
2018-12-17 13:45:06 +08:00
2020-02-13 17:48:28 +08:00
using System ;
2018-12-17 13:45:06 +08:00
using System.Linq ;
2021-12-28 15:37:16 +08:00
using JetBrains.Annotations ;
2018-12-17 13:45:06 +08:00
using Newtonsoft.Json ;
2020-02-13 17:12:47 +08:00
using osu.Framework.Bindables ;
2018-12-17 13:45:06 +08:00
using osu.Game.Beatmaps ;
2020-01-17 12:27:47 +08:00
using osu.Game.Online.API ;
2021-10-21 15:43:46 +08:00
using osu.Game.Online.API.Requests.Responses ;
2022-04-01 16:06:37 +08:00
using osu.Game.Utils ;
2018-12-17 13:45:06 +08:00
2020-12-25 12:38:11 +08:00
namespace osu.Game.Online.Rooms
2018-12-17 13:45:06 +08:00
{
2022-02-15 22:33:26 +08:00
[JsonObject(MemberSerialization.OptIn)]
2020-02-13 17:48:28 +08:00
public class PlaylistItem : IEquatable < PlaylistItem >
2018-12-17 13:45:06 +08:00
{
[JsonProperty("id")]
2021-02-16 18:29:40 +08:00
public long ID { get ; set ; }
2018-12-17 13:45:06 +08:00
2021-11-25 20:41:03 +08:00
[JsonProperty("owner_id")]
public int OwnerID { get ; set ; }
2018-12-17 13:45:06 +08:00
[JsonProperty("ruleset_id")]
public int RulesetID { get ; set ; }
2021-02-17 15:44:39 +08:00
/// <summary>
/// Whether this <see cref="PlaylistItem"/> is still a valid selection for the <see cref="Room"/>.
/// </summary>
[JsonProperty("expired")]
public bool Expired { get ; set ; }
2021-12-03 14:45:13 +08:00
[JsonProperty("playlist_order")]
public ushort? PlaylistOrder { get ; set ; }
2021-12-02 18:15:27 +08:00
2021-12-03 19:05:25 +08:00
[JsonProperty("played_at")]
public DateTimeOffset ? PlayedAt { get ; set ; }
2018-12-17 13:45:06 +08:00
[JsonProperty("allowed_mods")]
2022-02-15 15:01:14 +08:00
public APIMod [ ] AllowedMods { get ; set ; } = Array . Empty < APIMod > ( ) ;
2019-12-11 13:10:35 +08:00
2018-12-17 13:45:06 +08:00
[JsonProperty("required_mods")]
2022-02-15 15:01:14 +08:00
public APIMod [ ] RequiredMods { get ; set ; } = Array . Empty < APIMod > ( ) ;
2018-12-17 13:45:06 +08:00
2022-02-15 22:33:26 +08:00
/// <summary>
/// Used for deserialising from the API.
/// </summary>
[JsonProperty("beatmap")]
private APIBeatmap apiBeatmap
2020-02-13 17:12:47 +08:00
{
2022-02-15 22:33:26 +08:00
// This getter is required/used internally by JSON.NET during deserialisation to do default-value comparisons. It is never used during serialisation (see: ShouldSerializeapiBeatmap()).
// It will always return a null value on deserialisation, which JSON.NET will handle gracefully.
get = > ( APIBeatmap ) Beatmap ;
set = > Beatmap = value ;
2020-02-13 17:12:47 +08:00
}
2018-12-17 13:45:06 +08:00
2022-02-15 22:33:26 +08:00
/// <summary>
/// Used for serialising to the API.
/// </summary>
[JsonProperty("beatmap_id")]
2022-06-03 19:36:11 +08:00
private int onlineBeatmapId
{
get = > Beatmap . OnlineID ;
// This setter is only required for client-side serialise-then-deserialise operations.
// Serialisation is supposed to emit only a `beatmap_id`, but a (non-null) `beatmap` is required on deserialise.
set = > Beatmap = new APIBeatmap { OnlineID = value } ;
}
2022-02-15 22:33:26 +08:00
2022-02-22 14:31:08 +08:00
/// <summary>
/// A beatmap representing this playlist item.
/// In many cases, this will *not* contain any usable information apart from OnlineID.
/// </summary>
2022-02-15 22:33:26 +08:00
[JsonIgnore]
public IBeatmapInfo Beatmap { get ; set ; } = null ! ;
[JsonIgnore]
public IBindable < bool > Valid = > valid ;
2021-11-16 16:01:24 +08:00
2022-02-15 22:33:26 +08:00
private readonly Bindable < bool > valid = new BindableBool ( true ) ;
[JsonConstructor]
private PlaylistItem ( )
{
}
public PlaylistItem ( IBeatmapInfo beatmap )
2018-12-17 13:45:06 +08:00
{
2022-02-15 22:33:26 +08:00
Beatmap = beatmap ;
2018-12-17 13:45:06 +08:00
}
2022-04-01 17:31:17 +08:00
public PlaylistItem ( MultiplayerPlaylistItem item )
: this ( new APIBeatmap { OnlineID = item . BeatmapID } )
{
ID = item . ID ;
OwnerID = item . OwnerID ;
RulesetID = item . RulesetID ;
Expired = item . Expired ;
PlaylistOrder = item . PlaylistOrder ;
PlayedAt = item . PlayedAt ;
RequiredMods = item . RequiredMods . ToArray ( ) ;
AllowedMods = item . AllowedMods . ToArray ( ) ;
}
2022-02-15 22:33:26 +08:00
public void MarkInvalid ( ) = > valid . Value = false ;
2021-12-28 15:37:16 +08:00
#region Newtonsoft . Json implicit ShouldSerialize ( ) methods
// The properties in this region are used implicitly by Newtonsoft.Json to not serialise certain fields in some cases.
// They rely on being named exactly the same as the corresponding fields (casing included) and as such should NOT be renamed
// unless the fields are also renamed.
[UsedImplicitly]
2018-12-17 13:45:06 +08:00
public bool ShouldSerializeID ( ) = > false ;
2021-12-28 15:37:16 +08:00
// ReSharper disable once IdentifierTypo
[UsedImplicitly]
2021-12-28 15:31:27 +08:00
public bool ShouldSerializeapiBeatmap ( ) = > false ;
2020-02-13 17:48:28 +08:00
2021-12-28 15:37:16 +08:00
#endregion
2022-04-01 16:06:37 +08:00
public PlaylistItem With ( Optional < IBeatmapInfo > beatmap = default , Optional < ushort? > playlistOrder = default ) = > new PlaylistItem ( beatmap . GetOr ( Beatmap ) )
2022-02-15 22:33:26 +08:00
{
ID = ID ,
OwnerID = OwnerID ,
RulesetID = RulesetID ,
Expired = Expired ,
2022-04-01 16:06:37 +08:00
PlaylistOrder = playlistOrder . GetOr ( PlaylistOrder ) ,
2022-02-15 22:33:26 +08:00
PlayedAt = PlayedAt ,
AllowedMods = AllowedMods ,
RequiredMods = RequiredMods ,
valid = { Value = Valid . Value } ,
} ;
public bool Equals ( PlaylistItem ? other )
2021-10-29 15:23:10 +08:00
= > ID = = other ? . ID
2022-02-15 22:33:26 +08:00
& & Beatmap . OnlineID = = other . Beatmap . OnlineID
2021-10-29 15:23:10 +08:00
& & RulesetID = = other . RulesetID
& & Expired = = other . Expired
2022-04-01 16:06:37 +08:00
& & PlaylistOrder = = other . PlaylistOrder
2022-02-15 15:01:14 +08:00
& & AllowedMods . SequenceEqual ( other . AllowedMods )
& & RequiredMods . SequenceEqual ( other . RequiredMods ) ;
2018-12-17 13:45:06 +08:00
}
}