diff --git a/DysonNetwork.Sphere/Chat/ChatRoomService.cs b/DysonNetwork.Sphere/Chat/ChatRoomService.cs index 3df03c9..bfd4199 100644 --- a/DysonNetwork.Sphere/Chat/ChatRoomService.cs +++ b/DysonNetwork.Sphere/Chat/ChatRoomService.cs @@ -193,7 +193,18 @@ public class ChatRoomService( public async Task> GetSubscribedMembers(Guid roomId) { var group = $"chatroom:subscribers:{roomId}"; - var keys = await cache.GetGroupKeysAsync(group); - return keys.Select(k => Guid.Parse(k.Split(':').Last())).ToList(); + var keys = (await cache.GetGroupKeysAsync(group)).ToList(); + + var memberIds = new List(keys.Count); + foreach (var key in keys) + { + var lastColonIndex = key.LastIndexOf(':'); + if (lastColonIndex >= 0 && Guid.TryParse(key.AsSpan(lastColonIndex + 1), out var memberId)) + { + memberIds.Add(memberId); + } + } + + return memberIds; } -} \ No newline at end of file +} diff --git a/DysonNetwork.Sphere/Startup/BroadcastEventHandler.cs b/DysonNetwork.Sphere/Startup/BroadcastEventHandler.cs index c0d940c..d70998d 100644 --- a/DysonNetwork.Sphere/Startup/BroadcastEventHandler.cs +++ b/DysonNetwork.Sphere/Startup/BroadcastEventHandler.cs @@ -266,20 +266,26 @@ public class BroadcastEventHandler( { room_id = sender.ChatRoomId, sender_id = sender.Id, - sender = sender + sender } }; - // Broadcast typing indicator to other room members - var otherMembers = (await crs.ListRoomMembers(requestData.ChatRoomId)) - .Where(m => m.AccountId != evt.AccountId) + // Broadcast typing indicator to subscribed room members only + var subscribedMemberIds = await crs.GetSubscribedMembers(requestData.ChatRoomId); + var roomMembers = await crs.ListRoomMembers(requestData.ChatRoomId); + + // Filter to subscribed members excluding the current user + var subscribedMembers = roomMembers + .Where(m => subscribedMemberIds.Contains(m.Id) && m.AccountId != evt.AccountId) .Select(m => m.AccountId.ToString()) .ToList(); - var respRequest = new PushWebSocketPacketToUsersRequest() { Packet = responsePacket.ToProtoValue() }; - respRequest.UserIds.AddRange(otherMembers); - - await pusher.PushWebSocketPacketToUsersAsync(respRequest); + if (subscribedMembers.Count > 0) + { + var respRequest = new PushWebSocketPacketToUsersRequest { Packet = responsePacket.ToProtoValue() }; + respRequest.UserIds.AddRange(subscribedMembers); + await pusher.PushWebSocketPacketToUsersAsync(respRequest); + } } private async Task HandleMessageSubscribe(WebSocketPacketEvent evt, WebSocketPacket packet)