telegram-notifier/notifier/main.go

80 lines
1.7 KiB
Go

package main
import (
"context"
"flag"
"os"
"os/signal"
"git.faercol.me/faercol/telegram-notifier/notifier/config"
"git.faercol.me/faercol/telegram-notifier/notifier/listener"
"git.faercol.me/faercol/telegram-notifier/notifier/logger"
"git.faercol.me/faercol/telegram-notifier/notifier/sender"
)
type cliArgs struct {
configPath string
}
func parseArgs() *cliArgs {
configPath := flag.String("config", "", "Path to the JSON configuration file")
flag.Parse()
return &cliArgs{
configPath: *configPath,
}
}
func main() {
args := parseArgs()
mainCtx, cancel := context.WithCancel(context.Background())
conf, err := config.New(args.configPath)
if err != nil {
panic(err)
}
logger.Init(conf.Log.Level)
logger.L.Infof("Intialized logger with level %v", conf.Log.Level)
logger.L.Debug("Initializing Telegram message sender")
l, err := listener.New(conf.Listener.SockPath)
if err != nil {
logger.L.Fatalf("Failed to initialize listener: %s", err.Error())
}
s := sender.New(conf, l.ExportChan())
go l.Run(mainCtx)
go s.Run(mainCtx)
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
logger.L.Info("Telegram message sender is operational")
outerloop:
for {
select {
case <-c:
logger.L.Info("Stopping Telegram message sender")
cancel()
break outerloop
case <-s.Exit():
logger.L.Fatal("Unexpected exit from the sender")
case err := <-l.ErrorChan():
logger.L.Errorf("Unexpected error from listener: %s", err.Error())
case err := <-s.ErrChan():
logger.L.Errorf("Unexpected error from sender: %s", err.Error())
}
}
logger.L.Debug("Waiting for all services to shut down")
<-s.Exit()
logger.L.Info("Telegram message sender successfully stopped")
os.Exit(0)
}