🐛 Fix chat service duplicate notifying
This commit is contained in:
@@ -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
|
||||||
@@ -534,23 +540,23 @@ public partial class ChatService(
|
|||||||
// If no messages need senders, return with the latest timestamp from changes
|
// If no messages need senders, return with the latest timestamp from changes
|
||||||
if (messagesNeedingSenders.Count <= 0)
|
if (messagesNeedingSenders.Count <= 0)
|
||||||
{
|
{
|
||||||
var latestTimestamp = changes.Count > 0
|
var latestTimestamp = changes.Count > 0
|
||||||
? changes.Max(c => c.Timestamp)
|
? changes.Max(c => c.Timestamp)
|
||||||
: SystemClock.Instance.GetCurrentInstant();
|
: SystemClock.Instance.GetCurrentInstant();
|
||||||
|
|
||||||
return new SyncResponse
|
return new SyncResponse
|
||||||
{
|
{
|
||||||
Changes = changes,
|
Changes = changes,
|
||||||
CurrentTimestamp = latestTimestamp
|
CurrentTimestamp = latestTimestamp
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load member accounts for messages that need them
|
// Load member accounts for messages that need them
|
||||||
var changesMembers = messagesNeedingSenders
|
var changesMembers = messagesNeedingSenders
|
||||||
.Select(m => m.Sender)
|
.Select(m => m.Sender)
|
||||||
.DistinctBy(x => x.Id)
|
.DistinctBy(x => x.Id)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
changesMembers = await crs.LoadMemberAccounts(changesMembers);
|
changesMembers = await crs.LoadMemberAccounts(changesMembers);
|
||||||
|
|
||||||
// Update sender information for messages that have it
|
// Update sender information for messages that have it
|
||||||
@@ -562,10 +568,10 @@ public partial class ChatService(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Use the latest timestamp from changes, or current time if no changes
|
// Use the latest timestamp from changes, or current time if no changes
|
||||||
var latestChangeTimestamp = changes.Count > 0
|
var latestChangeTimestamp = changes.Count > 0
|
||||||
? changes.Max(c => c.Timestamp)
|
? changes.Max(c => c.Timestamp)
|
||||||
: SystemClock.Instance.GetCurrentInstant();
|
: SystemClock.Instance.GetCurrentInstant();
|
||||||
|
|
||||||
return new SyncResponse
|
return new SyncResponse
|
||||||
{
|
{
|
||||||
Changes = changes,
|
Changes = changes,
|
||||||
|
Reference in New Issue
Block a user