🐛 Fix chat service duplicate notifying

This commit is contained in:
2025-08-26 00:15:39 +08:00
parent d299c32e35
commit aec01b117d

View File

@@ -69,7 +69,8 @@ public partial class ChatService(
dbMessage, dbMessage,
dbMessage.Sender, dbMessage.Sender,
dbMessage.ChatRoom, dbMessage.ChatRoom,
WebSocketPacketType.MessageUpdate WebSocketPacketType.MessageUpdate,
notify: false
); );
} }
} }
@@ -87,8 +88,7 @@ public partial class ChatService(
/// <param name="message">The message to process</param> /// <param name="message">The message to process</param>
/// <param name="webReader">The web reader service</param> /// <param name="webReader">The web reader service</param>
/// <returns>The message with link previews added to its meta data</returns> /// <returns>The message with link previews added to its meta data</returns>
public async Task<Message> PreviewMessageLinkAsync(Message message, public async Task<Message> PreviewMessageLinkAsync(Message message, WebReaderService? webReader = null)
WebReader.WebReaderService? webReader = null)
{ {
if (string.IsNullOrEmpty(message.Content)) if (string.IsNullOrEmpty(message.Content))
return message; return message;
@@ -110,8 +110,7 @@ public partial class ChatService(
} }
var embeds = (List<Dictionary<string, object>>)message.Meta["embeds"]; var embeds = (List<Dictionary<string, object>>)message.Meta["embeds"];
webReader ??= scopeFactory.CreateScope().ServiceProvider webReader ??= scopeFactory.CreateScope().ServiceProvider.GetRequiredService<WebReaderService>();
.GetRequiredService<WebReader.WebReaderService>();
// Process up to 3 links to avoid excessive processing // Process up to 3 links to avoid excessive processing
var processedLinks = 0; var processedLinks = 0;
@@ -195,7 +194,8 @@ public partial class ChatService(
Message message, Message message,
ChatMember sender, ChatMember sender,
ChatRoom room, ChatRoom room,
string type = WebSocketPacketType.MessageNew string type = WebSocketPacketType.MessageNew,
bool notify = true
) )
{ {
message.Sender = sender; message.Sender = sender;
@@ -205,11 +205,29 @@ public partial class ChatService(
var scopedNty = scope.ServiceProvider.GetRequiredService<PusherService.PusherServiceClient>(); var scopedNty = scope.ServiceProvider.GetRequiredService<PusherService.PusherServiceClient>();
var scopedCrs = scope.ServiceProvider.GetRequiredService<ChatRoomService>(); var scopedCrs = scope.ServiceProvider.GetRequiredService<ChatRoomService>();
var members = await scopedCrs.ListRoomMembers(room.Id);
var request = new PushWebSocketPacketToUsersRequest
{
Packet = new WebSocketPacket
{
Type = type,
Data = GrpcTypeHelper.ConvertObjectToByteString(message),
},
};
request.UserIds.AddRange(members.Select(a => a.Account).Where(a => a is not null)
.Select(a => a!.Id.ToString()));
await scopedNty.PushWebSocketPacketToUsersAsync(request);
if (!notify)
{
logger.LogInformation($"Delivered message to {request.UserIds.Count} accounts.");
return;
}
var roomSubject = room is { Type: ChatRoomType.DirectMessage, Name: null } ? "DM" : var roomSubject = room is { Type: ChatRoomType.DirectMessage, Name: null } ? "DM" :
room.Realm is not null ? $"{room.Name}, {room.Realm.Name}" : room.Name; room.Realm is not null ? $"{room.Name}, {room.Realm.Name}" : room.Name;
var members = await scopedCrs.ListRoomMembers(room.Id);
if (sender.Account is null) if (sender.Account is null)
sender = await scopedCrs.LoadMemberAccount(sender); sender = await scopedCrs.LoadMemberAccount(sender);
if (sender.Account is null) if (sender.Account is null)
@@ -273,18 +291,6 @@ public partial class ChatService(
var now = SystemClock.Instance.GetCurrentInstant(); var now = SystemClock.Instance.GetCurrentInstant();
var request = new PushWebSocketPacketToUsersRequest
{
Packet = new WebSocketPacket
{
Type = type,
Data = GrpcTypeHelper.ConvertObjectToByteString(message),
},
};
request.UserIds.AddRange(members.Select(a => a.Account).Where(a => a is not null)
.Select(a => a!.Id.ToString()));
await scopedNty.PushWebSocketPacketToUsersAsync(request);
List<Account> accountsToNotify = []; List<Account> accountsToNotify = [];
foreach ( foreach (
var member in members var member in members