diff --git a/electron/main/worker/query/basic.ts b/electron/main/worker/query/basic.ts index 8d87a2b..ad07aae 100644 --- a/electron/main/worker/query/basic.ts +++ b/electron/main/worker/query/basic.ts @@ -323,6 +323,46 @@ interface DbMeta { group_avatar: string | null } +/** + * 获取私聊对方成员的头像 + * 逻辑参考 private-chat/index.vue 的 otherMemberAvatar + */ +function getPrivateChatMemberAvatar( + db: Database.Database, + sessionName: string, + ownerId: string | null +): string | null { + // 获取所有非系统消息成员(按消息数排序) + const members = db + .prepare( + `SELECT + m.platform_id as platformId, + COALESCE(m.group_nickname, m.account_name, m.platform_id) as name, + m.avatar + FROM member m + WHERE COALESCE(m.account_name, '') != '系统消息' + ORDER BY (SELECT COUNT(*) FROM message WHERE sender_id = m.id) DESC` + ) + .all() as Array<{ platformId: string; name: string; avatar: string | null }> + + if (members.length === 0) return null + + // 1. 优先排除 ownerId,找到另一成员的头像 + if (ownerId) { + const other = members.find((m) => m.platformId !== ownerId) + if (other?.avatar) return other.avatar + } + + // 2. 尝试匹配会话名称(私聊名称通常是对方昵称) + const sameName = members.find((m) => m.name === sessionName) + if (sameName?.avatar) return sameName.avatar + + // 3. 如果只有两个成员且有 ownerId,取另一个(即使没有头像也返回 null) + // 如果没有 ownerId,返回第一个有头像的成员 + const firstWithAvatar = members.find((m) => m.avatar) + return firstWithAvatar?.avatar || null +} + /** * 获取所有会话列表 */ @@ -366,6 +406,12 @@ export function getAllSessions(): any[] { .get() as { count: number } ).count + // 私聊:获取对方成员头像 + let memberAvatar: string | null = null + if (meta.type === 'private') { + memberAvatar = getPrivateChatMemberAvatar(db, meta.name, meta.owner_id) + } + sessions.push({ id: sessionId, name: meta.name, @@ -378,6 +424,7 @@ export function getAllSessions(): any[] { groupId: meta.group_id || null, groupAvatar: meta.group_avatar || null, ownerId: meta.owner_id || null, + memberAvatar, // 私聊对方头像 }) } diff --git a/src/components/common/Sidebar.vue b/src/components/common/Sidebar.vue index 2c681c2..2b8b3a0 100644 --- a/src/components/common/Sidebar.vue +++ b/src/components/common/Sidebar.vue @@ -158,6 +158,14 @@ function getSessionAvatarText(session: AnalysisSession): string { return name.length <= 2 ? name : name.slice(0, 2) } } + +// 获取会话头像 URL(群聊用 groupAvatar,私聊用 memberAvatar) +function getSessionAvatar(session: AnalysisSession): string | null { + if (isPrivateChat(session)) { + return session.memberAvatar || null + } + return session.groupAvatar || null +}