56 lines
1.2 KiB
Go
56 lines
1.2 KiB
Go
package models
|
||
|
||
import "strings"
|
||
|
||
func qqNumericLocalPart(email string) string {
|
||
e := strings.TrimSpace(strings.ToLower(email))
|
||
if e == "" {
|
||
return ""
|
||
}
|
||
at := strings.LastIndex(e, "@")
|
||
if at <= 0 || at >= len(e)-1 {
|
||
return ""
|
||
}
|
||
local, domain := e[:at], e[at+1:]
|
||
if domain != "qq.com" {
|
||
return ""
|
||
}
|
||
if local == "" {
|
||
return ""
|
||
}
|
||
for _, r := range local {
|
||
if r < '0' || r > '9' {
|
||
return ""
|
||
}
|
||
}
|
||
return local
|
||
}
|
||
|
||
func firstQQUINFromRecord(u UserRecord) string {
|
||
if q := qqNumericLocalPart(u.Email); q != "" {
|
||
return q
|
||
}
|
||
for _, em := range u.SecondaryEmails {
|
||
if q := qqNumericLocalPart(em); q != "" {
|
||
return q
|
||
}
|
||
}
|
||
return ""
|
||
}
|
||
|
||
func qqAvatarHeadimgURL(uin string) string {
|
||
return "https://q.qlogo.cn/headimg_dl?dst_uin=" + uin + "&spec=640&img_type=jpg"
|
||
}
|
||
|
||
// ResolvedAvatarURL 返回用户自选头像;若未设置但主邮箱或辅助邮箱为「纯数字 @qq.com」,
|
||
// 则返回 QQ 头像 CDN 地址(与手动填写该链接等价,不入库)。
|
||
func (u UserRecord) ResolvedAvatarURL() string {
|
||
if s := strings.TrimSpace(u.AvatarURL); s != "" {
|
||
return s
|
||
}
|
||
if uin := firstQQUINFromRecord(u); uin != "" {
|
||
return qqAvatarHeadimgURL(uin)
|
||
}
|
||
return ""
|
||
}
|