@@ -136,8 +136,13 @@ public async Task UpdateActivity(UserActivity? activity)
136
136
137
137
usage . Item . UserActivity = activity ;
138
138
139
- if ( shouldBroadcastPresenceToOtherUsers ( usage . Item ) )
140
- await broadcastUserPresenceUpdate ( usage . Item . UserId , usage . Item . ToUserPresence ( ) ) ;
139
+ await Task . WhenAll
140
+ (
141
+ shouldBroadcastPresenceToOtherUsers ( usage . Item )
142
+ ? broadcastUserPresenceUpdate ( usage . Item . UserId , usage . Item . ToUserPresence ( ) )
143
+ : Task . CompletedTask ,
144
+ Clients . Caller . UserPresenceUpdated ( usage . Item . UserId , usage . Item . ToUserPresence ( ) )
145
+ ) ;
141
146
}
142
147
}
143
148
@@ -147,18 +152,20 @@ public async Task UpdateStatus(UserStatus? status)
147
152
{
148
153
Debug . Assert ( usage . Item != null ) ;
149
154
150
- if ( usage . Item . UserStatus != status )
151
- {
152
- usage . Item . UserStatus = status ;
155
+ if ( usage . Item . UserStatus == status )
156
+ return ;
153
157
154
- if ( status == UserStatus . Offline )
155
- {
156
- // special case of users that already broadcast that they are online switching to "appear offline".
157
- await broadcastUserPresenceUpdate ( usage . Item . UserId , null ) ;
158
- }
159
- else
160
- await broadcastUserPresenceUpdate ( usage . Item . UserId , usage . Item . ToUserPresence ( ) ) ;
161
- }
158
+ usage . Item . UserStatus = status ;
159
+
160
+ await Task . WhenAll
161
+ (
162
+ // Of note, we always send status updates to other users.
163
+ //
164
+ // This is a single special case where we don't check against `shouldBroadcastPresentToOtherUsers` because
165
+ // it is required to tell other clients that "we went offline" in the "appears offline" scenario.
166
+ broadcastUserPresenceUpdate ( usage . Item . UserId , usage . Item . ToUserPresence ( ) ) ,
167
+ Clients . Caller . UserPresenceUpdated ( usage . Item . UserId , usage . Item . ToUserPresence ( ) )
168
+ ) ;
162
169
}
163
170
}
164
171
0 commit comments