Sync production source including routing, billing, Astra detection and public uptime. Update custom build instructions and license packaging.
43 lines
1.1 KiB
Go
43 lines
1.1 KiB
Go
package service
|
|
|
|
import (
|
|
"github.com/QuantumNous/new-api/model"
|
|
"sort"
|
|
)
|
|
|
|
type ProbeHistoryPoint struct {
|
|
At int64 `json:"at"`
|
|
Status int `json:"status"`
|
|
}
|
|
|
|
func GroupProbeHistory(ids []int, tasks []model.SystemTask) []ProbeHistoryPoint {
|
|
points := []ProbeHistoryPoint{}
|
|
for _, task := range tasks {
|
|
if task.Type != model.SystemTaskTypeChannelAvailability {
|
|
continue
|
|
}
|
|
var state ChannelAvailabilityState
|
|
if task.DecodeState(&state) != nil {
|
|
continue
|
|
}
|
|
evidence := map[int]ChannelDetectionEvidence{}
|
|
for _, round := range state.Rounds {
|
|
evidence[round.ChannelID] = ChannelDetectionEvidence{At: round.At, Success: round.Success}
|
|
}
|
|
latest := int64(0)
|
|
for _, id := range ids {
|
|
latest = max(latest, evidence[id].At)
|
|
}
|
|
if latest == 0 {
|
|
continue
|
|
}
|
|
status, at := DetectionFallbackStatus(ids, evidence, latest)
|
|
points = append(points, ProbeHistoryPoint{At: at, Status: status})
|
|
}
|
|
sort.Slice(points, func(i, j int) bool { return points[i].At < points[j].At })
|
|
if len(points) > 18 {
|
|
points = points[len(points)-18:]
|
|
}
|
|
return points
|
|
}
|