Skip to content

Commit 20108e3

Browse files
committed
Remove Status and Activity bindables from APIUser
As for the tests, I'm (ab)using the `IsOnline` state for the time being to restore functionality.
1 parent ad14720 commit 20108e3

File tree

11 files changed

+46
-84
lines changed

11 files changed

+46
-84
lines changed

osu.Desktop/DiscordRichPresence.cs

+4-10
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ internal partial class DiscordRichPresence : Component
5454
[Resolved]
5555
private OsuConfigManager config { get; set; } = null!;
5656

57-
private readonly IBindable<UserStatus?> status = new Bindable<UserStatus?>();
58-
private readonly IBindable<UserActivity> activity = new Bindable<UserActivity>();
57+
private readonly IBindable<UserStatus> status = new Bindable<UserStatus>();
58+
private readonly IBindable<UserActivity?> activity = new Bindable<UserActivity?>();
5959
private readonly Bindable<DiscordRichPresenceMode> privacyMode = new Bindable<DiscordRichPresenceMode>();
6060

6161
private readonly RichPresence presence = new RichPresence
@@ -108,14 +108,8 @@ protected override void LoadComplete()
108108
config.BindWith(OsuSetting.DiscordRichPresence, privacyMode);
109109

110110
user = api.LocalUser.GetBoundCopy();
111-
user.BindValueChanged(u =>
112-
{
113-
status.UnbindBindings();
114-
status.BindTo(u.NewValue.Status);
115-
116-
activity.UnbindBindings();
117-
activity.BindTo(u.NewValue.Activity);
118-
}, true);
111+
status.BindTo(api.Status);
112+
activity.BindTo(api.Activity);
119113

120114
ruleset.BindValueChanged(_ => schedulePresenceUpdate());
121115
status.BindValueChanged(_ => schedulePresenceUpdate());

osu.Game.Tests/Visual/Menus/TestSceneLoginOverlay.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public void TestLoginSuccess()
8989
AddStep("clear handler", () => dummyAPI.HandleRequest = null);
9090

9191
assertDropdownState(UserAction.Online);
92-
AddStep("change user state", () => dummyAPI.LocalUser.Value.Status.Value = UserStatus.DoNotDisturb);
92+
AddStep("change user state", () => dummyAPI.Status.Value = UserStatus.DoNotDisturb);
9393
assertDropdownState(UserAction.DoNotDisturb);
9494
}
9595

osu.Game.Tests/Visual/Online/TestSceneUserClickableAvatar.cs

+1-4
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,7 @@ private Drawable generateUser(string username, int id, CountryCode countryCode,
6262
CountryCode = countryCode,
6363
CoverUrl = cover,
6464
Colour = color ?? "000000",
65-
Status =
66-
{
67-
Value = UserStatus.Online
68-
},
65+
IsOnline = true
6966
};
7067

7168
return new ClickableAvatar(user, showPanel)

osu.Game.Tests/Visual/Online/TestSceneUserPanel.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public void SetUp() => Schedule(() =>
7676
Id = 3103765,
7777
CountryCode = CountryCode.JP,
7878
CoverUrl = @"https://assets.ppy.sh/user-cover-presets/1/df28696b58541a9e67f6755918951d542d93bdf1da41720fcca2fd2c1ea8cf51.jpeg",
79-
Status = { Value = UserStatus.Online }
79+
IsOnline = true
8080
}) { Width = 300 },
8181
boundPanel1 = new UserGridPanel(new APIUser
8282
{

osu.Game/Online/API/APIAccess.cs

+5-16
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ public partial class APIAccess : Component, IAPIProvider
6060

6161
public IBindable<APIUser> LocalUser => localUser;
6262
public IBindableList<APIRelation> Friends => friends;
63+
public Bindable<UserStatus> Status { get; } = new Bindable<UserStatus>(UserStatus.Online);
6364
public IBindable<UserActivity> Activity => activity;
6465

6566
public INotificationsClient NotificationsClient { get; }
@@ -73,7 +74,6 @@ public partial class APIAccess : Component, IAPIProvider
7374
private Bindable<UserActivity> activity { get; } = new Bindable<UserActivity>();
7475

7576
private Bindable<UserStatus?> configStatus { get; } = new Bindable<UserStatus?>();
76-
private Bindable<UserStatus?> localUserStatus { get; } = new Bindable<UserStatus?>();
7777

7878
protected bool HasLogin => authentication.Token.Value != null || (!string.IsNullOrEmpty(ProvidedUsername) && !string.IsNullOrEmpty(password));
7979

@@ -121,17 +121,6 @@ public APIAccess(OsuGameBase game, OsuConfigManager config, EndpointConfiguratio
121121
state.Value = APIState.Connecting;
122122
}
123123

124-
localUser.BindValueChanged(u =>
125-
{
126-
u.OldValue?.Activity.UnbindFrom(activity);
127-
u.NewValue.Activity.BindTo(activity);
128-
129-
u.OldValue?.Status.UnbindFrom(localUserStatus);
130-
u.NewValue.Status.BindTo(localUserStatus);
131-
}, true);
132-
133-
localUserStatus.BindTo(configStatus);
134-
135124
var thread = new Thread(run)
136125
{
137126
Name = "APIAccess",
@@ -342,9 +331,8 @@ private void attemptConnect()
342331
{
343332
Debug.Assert(ThreadSafety.IsUpdateThread);
344333

345-
me.Status.Value = configStatus.Value ?? UserStatus.Online;
346-
347334
localUser.Value = me;
335+
Status.Value = configStatus.Value ?? UserStatus.Online;
348336

349337
state.Value = me.SessionVerified ? APIState.Online : APIState.RequiresSecondFactorAuth;
350338
failureCount = 0;
@@ -381,9 +369,10 @@ private void setPlaceholderLocalUser()
381369

382370
localUser.Value = new APIUser
383371
{
384-
Username = ProvidedUsername,
385-
Status = { Value = configStatus.Value ?? UserStatus.Online }
372+
Username = ProvidedUsername
386373
};
374+
375+
Status.Value = configStatus.Value ?? UserStatus.Online;
387376
}
388377

389378
public void Perform(APIRequest request)

osu.Game/Online/API/DummyAPIAccess.cs

+4-11
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ public partial class DummyAPIAccess : Component, IAPIProvider
2828

2929
public BindableList<APIRelation> Friends { get; } = new BindableList<APIRelation>();
3030

31-
public Bindable<UserActivity> Activity { get; } = new Bindable<UserActivity>();
31+
public Bindable<UserStatus> Status { get; } = new Bindable<UserStatus>(UserStatus.Online);
32+
33+
public Bindable<UserActivity?> Activity { get; } = new Bindable<UserActivity?>();
3234

3335
public DummyNotificationsClient NotificationsClient { get; } = new DummyNotificationsClient();
3436
INotificationsClient IAPIProvider.NotificationsClient => NotificationsClient;
@@ -69,15 +71,6 @@ public partial class DummyAPIAccess : Component, IAPIProvider
6971
/// </summary>
7072
public IBindable<APIState> State => state;
7173

72-
public DummyAPIAccess()
73-
{
74-
LocalUser.BindValueChanged(u =>
75-
{
76-
u.OldValue?.Activity.UnbindFrom(Activity);
77-
u.NewValue.Activity.BindTo(Activity);
78-
}, true);
79-
}
80-
8174
public virtual void Queue(APIRequest request)
8275
{
8376
request.AttachAPI(this);
@@ -204,7 +197,7 @@ public void UpdateLocalFriends()
204197

205198
IBindable<APIUser> IAPIProvider.LocalUser => LocalUser;
206199
IBindableList<APIRelation> IAPIProvider.Friends => Friends;
207-
IBindable<UserActivity> IAPIProvider.Activity => Activity;
200+
IBindable<UserActivity?> IAPIProvider.Activity => Activity;
208201

209202
/// <summary>
210203
/// Skip 2FA requirement for next login.

osu.Game/Online/API/IAPIProvider.cs

+6-1
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,15 @@ public interface IAPIProvider
2424
/// </summary>
2525
IBindableList<APIRelation> Friends { get; }
2626

27+
/// <summary>
28+
/// The current user's status.
29+
/// </summary>
30+
Bindable<UserStatus> Status { get; }
31+
2732
/// <summary>
2833
/// The current user's activity.
2934
/// </summary>
30-
IBindable<UserActivity> Activity { get; }
35+
IBindable<UserActivity?> Activity { get; }
3136

3237
/// <summary>
3338
/// The language supplied by this provider to API requests.

osu.Game/Online/API/Requests/Responses/APIUser.cs

-5
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
using System.Linq;
99
using JetBrains.Annotations;
1010
using Newtonsoft.Json;
11-
using osu.Framework.Bindables;
1211
using osu.Game.Extensions;
1312
using osu.Game.Users;
1413

@@ -56,10 +55,6 @@ public CountryCode CountryCode
5655
set => countryCodeString = value.ToString();
5756
}
5857

59-
public readonly Bindable<UserStatus?> Status = new Bindable<UserStatus?>();
60-
61-
public readonly Bindable<UserActivity> Activity = new Bindable<UserActivity>();
62-
6358
[JsonProperty(@"profile_colour")]
6459
public string Colour;
6560

osu.Game/Online/Metadata/OnlineMetadataClient.cs

+8-9
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,9 @@ public partial class OnlineMetadataClient : MetadataClient
3737
private IHubClientConnector? connector;
3838
private Bindable<int> lastQueueId = null!;
3939
private IBindable<APIUser> localUser = null!;
40+
41+
private IBindable<UserStatus> userStatus = null!;
4042
private IBindable<UserActivity?> userActivity = null!;
41-
private IBindable<UserStatus?>? userStatus;
4243

4344
private HubConnection? connection => connector?.CurrentConnection;
4445

@@ -75,22 +76,20 @@ private void load(IAPIProvider api, OsuConfigManager config)
7576
lastQueueId = config.GetBindable<int>(OsuSetting.LastProcessedMetadataId);
7677

7778
localUser = api.LocalUser.GetBoundCopy();
79+
userStatus = api.Status.GetBoundCopy();
7880
userActivity = api.Activity.GetBoundCopy()!;
7981
}
8082

8183
protected override void LoadComplete()
8284
{
8385
base.LoadComplete();
84-
localUser.BindValueChanged(_ =>
86+
87+
userStatus.BindValueChanged(status =>
8588
{
8689
if (localUser.Value is not GuestUser)
87-
{
88-
userStatus = localUser.Value.Status.GetBoundCopy();
89-
userStatus.BindValueChanged(status => UpdateStatus(status.NewValue), true);
90-
}
91-
else
92-
userStatus = null;
90+
UpdateStatus(status.NewValue);
9391
}, true);
92+
9493
userActivity.BindValueChanged(activity =>
9594
{
9695
if (localUser.Value is not GuestUser)
@@ -117,7 +116,7 @@ private void isConnectedChanged(ValueChangedEvent<bool> connected)
117116
if (localUser.Value is not GuestUser)
118117
{
119118
UpdateActivity(userActivity.Value);
120-
UpdateStatus(userStatus?.Value);
119+
UpdateStatus(userStatus.Value);
121120
}
122121

123122
if (lastQueueId.Value >= 0)

osu.Game/Overlays/Dashboard/CurrentlyOnlineDisplay.cs

+11-12
Original file line numberDiff line numberDiff line change
@@ -140,15 +140,11 @@ private void onUserUpdated(object sender, NotifyDictionaryChangedEventArgs<int,
140140

141141
Schedule(() =>
142142
{
143-
// explicitly refetch the user's status.
144-
// things may have changed in between the time of scheduling and the time of actual execution.
145-
if (onlineUsers.TryGetValue(userId, out var updatedStatus))
143+
userFlow.Add(userPanels[userId] = createUserPanel(user).With(p =>
146144
{
147-
user.Activity.Value = updatedStatus.Activity;
148-
user.Status.Value = updatedStatus.Status;
149-
}
150-
151-
userFlow.Add(userPanels[userId] = createUserPanel(user));
145+
p.Status.Value = onlineUsers.GetValueOrDefault(userId).Status;
146+
p.Activity.Value = onlineUsers.GetValueOrDefault(userId).Activity;
147+
}));
152148
});
153149
});
154150
}
@@ -162,8 +158,8 @@ private void onUserUpdated(object sender, NotifyDictionaryChangedEventArgs<int,
162158
{
163159
if (userPanels.TryGetValue(kvp.Key, out var panel))
164160
{
165-
panel.User.Activity.Value = kvp.Value.Activity;
166-
panel.User.Status.Value = kvp.Value.Status;
161+
panel.Activity.Value = kvp.Value.Activity;
162+
panel.Status.Value = kvp.Value.Status;
167163
}
168164
}
169165

@@ -223,6 +219,9 @@ public partial class OnlineUserPanel : CompositeDrawable, IFilterable
223219
{
224220
public readonly APIUser User;
225221

222+
public readonly Bindable<UserStatus?> Status = new Bindable<UserStatus?>();
223+
public readonly Bindable<UserActivity> Activity = new Bindable<UserActivity>();
224+
226225
public BindableBool CanSpectate { get; } = new BindableBool();
227226

228227
public IEnumerable<LocalisableString> FilterTerms { get; }
@@ -271,8 +270,8 @@ private void load()
271270
Anchor = Anchor.TopCentre,
272271
Origin = Anchor.TopCentre,
273272
// this is SHOCKING
274-
Activity = { BindTarget = User.Activity },
275-
Status = { BindTarget = User.Status },
273+
Activity = { BindTarget = Activity },
274+
Status = { BindTarget = Status },
276275
},
277276
new PurpleRoundedButton
278277
{

osu.Game/Overlays/Login/LoginPanel.cs

+5-14
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
using osu.Game.Graphics.UserInterface;
1616
using osu.Game.Localisation;
1717
using osu.Game.Online.API;
18-
using osu.Game.Online.API.Requests.Responses;
1918
using osu.Game.Overlays.Settings;
2019
using osu.Game.Users;
2120
using osuTK;
@@ -38,9 +37,7 @@ public partial class LoginPanel : Container
3837
/// </summary>
3938
public Action? RequestHide;
4039

41-
private IBindable<APIUser> user = null!;
42-
private readonly Bindable<UserStatus?> status = new Bindable<UserStatus?>();
43-
40+
private readonly Bindable<UserStatus> status = new Bindable<UserStatus>();
4441
private readonly IBindable<APIState> apiState = new Bindable<APIState>();
4542

4643
[Resolved]
@@ -71,13 +68,7 @@ protected override void LoadComplete()
7168
apiState.BindTo(api.State);
7269
apiState.BindValueChanged(onlineStateChanged, true);
7370

74-
user = api.LocalUser.GetBoundCopy();
75-
user.BindValueChanged(u =>
76-
{
77-
status.UnbindBindings();
78-
status.BindTo(u.NewValue.Status);
79-
}, true);
80-
71+
status.BindTo(api.Status);
8172
status.BindValueChanged(e => updateDropdownCurrent(e.NewValue), true);
8273
}
8374

@@ -163,17 +154,17 @@ private void onlineStateChanged(ValueChangedEvent<APIState> state) => Schedule((
163154
switch (action.NewValue)
164155
{
165156
case UserAction.Online:
166-
api.LocalUser.Value.Status.Value = UserStatus.Online;
157+
status.Value = UserStatus.Online;
167158
dropdown.StatusColour = colours.Green;
168159
break;
169160

170161
case UserAction.DoNotDisturb:
171-
api.LocalUser.Value.Status.Value = UserStatus.DoNotDisturb;
162+
status.Value = UserStatus.DoNotDisturb;
172163
dropdown.StatusColour = colours.Red;
173164
break;
174165

175166
case UserAction.AppearOffline:
176-
api.LocalUser.Value.Status.Value = UserStatus.Offline;
167+
status.Value = UserStatus.Offline;
177168
dropdown.StatusColour = colours.Gray7;
178169
break;
179170

0 commit comments

Comments
 (0)