// 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.Threading.Tasks; using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Game.Online.API; using osu.Game.Online.Metadata; using osu.Game.Users; namespace osu.Game.Tests.Visual.Metadata { public partial class TestMetadataClient : MetadataClient { public override IBindable IsConnected => isConnected; private readonly BindableBool isConnected = new BindableBool(true); public override IBindable IsWatchingUserPresence => isWatchingUserPresence; private readonly BindableBool isWatchingUserPresence = new BindableBool(); public override UserPresence LocalUserState => localUserState; private UserPresence localUserState; public override IBindableDictionary UserStates => userStates; private readonly BindableDictionary userStates = new BindableDictionary(); public override IBindableDictionary FriendStates => friendStates; private readonly BindableDictionary friendStates = new BindableDictionary(); public override Bindable DailyChallengeInfo => dailyChallengeInfo; private readonly Bindable dailyChallengeInfo = new Bindable(); [Resolved] private IAPIProvider api { get; set; } = null!; public override Task BeginWatchingUserPresence() { isWatchingUserPresence.Value = true; return Task.CompletedTask; } public override Task EndWatchingUserPresence() { isWatchingUserPresence.Value = false; return Task.CompletedTask; } public override Task UpdateActivity(UserActivity? activity) { if (isWatchingUserPresence.Value) { userStates.TryGetValue(api.LocalUser.Value.Id, out var localUserPresence); localUserPresence = localUserPresence with { Activity = activity }; userStates[api.LocalUser.Value.Id] = localUserPresence; } return Task.CompletedTask; } public override Task UpdateStatus(UserStatus? status) { if (isWatchingUserPresence.Value) { userStates.TryGetValue(api.LocalUser.Value.Id, out var localUserPresence); localUserPresence = localUserPresence with { Status = status }; userStates[api.LocalUser.Value.Id] = localUserPresence; } return Task.CompletedTask; } public override Task UserPresenceUpdated(int userId, UserPresence? presence) { if (isWatchingUserPresence.Value) { if (presence?.Status != null) { if (userId == api.LocalUser.Value.OnlineID) localUserState = presence.Value; else userStates[userId] = presence.Value; } else { if (userId == api.LocalUser.Value.OnlineID) localUserState = default; else userStates.Remove(userId); } } return Task.CompletedTask; } public override Task FriendPresenceUpdated(int userId, UserPresence? presence) { if (presence.HasValue) friendStates[userId] = presence.Value; else friendStates.Remove(userId); return Task.CompletedTask; } public override Task GetChangesSince(int queueId) => Task.FromResult(new BeatmapUpdates(Array.Empty(), queueId)); public override Task BeatmapSetsUpdated(BeatmapUpdates updates) => Task.CompletedTask; public override Task DailyChallengeUpdated(DailyChallengeInfo? info) { dailyChallengeInfo.Value = info; return Task.CompletedTask; } public override Task BeginWatchingMultiplayerRoom(long id) { var stats = new MultiplayerPlaylistItemStats[MultiplayerPlaylistItemStats.TOTAL_SCORE_DISTRIBUTION_BINS]; for (int i = 0; i < stats.Length; i++) stats[i] = new MultiplayerPlaylistItemStats { PlaylistItemID = i }; return Task.FromResult(stats); } public override Task EndWatchingMultiplayerRoom(long id) => Task.CompletedTask; public void Disconnect() { isConnected.Value = false; dailyChallengeInfo.Value = null; } public void Reconnect() { isConnected.Value = true; } } }