62 lines
2.3 KiB
JavaScript
62 lines
2.3 KiB
JavaScript
/** 纯数字 @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`;
|
||
}
|
||
|
||
/** 用于 <img src>:自选链接优先,否则 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 "未填写";
|
||
}
|