tg-bot-golang
Форк от ella/tg-bot-golang
135 строк · 6.1 Кб
1package main
2
3import (
4"context"
5"github.com/ellavs/tg-bot-golang/internal/cache"
6"github.com/ellavs/tg-bot-golang/internal/helpers/kafka"
7"github.com/ellavs/tg-bot-golang/internal/metrics"
8"github.com/ellavs/tg-bot-golang/internal/tasks/reportserver"
9"github.com/ellavs/tg-bot-golang/internal/tracing"
10"os/signal"
11"syscall"
12"time"
13
14"github.com/ellavs/tg-bot-golang/internal/clients/cbr"
15"github.com/ellavs/tg-bot-golang/internal/clients/tg"
16"github.com/ellavs/tg-bot-golang/internal/config"
17"github.com/ellavs/tg-bot-golang/internal/helpers/dbutils"
18"github.com/ellavs/tg-bot-golang/internal/helpers/net_http"
19"github.com/ellavs/tg-bot-golang/internal/logger"
20"github.com/ellavs/tg-bot-golang/internal/model/db"
21rates "github.com/ellavs/tg-bot-golang/internal/model/exchangerates"
22"github.com/ellavs/tg-bot-golang/internal/model/messages"
23uploader "github.com/ellavs/tg-bot-golang/internal/tasks/exchangeuploader"
24)
25
26// Параметры по умолчанию (могут быть изменены через config)
27var (
28mainCurrency = "RUB" // Основная валюта для хранения данных.
29currenciesName = []string{"USD", "CNY", "EUR", "RUB"} // Массив используемых валют.
30currenciesUpdatePeriod = 30 * time.Minute // Периодичность обновления курсов валют (раз в 30 минут).
31currenciesUpdateCachePeriod = 30 * time.Minute // Периодичность кэширования курсов валют из базы данных (раз в 30 минут).
32connectionStringDB = "" // Строка подключения к базе данных.
33kafkaTopic = "tgbot" // Наименование топика Kafka.
34brokersList = []string{"localhost:9092"} // Список адресов брокеров сообщений (адрес Kafka).
35)
36
37func main() {
38
39logger.Info("Старт приложения")
40
41ctx := context.Background()
42
43config, err := config.New()
44if err != nil {
45logger.Fatal("Ошибка получения файла конфигурации:", "err", err)
46}
47
48// Изменение параметров по умолчанию из заданной конфигурации.
49setConfigSettings(config.GetConfig())
50
51// Оборачивание в Middleware функции обработки сообщения для метрик и трейсинга.
52tgProcessingFuncHandler := tg.HandlerFunc(tg.ProcessingMessages)
53tgProcessingFuncHandler = metrics.MetricsMiddleware(tgProcessingFuncHandler)
54tgProcessingFuncHandler = tracing.TracingMiddleware(tgProcessingFuncHandler)
55
56// Инициализация телеграм клиента.
57tgClient, err := tg.New(config, tgProcessingFuncHandler)
58if err != nil {
59logger.Fatal("Ошибка инициализации ТГ-клиента:", "err", err)
60}
61
62// Инициализация хранилищ (подключение к базе данных).
63dbconn, err := dbutils.NewDBConnect(connectionStringDB)
64if err != nil {
65logger.Fatal("Ошибка подключения к базе данных:", "err", err)
66}
67// БД информации пользователей.
68userStorage := db.NewUserStorage(dbconn, mainCurrency, 0)
69// БД курсов валют.
70exchangeRatesStorage := db.NewExchangeRatesStorage(dbconn, currenciesName)
71
72// Инициализация клиента загрузки курсов валют из внешнего источника.
73ctx, cancel := signal.NotifyContext(ctx,
74syscall.SIGHUP,
75syscall.SIGINT,
76syscall.SIGTERM,
77syscall.SIGQUIT)
78defer cancel()
79httpClient := net_http.New[cbr.ExchangeRatesJson]()
80cbrClient := cbr.New(ctx, httpClient)
81
82// Инициализация локального экземпляра класса для работы с курсами валют.
83exchangeRates := rates.New(ctx, cbrClient, currenciesName, mainCurrency, exchangeRatesStorage)
84
85// Инициализация кэша для кэширования отчетов пользователей.
86cacheLRU := cache.NewLRU(5)
87
88// Инициализация кафки для отправки сообщений в очередь.
89kafkaProducer, err := kafka.NewSyncProducer(brokersList, kafkaTopic)
90if err != nil {
91logger.Fatal("Ошибка инициализации кафки для отправки сообщений:", "err", err)
92}
93
94// Инициализация основной модели.
95msgModel := messages.New(ctx, tgClient, userStorage, exchangeRates, cacheLRU, kafkaProducer)
96
97// Запуск периодическое обновление курсов валют.
98uploader.ExchangeRatesUpdater(ctx, exchangeRates, currenciesUpdatePeriod)
99
100// Запуск периодическое обновление локального кэша курсов валют из БД.
101uploader.ExchangeRatesFromStorageLoader(ctx, exchangeRates, currenciesUpdateCachePeriod)
102
103// Запуск сервера для получения отчетов пользователя.
104reportserver.StartReportServer(msgModel)
105
106// Запуск ТГ-клиента.
107tgClient.ListenUpdates(msgModel)
108
109logger.Info("Завершение приложения")
110}
111
112// Замена параметров по умолчанию параметрами из конфиг.файла.
113func setConfigSettings(config config.Config) {
114if config.MainCurrency != "" {
115mainCurrency = config.MainCurrency
116}
117if len(config.CurrenciesName) > 0 {
118currenciesName = config.CurrenciesName
119}
120if config.CurrenciesUpdatePeriod > 0 {
121currenciesUpdatePeriod = time.Duration(config.CurrenciesUpdatePeriod) * time.Minute
122}
123if config.CurrenciesUpdateCachePeriod > 0 {
124currenciesUpdateCachePeriod = time.Duration(config.CurrenciesUpdateCachePeriod) * time.Minute
125}
126if config.ConnectionStringDB != "" {
127connectionStringDB = config.ConnectionStringDB
128}
129if config.KafkaTopic != "" {
130kafkaTopic = config.KafkaTopic
131}
132if len(config.BrokersList) > 0 {
133brokersList = config.BrokersList
134}
135}
136