72 lines
2.4 KiB
Go
72 lines
2.4 KiB
Go
package briefing
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"gitea.maximumdirect.net/eric/weatherreporter/internal/module"
|
|
"gitea.maximumdirect.net/eric/weatherreporter/internal/weatherdata"
|
|
)
|
|
|
|
const defaultSPCConvectiveDiscussionMinimumSeverityRank = 3
|
|
|
|
type SPCConvectiveDiscussionModule struct {
|
|
IncludedBecause string `json:"included_because"`
|
|
Discussions []SPCConvectiveDiscussionRecord `json:"discussions"`
|
|
}
|
|
|
|
type SPCConvectiveDiscussionRecord struct {
|
|
Day int `json:"day,omitempty"`
|
|
Headline string `json:"headline,omitempty"`
|
|
Summary string `json:"summary,omitempty"`
|
|
Discussion string `json:"discussion,omitempty"`
|
|
UpdatedAt string `json:"updated_at,omitempty"`
|
|
}
|
|
|
|
func buildSPCConvectiveDiscussionModule(ctx ModuleContext, _ any) (*module.Output, error) {
|
|
if !hasSPCConvectiveDiscussionThreshold(ctx.Derived.SPCConvectiveOutlooks) {
|
|
return nil, nil
|
|
}
|
|
records := spcConvectiveDiscussionRecords(ctx.Derived.SPCConvectiveOutlooks, ctx.Derived.SPCConvectiveDiscussions, ctx.Timezone)
|
|
if len(records) == 0 {
|
|
return nil, nil
|
|
}
|
|
value := SPCConvectiveDiscussionModule{
|
|
IncludedBecause: fmt.Sprintf("severity_rank >= %d", defaultSPCConvectiveDiscussionMinimumSeverityRank),
|
|
Discussions: records,
|
|
}
|
|
return &module.Output{ID: module.SPCConvectiveDiscussion, StanzaName: string(module.SPCConvectiveDiscussion), Value: value}, nil
|
|
}
|
|
|
|
func hasSPCConvectiveDiscussionThreshold(outlooks []weatherdata.ConvectiveOutlook) bool {
|
|
for _, outlook := range outlooks {
|
|
if outlook.SeverityRank != nil && *outlook.SeverityRank >= defaultSPCConvectiveDiscussionMinimumSeverityRank {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func spcConvectiveDiscussionRecords(outlooks []weatherdata.ConvectiveOutlook, discussions []weatherdata.ConvectiveOutlookDiscussion, timezone string) []SPCConvectiveDiscussionRecord {
|
|
retainedDays := map[int]struct{}{}
|
|
for _, outlook := range outlooks {
|
|
retainedDays[outlook.Day] = struct{}{}
|
|
}
|
|
records := make([]SPCConvectiveDiscussionRecord, 0, len(discussions))
|
|
for _, discussion := range discussions {
|
|
if _, ok := retainedDays[discussion.Day]; !ok {
|
|
continue
|
|
}
|
|
if discussion.Discussion == "" {
|
|
continue
|
|
}
|
|
records = append(records, SPCConvectiveDiscussionRecord{
|
|
Day: discussion.Day,
|
|
Headline: discussion.Headline,
|
|
Summary: discussion.Summary,
|
|
Discussion: discussion.Discussion,
|
|
UpdatedAt: friendlyOptionalTime(discussion.UpdatedAt, timezone),
|
|
})
|
|
}
|
|
return records
|
|
}
|