⚡ Optimize typing indicator
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user