113 lines
2.6 KiB
Go
113 lines
2.6 KiB
Go
package app
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
|
|
"go.etcd.io/bbolt"
|
|
"go.uber.org/zap"
|
|
"go.uber.org/zap/zapcore"
|
|
"penahub.gitlab.yandexcloud.net/backend/templategen_feedback/internal/config"
|
|
"penahub.gitlab.yandexcloud.net/backend/templategen_feedback/internal/initialize"
|
|
"penahub.gitlab.yandexcloud.net/backend/templategen_feedback/internal/server"
|
|
)
|
|
|
|
func Run(cfg *config.Config) {
|
|
cfgLogger := zap.NewDevelopmentConfig()
|
|
cfgLogger.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
|
|
cfgLogger.EncoderConfig.ConsoleSeparator = " "
|
|
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
defer cancel()
|
|
|
|
logger, err := cfgLogger.Build()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
logger.Info("RUN", zap.Any("ENV", cfg))
|
|
|
|
db, err := bbolt.Open("bolt.db", 0666, nil)
|
|
if err != nil {
|
|
logger.Error("BoltDB", zap.Error(err))
|
|
return
|
|
}
|
|
|
|
bot, err := tgbotapi.NewBotAPI(cfg.TelegramToken)
|
|
if err != nil {
|
|
logger.Error("TelegramBotApi", zap.Error(err))
|
|
return
|
|
}
|
|
|
|
repositories, err := initialize.NewRepositories(logger, db)
|
|
if err != nil {
|
|
logger.Error("BoltDB", zap.Error(err))
|
|
return
|
|
}
|
|
|
|
clients := initialize.NewClients(logger, bot, cfg.TelegramChannelID, cfg.TemplatePath)
|
|
|
|
bot.GetUpdatesChan(tgbotapi.UpdateConfig{
|
|
Offset: 0,
|
|
Limit: 0,
|
|
Timeout: 0,
|
|
AllowedUpdates: nil,
|
|
})
|
|
|
|
err = clients.Telegram.SendMessage("Bot started")
|
|
if err != nil {
|
|
logger.Error("TelegramBot", zap.Error(err))
|
|
return
|
|
}
|
|
|
|
// Send alive message
|
|
now := time.Now()
|
|
alarm := time.Date(now.Year(), now.Month(), now.Day(), 23, 59, 59, 0, now.Location())
|
|
timer := time.NewTimer(time.Until(alarm))
|
|
go func() {
|
|
for {
|
|
select {
|
|
case now = <-timer.C:
|
|
err = clients.Telegram.SendMessage("Я пока еще не сдох!")
|
|
if err != nil {
|
|
logger.Error("TelegramBot", zap.Error(err))
|
|
return
|
|
}
|
|
|
|
alarm = now.AddDate(0, 0, 1)
|
|
timer.Reset(time.Until(alarm))
|
|
case <-ctx.Done():
|
|
timer.Stop()
|
|
return
|
|
}
|
|
}
|
|
|
|
}()
|
|
|
|
controllers := initialize.NewControllers(logger, repositories.Feedback, clients.Telegram)
|
|
|
|
if err = controllers.Feedback.WarmUpService(); err != nil {
|
|
logger.Error("Controllers.Feedback", zap.Error(err))
|
|
return
|
|
}
|
|
|
|
logger.Info("Feedback service", zap.String("status", "warmed up"))
|
|
|
|
go controllers.Feedback.RunService()
|
|
|
|
logger.Info("Feedback service", zap.String("status", "started"))
|
|
|
|
httpSrv := server.NewHTTP(cfg, logger).Register(controllers.List()...)
|
|
|
|
go func() {
|
|
err := httpSrv.Start()
|
|
if err != nil {
|
|
logger.Error("CanNotServe", zap.Error(err))
|
|
return
|
|
}
|
|
}()
|
|
|
|
gracefulShutdown(logger, httpSrv, db, controllers)
|
|
}
|