/** 纯数字 @qq.com(大小写不敏感)→ QQ 号码,用于与后端一致的展示逻辑 */ export function qqUinFromEmail(email) { if (!email || typeof email !== "string") return ""; const e = email.trim().toLowerCase(); const at = e.lastIndexOf("@"); if (at <= 0 || at >= e.length - 1) return ""; const local = e.slice(0, at); const domain = e.slice(at + 1); if (domain !== "qq.com" || !local) return ""; if (!/^\d+$/.test(local)) return ""; return local; } export function qqUinFromUser(user) { if (!user || typeof user !== "object") return ""; const primary = qqUinFromEmail(user.email); if (primary) return primary; for (const em of user.secondaryEmails || []) { const u = qqUinFromEmail(em); if (u) return u; } return ""; } /** 与后端 ResolvedAvatarURL 一致的三档 QQ CDN(依次作为 img onError 回退) */ export function qqAvatarUrlCandidates(uin) { if (!uin) return []; return [ `https://q.qlogo.cn/headimg_dl?dst_uin=${encodeURIComponent(uin)}&spec=640&img_type=jpg`, `https://q1.qlogo.cn/g?b=qq&nk=${encodeURIComponent(uin)}&s=100`, `https://q2.qlogo.cn/headimg_dl?dst_uin=${encodeURIComponent(uin)}&spec=100` ]; } export function placeholderAvatarUrl(size) { return `https://dummyimage.com/${size}x${size}/ddd/fff&text=Avatar`; } /** 用于 :自选链接优先,否则 QQ 邮箱推断的多 CDN,否则 API 下发的 avatarUrl,最后占位图 */ export function avatarImageCandidates(user, placeholderSize = 120) { const custom = (user?.customAvatarUrl != null && String(user.customAvatarUrl).trim()) || ""; if (custom) return [custom]; const uin = qqUinFromUser(user); if (uin) return qqAvatarUrlCandidates(uin); const resolved = (user?.avatarUrl != null && String(user.avatarUrl).trim()) || ""; if (resolved) return [resolved]; return [placeholderAvatarUrl(placeholderSize)]; } export function resolveDisplayAvatarUrl(user, placeholderSize = 120) { const c = avatarImageCandidates(user, placeholderSize); return c[0] || placeholderAvatarUrl(placeholderSize); } export function avatarStatusLabel(user) { const custom = (user?.customAvatarUrl != null && String(user.customAvatarUrl).trim()) || ""; if (custom) return "已设置"; if (qqUinFromUser(user)) return "QQ 邮箱头像"; return "未填写"; }