diff --git a/DysonNetwork.Sphere/Chat/ChatService.cs b/DysonNetwork.Sphere/Chat/ChatService.cs
index 6a3451d..844a129 100644
--- a/DysonNetwork.Sphere/Chat/ChatService.cs
+++ b/DysonNetwork.Sphere/Chat/ChatService.cs
@@ -69,7 +69,8 @@ public partial class ChatService(
dbMessage,
dbMessage.Sender,
dbMessage.ChatRoom,
- WebSocketPacketType.MessageUpdate
+ WebSocketPacketType.MessageUpdate,
+ notify: false
);
}
}
@@ -87,8 +88,7 @@ public partial class ChatService(
/// The message to process
/// The web reader service
/// The message with link previews added to its meta data
- public async Task PreviewMessageLinkAsync(Message message,
- WebReader.WebReaderService? webReader = null)
+ public async Task PreviewMessageLinkAsync(Message message, WebReaderService? webReader = null)
{
if (string.IsNullOrEmpty(message.Content))
return message;
@@ -110,8 +110,7 @@ public partial class ChatService(
}
var embeds = (List>)message.Meta["embeds"];
- webReader ??= scopeFactory.CreateScope().ServiceProvider
- .GetRequiredService();
+ webReader ??= scopeFactory.CreateScope().ServiceProvider.GetRequiredService();
// Process up to 3 links to avoid excessive processing
var processedLinks = 0;
@@ -195,7 +194,8 @@ public partial class ChatService(
Message message,
ChatMember sender,
ChatRoom room,
- string type = WebSocketPacketType.MessageNew
+ string type = WebSocketPacketType.MessageNew,
+ bool notify = true
)
{
message.Sender = sender;
@@ -205,11 +205,29 @@ public partial class ChatService(
var scopedNty = scope.ServiceProvider.GetRequiredService();
var scopedCrs = scope.ServiceProvider.GetRequiredService();
+ 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" :
room.Realm is not null ? $"{room.Name}, {room.Realm.Name}" : room.Name;
- var members = await scopedCrs.ListRoomMembers(room.Id);
-
if (sender.Account is null)
sender = await scopedCrs.LoadMemberAccount(sender);
if (sender.Account is null)
@@ -273,18 +291,6 @@ public partial class ChatService(
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 accountsToNotify = [];
foreach (
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 (messagesNeedingSenders.Count <= 0)
{
- var latestTimestamp = changes.Count > 0
+ var latestTimestamp = changes.Count > 0
? changes.Max(c => c.Timestamp)
: SystemClock.Instance.GetCurrentInstant();
-
+
return new SyncResponse
{
Changes = changes,
CurrentTimestamp = latestTimestamp
};
}
-
+
// Load member accounts for messages that need them
var changesMembers = messagesNeedingSenders
.Select(m => m.Sender)
.DistinctBy(x => x.Id)
.ToList();
-
+
changesMembers = await crs.LoadMemberAccounts(changesMembers);
// 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
- var latestChangeTimestamp = changes.Count > 0
+ var latestChangeTimestamp = changes.Count > 0
? changes.Max(c => c.Timestamp)
: SystemClock.Instance.GetCurrentInstant();
-
+
return new SyncResponse
{
Changes = changes,