fix: source synced conversations from session database

This commit is contained in:
2026-09-22 10:11:55 +08:00
parent 72e040546a
commit 4f4e5835f9
4 changed files with 189 additions and 10 deletions
@@ -51,18 +51,19 @@ public sealed class DatabaseMessageSyncCollector : IRemoteDataCollector
var chatIds = chatScopes.Select(scope => scope.ChatId).Distinct(StringComparer.Ordinal).ToArray();
var page = await WechatMessageDbReader.ReadIncrementalAsync(
account.AccountRootPath, account.Databases, chatIds, cursors, perChatLimit, cancellationToken, overlapRows).ConfigureAwait(false);
var directory = await WechatSessionDbReader.ReadAuthorizedAsync(account, chatScopes, cancellationToken).ConfigureAwait(false);
var scopeByChat = chatScopes
.GroupBy(scope => scope.ChatId, StringComparer.Ordinal)
.ToDictionary(group => group.Key, group => group.First(), StringComparer.Ordinal);
var observedAt = DateTimeOffset.UtcNow;
var conversations = chatScopes.Select(scope => new RemoteSyncConversation(
scope.ChatId,
scope.ChatType,
scope.ChatId,
null,
"authorized-db-scope",
var conversations = directory.Conversations.Select(entry => new RemoteSyncConversation(
entry.ChatId,
entry.ChatType,
entry.Title,
entry.LastActivityAt,
"session/session.db/SessionTable",
observedAt,
"observed")).ToArray();
entry.DirectoryState)).ToArray();
var messages = page.Messages.Select(message =>
{
var scope = scopeByChat.GetValueOrDefault(message.ChatId)
@@ -85,7 +86,18 @@ public sealed class DatabaseMessageSyncCollector : IRemoteDataCollector
account.WechatVersion ?? "unknown",
HashMessage(messageId, text, message.Timestamp));
}).ToArray();
return new RemoteDataCollection(sourceGeneration, page.NextCursors, conversations, messages, page.IsComplete, page.NewMessageCount > 0, page.UnavailableDatabases);
var nextCursors = new Dictionary<string, long>(page.NextCursors, StringComparer.Ordinal)
{
[WechatSessionDbReader.DirectoryCursorKey] = directory.DirectoryCursor
};
var directoryChanged = directory.DirectoryCursor != cursors.GetValueOrDefault(WechatSessionDbReader.DirectoryCursorKey);
var unavailable = page.UnavailableDatabases
.Concat(directory.UnavailableDatabases)
.Distinct(StringComparer.OrdinalIgnoreCase)
.OrderBy(item => item, StringComparer.OrdinalIgnoreCase)
.ToArray();
return new RemoteDataCollection(sourceGeneration, nextCursors, conversations, messages,
page.IsComplete && directory.IsComplete, page.NewMessageCount > 0 || directoryChanged, unavailable);
}
private static string HashMessage(string messageId, string text, DateTimeOffset sourceTime)