// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using osu.Game.Beatmaps; using osu.Game.Database; using osu.Game.Online.API.Requests.Responses; using osu.Game.Rulesets; using osu.Game.Scoring; using osu.Game.Users; #nullable enable namespace osu.Game.Extensions { public static class ModelExtensions { /// /// Returns a user-facing string representing the . /// /// /// /// Non-interface types without special handling will fall back to . /// /// /// Warning: This method is _purposefully_ not called GetDisplayTitle() like the others, because otherwise /// extension method type inference rules cause this method to call itself and cause a stack overflow. /// /// public static string GetDisplayString(this object? model) { string? result = null; switch (model) { case IBeatmapSetInfo beatmapSetInfo: result = beatmapSetInfo.Metadata?.GetDisplayTitle(); break; case IBeatmapInfo beatmapInfo: result = beatmapInfo.GetDisplayTitle(); break; case IBeatmapMetadataInfo metadataInfo: result = metadataInfo.GetDisplayTitle(); break; case IScoreInfo scoreInfo: result = scoreInfo.GetDisplayTitle(); break; case IRulesetInfo rulesetInfo: result = rulesetInfo.Name; break; case IUser user: result = user.Username; break; } // fallback in case none of the above happens to match. result ??= model?.ToString() ?? @"null"; return result; } /// /// Check whether the online ID of two s match. /// /// The instance to compare. /// The other instance to compare against. /// Whether online IDs match. If either instance is missing an online ID, this will return false. public static bool MatchesOnlineID(this IBeatmapSetInfo? instance, IBeatmapSetInfo? other) => matchesOnlineID(instance, other); /// /// Check whether the online ID of two s match. /// /// The instance to compare. /// The other instance to compare against. /// Whether online IDs match. If either instance is missing an online ID, this will return false. public static bool MatchesOnlineID(this IBeatmapInfo? instance, IBeatmapInfo? other) => matchesOnlineID(instance, other); /// /// Check whether the online ID of two s match. /// /// The instance to compare. /// The other instance to compare against. /// Whether online IDs match. If either instance is missing an online ID, this will return false. public static bool MatchesOnlineID(this IRulesetInfo? instance, IRulesetInfo? other) => matchesOnlineID(instance, other); /// /// Check whether the online ID of two s match. /// /// The instance to compare. /// The other instance to compare against. /// Whether online IDs match. If either instance is missing an online ID, this will return false. public static bool MatchesOnlineID(this APIUser? instance, APIUser? other) => matchesOnlineID(instance, other); private static bool matchesOnlineID(this IHasOnlineID? instance, IHasOnlineID? other) { if (instance == null || other == null) return false; if (instance.OnlineID < 0 || other.OnlineID < 0) return false; return instance.OnlineID.Equals(other.OnlineID); } private static bool matchesOnlineID(this IHasOnlineID? instance, IHasOnlineID? other) { if (instance == null || other == null) return false; if (instance.OnlineID < 0 || other.OnlineID < 0) return false; return instance.OnlineID.Equals(other.OnlineID); } } }