增加账号凌晨响应标记
This commit is contained in:
@@ -275,9 +275,11 @@ func externalAccountToCreateRequest(
|
||||
"resources": resources,
|
||||
"skin_groups": externalSkinGroups(skins),
|
||||
"online_time_text": onlineTimeText,
|
||||
"ban_record": normalizeBanRecord(item.BanRecord),
|
||||
"common_regions": commonRegions(item.CommonRegion),
|
||||
"remark": remark,
|
||||
// 外部导入没有该字段时按不可凌晨响应处理,避免旧数据误入夜间专区。
|
||||
"early_morning_response": "否",
|
||||
"ban_record": normalizeBanRecord(item.BanRecord),
|
||||
"common_regions": commonRegions(item.CommonRegion),
|
||||
"remark": remark,
|
||||
"import_meta": map[string]any{
|
||||
"uploader_name": uploaderName,
|
||||
"client_upload_time": uploadTime,
|
||||
|
||||
@@ -403,53 +403,13 @@ func isNightAvailableSummary(summary map[string]any) bool {
|
||||
if summary == nil {
|
||||
return false
|
||||
}
|
||||
onlineTime, ok := summary["online_time"].(map[string]any)
|
||||
if !ok {
|
||||
// 夜间专区只认号主明确确认的凌晨响应能力,旧数据缺失时默认不进入专区。
|
||||
switch value := summary["early_morning_response"].(type) {
|
||||
case string:
|
||||
return strings.TrimSpace(value) == "是"
|
||||
case bool:
|
||||
return value
|
||||
default:
|
||||
return false
|
||||
}
|
||||
start, okStart := parseTimeMinuteValue(onlineTime["start"])
|
||||
end, okEnd := parseTimeMinuteValue(onlineTime["end"])
|
||||
if !okStart || !okEnd {
|
||||
return false
|
||||
}
|
||||
return timeRangeOverlapsMinutes(start, end, 0, 8*60)
|
||||
}
|
||||
|
||||
func parseTimeMinuteValue(value any) (int, bool) {
|
||||
text, ok := value.(string)
|
||||
if !ok {
|
||||
return 0, false
|
||||
}
|
||||
parts := strings.Split(text, ":")
|
||||
if len(parts) != 2 {
|
||||
return 0, false
|
||||
}
|
||||
hour, err := strconv.Atoi(parts[0])
|
||||
if err != nil || hour < 0 || hour > 23 {
|
||||
return 0, false
|
||||
}
|
||||
minute, err := strconv.Atoi(parts[1])
|
||||
if err != nil || minute < 0 || minute > 59 {
|
||||
return 0, false
|
||||
}
|
||||
return hour*60 + minute, true
|
||||
}
|
||||
|
||||
func timeRangeOverlapsMinutes(start int, end int, targetStart int, targetEnd int) bool {
|
||||
if start == end {
|
||||
return true
|
||||
}
|
||||
for _, segment := range splitMinuteRange(start, end) {
|
||||
if segment[0] <= targetEnd && segment[1] >= targetStart {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func splitMinuteRange(start int, end int) [][2]int {
|
||||
if start < end {
|
||||
return [][2]int{{start, end}}
|
||||
}
|
||||
return [][2]int{{start, 23*60 + 59}, {0, end}}
|
||||
}
|
||||
|
||||
@@ -178,31 +178,27 @@ func TestSortPublicListingsDefaultUsesShuffleKey(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestIsNightAvailableSummaryUsesMidnightToEight(t *testing.T) {
|
||||
func TestIsNightAvailableSummaryUsesEarlyMorningResponse(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
start string
|
||||
end string
|
||||
want bool
|
||||
name string
|
||||
response any
|
||||
want bool
|
||||
}{
|
||||
{name: "全天可上号", start: "00:00", end: "23:59", want: true},
|
||||
{name: "覆盖夜间新区间", start: "00:00", end: "08:00", want: true},
|
||||
{name: "刚好八点开始", start: "08:00", end: "12:00", want: true},
|
||||
{name: "八点半开始不算夜间", start: "08:30", end: "12:00", want: false},
|
||||
{name: "跨零点覆盖夜间", start: "23:00", end: "02:00", want: true},
|
||||
{name: "旧夜间晚间时段不再命中", start: "22:00", end: "23:00", want: false},
|
||||
{name: "明确响应", response: "是", want: true},
|
||||
{name: "明确不响应", response: "否", want: false},
|
||||
{name: "兼容布尔值", response: true, want: true},
|
||||
{name: "缺失字段", response: nil, want: false},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := isNightAvailableSummary(map[string]any{
|
||||
"online_time": map[string]any{
|
||||
"start": tt.start,
|
||||
"end": tt.end,
|
||||
},
|
||||
})
|
||||
summary := map[string]any{}
|
||||
if tt.response != nil {
|
||||
summary["early_morning_response"] = tt.response
|
||||
}
|
||||
got := isNightAvailableSummary(summary)
|
||||
if got != tt.want {
|
||||
t.Fatalf("isNightAvailableSummary(%s-%s) = %v, want %v", tt.start, tt.end, got, tt.want)
|
||||
t.Fatalf("isNightAvailableSummary(%#v) = %v, want %v", tt.response, got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@@ -530,6 +530,9 @@ func TestExternalAccountToCreateRequestMapsUploadFields(t *testing.T) {
|
||||
if req.AssetSummary["online_time_text"] != "08:00 至 01:00" {
|
||||
t.Fatalf("online_time_text = %#v", req.AssetSummary["online_time_text"])
|
||||
}
|
||||
if req.AssetSummary["early_morning_response"] != "否" {
|
||||
t.Fatalf("early_morning_response = %#v, want 否", req.AssetSummary["early_morning_response"])
|
||||
}
|
||||
onlineTime, ok := req.AssetSummary["online_time"].(map[string]any)
|
||||
if !ok {
|
||||
t.Fatalf("online_time missing: %#v", req.AssetSummary["online_time"])
|
||||
|
||||
Reference in New Issue
Block a user