69 lines
2.3 KiB
Go
69 lines
2.3 KiB
Go
package briefing
|
|
|
|
import (
|
|
"gitea.maximumdirect.net/eric/weatherreporter/internal/facts"
|
|
"gitea.maximumdirect.net/eric/weatherreporter/internal/forecast"
|
|
"gitea.maximumdirect.net/eric/weatherreporter/internal/module"
|
|
"gitea.maximumdirect.net/eric/weatherreporter/internal/weatherdata"
|
|
)
|
|
|
|
type AlertDigestModule struct {
|
|
Checked bool `json:"checked"`
|
|
ActiveCount int `json:"active_count"`
|
|
RelevantCount int `json:"relevant_count"`
|
|
Missing bool `json:"missing,omitempty"`
|
|
Relevant []AlertSummary `json:"relevant,omitempty"`
|
|
}
|
|
|
|
type AlertSummary struct {
|
|
Event string `json:"event,omitempty"`
|
|
Headline string `json:"headline,omitempty"`
|
|
Severity string `json:"severity,omitempty"`
|
|
PeriodBegins string `json:"period_begins,omitempty"`
|
|
PeriodEnds string `json:"period_ends,omitempty"`
|
|
Instruction string `json:"instruction,omitempty"`
|
|
Description string `json:"description,omitempty"`
|
|
}
|
|
|
|
func buildAlertDigestModule(ctx ModuleContext, _ any) (*module.Output, error) {
|
|
value := alertDigest(ctx.Collected, ctx.Derived.AlertOverlaps, ctx.Timezone)
|
|
if value == nil {
|
|
value = &AlertDigestModule{}
|
|
}
|
|
return &module.Output{ID: module.AlertDigest, StanzaName: "alert_digest", Value: *value}, nil
|
|
}
|
|
|
|
func alertDigest(collected facts.CollectedFacts, overlaps []forecast.AlertOverlap, timezone string) *AlertDigestModule {
|
|
missing := sourceMissing(collected.SourceProvenance, "alerts")
|
|
if collected.Alerts == nil && !missing {
|
|
return nil
|
|
}
|
|
value := &AlertDigestModule{Missing: missing}
|
|
if collected.Alerts != nil {
|
|
value.Checked = true
|
|
value.ActiveCount = len(collected.Alerts.Alerts)
|
|
}
|
|
value.RelevantCount = len(overlaps)
|
|
for _, overlap := range overlaps {
|
|
value.Relevant = append(value.Relevant, AlertSummary{
|
|
Event: overlap.Event,
|
|
Headline: overlap.Headline,
|
|
Severity: overlap.Severity,
|
|
PeriodBegins: friendlyMonthDayTimeLabel(overlap.Period.Start, timezone),
|
|
PeriodEnds: friendlyMonthDayTimeLabel(overlap.Period.End, timezone),
|
|
Instruction: overlap.Instruction,
|
|
Description: overlap.Description,
|
|
})
|
|
}
|
|
return value
|
|
}
|
|
|
|
func sourceMissing(sources []weatherdata.Source, name string) bool {
|
|
for _, source := range sources {
|
|
if source.Name == name && source.Missing {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|