whoissdk/result_meta.go
2026-03-19 11:53:07 +08:00

81 lines
1.5 KiB
Go

package whois
import "strings"
func buildResultMeta(r Result, source, server string) ResultMeta {
if strings.TrimSpace(source) == "" {
source = "whois"
}
meta := ResultMeta{
Source: strings.TrimSpace(source),
Server: strings.TrimSpace(server),
RawLen: len(r.rawData),
}
meta.ReasonCode, meta.Reason = classifyResultReason(r)
meta.QualityScore = scoreResultQuality(r, meta.ReasonCode)
return meta
}
func classifyResultReason(r Result) (ErrorCode, string) {
raw := strings.TrimSpace(r.rawData)
if raw == "" {
return ErrorCodeEmptyResponse, "empty response"
}
if !r.exists {
if rawHasAccessDenied(raw) {
return ErrorCodeAccessDenied, "access denied"
}
if rawHasNotFound(raw) {
return ErrorCodeNotFound, "not found"
}
return ErrorCodeNotFound, "not found"
}
score := scoreResultQuality(r, ErrorCodeOK)
if score < 60 {
return ErrorCodeParseWeak, "weak parse"
}
return ErrorCodeOK, "ok"
}
func scoreResultQuality(r Result, code ErrorCode) int {
switch code {
case ErrorCodeEmptyResponse:
return 0
case ErrorCodeAccessDenied:
return 10
case ErrorCodeNotFound:
return 20
}
score := 40
if strings.TrimSpace(r.domain) != "" {
score += 15
}
if strings.TrimSpace(r.registrar) != "" {
score += 10
}
if len(r.nsServers) > 0 {
score += 10
}
if len(r.statusRaw) > 0 {
score += 5
}
if r.hasRegisterDate {
score += 7
}
if r.hasExpireDate {
score += 7
}
if r.hasUpdateDate {
score += 6
}
if score > 100 {
score = 100
}
if score < 0 {
score = 0
}
return score
}