package main import ( "os" "os/signal" "syscall" "time" "go.uber.org/zap" tele "gopkg.in/telebot.v3" "git.gensokyo.cafe/kkyy/mycurrencynet" "git.gensokyo.cafe/kkyy/tgbot_misaka_5882f7/utils" ) var logger *zap.SugaredLogger func initLogger() { l, err := zap.NewProduction() if err != nil { panic(err) } logger = l.Sugar() } var exchangeRates = mycurrencynet.New() func initExchangeRates() { if err := exchangeRates.Update(); err != nil { logger.Panicw("Failed to update exchange rates", "err", err) } logger.Info("Exchange rates updated") go exchangeRates.UpdateEvery( time.Hour, func(err error) { logger.Errorw("Failed to update exchange rates", "err", err) }, func() { logger.Info("Exchange rates updated") }, ) } func runBot() { logger.Info("Bot initializing...") bot, err := initBot() if err != nil { logger.Fatalw("Failed to initialize bot", "err", err) } // Announce commands if config.TGAnnounceCommands { logger.Info("Announcing commands...") if err = bot.SetCommands([]tele.Command{ {Text: "tr", Description: "Translate text"}, {Text: "xr", Description: "Currency exchange rates"}, {Text: "year_progress", Description: "Time doesn't wait."}, {Text: "traffic", Description: "Show traffic usage."}, {Text: "dig", Description: "Diggy diggy dig."}, }); err != nil { logger.Fatalw("Failed to announce commands", "err", err) } } botFinCh := utils.WaitFor(bot.Start) logger.Infow("Bot started", "username", bot.Me.Username) go initExchangeRates() // listen for shutdown signal sigCh := make(chan os.Signal, 1) signal.Notify(sigCh, os.Interrupt, syscall.SIGTERM) select { case sig := <-sigCh: logger.Infow("Received signal", "signal", sig) logger.Info("Bot shutdown...") bot.Stop() case <-botFinCh: logger.Warn("Bot terminated") } } func main() { initLogger() if err := LoadCfg(); err != nil { logger.Fatalw("Failed to load config", "err", err) } runBot() }