1
0
Fork 0
hswro-alarm-bot/sender_worker.go

113 lines
2.5 KiB
Go

package main
import (
"html/template"
"log"
"net/http"
"os"
"runtime"
"sync"
"git.sr.ht/~michalr/go-satel"
)
const (
NotificationPartitionIndex = 0
)
type Sender interface {
Send(msg GenericMessage, tpl *template.Template) error
}
type Sleeper interface {
Sleep(ch chan<- interface{})
}
func Consume(events <-chan GenericMessage) {
go func() {
for range events {
runtime.GC()
}
}()
}
func SendToTg(events <-chan GenericMessage, s Sender, wg *sync.WaitGroup, logger *log.Logger, tpl *template.Template) <-chan GenericMessage {
returnEvents := make(chan GenericMessage)
go func() {
wg.Add(1)
defer wg.Done()
for e := range events {
returnEvents <- e
err := s.Send(e, tpl)
if err != nil {
// TODO: handle it better
panic(err)
}
}
close(returnEvents)
}()
return returnEvents
}
func doHttpNotification(url string, logger *log.Logger, wg *sync.WaitGroup) {
wg.Add(1)
defer wg.Done()
if len(url) == 0 {
return
}
req, err := http.NewRequest(http.MethodPost, url, nil)
res, err := http.DefaultClient.Do(req)
if err != nil {
logger.Print("Could not POST ", url, ": ", err)
return
}
logger.Print("Notified via HTTP with result ", res.StatusCode)
}
func NotifyViaHTTP(events <-chan GenericMessage, wg *sync.WaitGroup, logger *log.Logger) <-chan GenericMessage {
returnEvents := make(chan GenericMessage)
armCallbackUrl := os.Getenv("NOTIFY_URL_ARM")
disarmCallbackUrl := os.Getenv("NOTIFY_URL_DISARM")
alarmCallbackUrl := os.Getenv("ALARM_URL_ARM")
armDisarmCallbackEnabled := (len(armCallbackUrl) != 0) && (len(disarmCallbackUrl) != 0)
alarmCallbackEnabled := (len(alarmCallbackUrl) != 0)
go func() {
wg.Add(1)
defer wg.Done()
for e := range events {
returnEvents <- e
if armDisarmCallbackEnabled {
inner_arm:
for _, basicElement := range e.Messages {
if (basicElement.Index == NotificationPartitionIndex) && (basicElement.Type == satel.ArmedPartition) {
if basicElement.Value == ArmedPartition_Armed {
go doHttpNotification(armCallbackUrl, logger, wg)
} else {
go doHttpNotification(disarmCallbackUrl, logger, wg)
}
break inner_arm
}
}
}
if alarmCallbackEnabled {
inner_alarm:
for _, basicElement := range e.Messages {
if basicElement.Type == satel.PartitionAlarm {
if basicElement.Value == PartitionAlarm_Alarm {
go doHttpNotification(alarmCallbackUrl, logger, wg)
break inner_alarm
}
}
}
}
}
close(returnEvents)
}()
return returnEvents
}