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
@@ -59,6 +59,40 @@ public static class WechatContactDbReader
return WechatContactQuery.Page(contacts, limit, offset);
}
public static async Task<IReadOnlyDictionary<string, string>> ReadDisplayNamesAsync(
AccountKeySet account, IReadOnlyList<string> usernames, CancellationToken cancellationToken = default)
{
ArgumentNullException.ThrowIfNull(account);
ArgumentNullException.ThrowIfNull(usernames);
var distinct = usernames.Where(username => !string.IsNullOrWhiteSpace(username))
.Distinct(StringComparer.Ordinal).ToArray();
if (distinct.Length == 0) return new Dictionary<string, string>(StringComparer.Ordinal);
var database = RequireContactDatabase(account);
var result = new Dictionary<string, string>(StringComparer.Ordinal);
var path = ContactDatabasePath(account);
foreach (var chunk in distinct.Chunk(400))
{
cancellationToken.ThrowIfCancellationRequested();
var placeholders = string.Join(", ", chunk.Select((_, index) => $"$p{index}"));
var parameters = chunk.Select((username, index) =>
new KeyValuePair<string, object?>($"$p{index}", username)).ToArray();
var rows = await SqlCipherDatabaseReader.QueryRowsAsync(path, database.EncKey,
$"SELECT username, nick_name, remark FROM contact WHERE username IN ({placeholders});",
parameters, cancellationToken).ConfigureAwait(false);
foreach (var row in rows)
{
var username = row.GetValueOrDefault("username") as string;
if (string.IsNullOrWhiteSpace(username)) continue;
var remark = row.GetValueOrDefault("remark") as string;
var nickname = row.GetValueOrDefault("nick_name") as string;
var displayName = !string.IsNullOrWhiteSpace(remark) ? remark : nickname;
if (!string.IsNullOrWhiteSpace(displayName)) result[username] = displayName;
}
}
return result;
}
public static async Task<WechatGroupMemberPage> ReadGroupMembersPageAsync(AccountKeySet account, string group,
int limit = 500, int offset = 0, CancellationToken cancellationToken = default)
{