Optimize typing indicator

This commit is contained in:
2025-11-16 20:41:34 +08:00
parent aace3b48b1
commit 6252988390
2 changed files with 28 additions and 11 deletions

View File

@@ -193,7 +193,18 @@ public class ChatRoomService(
public async Task<List<Guid>> GetSubscribedMembers(Guid roomId) public async Task<List<Guid>> GetSubscribedMembers(Guid roomId)
{ {
var group = $"chatroom:subscribers:{roomId}"; var group = $"chatroom:subscribers:{roomId}";
var keys = await cache.GetGroupKeysAsync(group); var keys = (await cache.GetGroupKeysAsync(group)).ToList();
return keys.Select(k => Guid.Parse(k.Split(':').Last())).ToList();
var memberIds = new List<Guid>(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;
} }
} }

View File

@@ -266,20 +266,26 @@ public class BroadcastEventHandler(
{ {
room_id = sender.ChatRoomId, room_id = sender.ChatRoomId,
sender_id = sender.Id, sender_id = sender.Id,
sender = sender sender
} }
}; };
// Broadcast typing indicator to other room members // Broadcast typing indicator to subscribed room members only
var otherMembers = (await crs.ListRoomMembers(requestData.ChatRoomId)) var subscribedMemberIds = await crs.GetSubscribedMembers(requestData.ChatRoomId);
.Where(m => m.AccountId != evt.AccountId) 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()) .Select(m => m.AccountId.ToString())
.ToList(); .ToList();
var respRequest = new PushWebSocketPacketToUsersRequest() { Packet = responsePacket.ToProtoValue() }; if (subscribedMembers.Count > 0)
respRequest.UserIds.AddRange(otherMembers); {
var respRequest = new PushWebSocketPacketToUsersRequest { Packet = responsePacket.ToProtoValue() };
await pusher.PushWebSocketPacketToUsersAsync(respRequest); respRequest.UserIds.AddRange(subscribedMembers);
await pusher.PushWebSocketPacketToUsersAsync(respRequest);
}
} }
private async Task HandleMessageSubscribe(WebSocketPacketEvent evt, WebSocketPacket packet) private async Task HandleMessageSubscribe(WebSocketPacketEvent evt, WebSocketPacket packet)