tg-bot-golang

Форк
0
Форк от ella/tg-bot-golang
135 строк · 6.1 Кб
1
package main
2

3
import (
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"
21
	rates "github.com/ellavs/tg-bot-golang/internal/model/exchangerates"
22
	"github.com/ellavs/tg-bot-golang/internal/model/messages"
23
	uploader "github.com/ellavs/tg-bot-golang/internal/tasks/exchangeuploader"
24
)
25

26
// Параметры по умолчанию (могут быть изменены через config)
27
var (
28
	mainCurrency                = "RUB"                                // Основная валюта для хранения данных.
29
	currenciesName              = []string{"USD", "CNY", "EUR", "RUB"} // Массив используемых валют.
30
	currenciesUpdatePeriod      = 30 * time.Minute                     // Периодичность обновления курсов валют (раз в 30 минут).
31
	currenciesUpdateCachePeriod = 30 * time.Minute                     // Периодичность кэширования курсов валют из базы данных (раз в 30 минут).
32
	connectionStringDB          = ""                                   // Строка подключения к базе данных.
33
	kafkaTopic                  = "tgbot"                              // Наименование топика Kafka.
34
	brokersList                 = []string{"localhost:9092"}           // Список адресов брокеров сообщений (адрес Kafka).
35
)
36

37
func main() {
38

39
	logger.Info("Старт приложения")
40

41
	ctx := context.Background()
42

43
	config, err := config.New()
44
	if err != nil {
45
		logger.Fatal("Ошибка получения файла конфигурации:", "err", err)
46
	}
47

48
	// Изменение параметров по умолчанию из заданной конфигурации.
49
	setConfigSettings(config.GetConfig())
50

51
	// Оборачивание в Middleware функции обработки сообщения для метрик и трейсинга.
52
	tgProcessingFuncHandler := tg.HandlerFunc(tg.ProcessingMessages)
53
	tgProcessingFuncHandler = metrics.MetricsMiddleware(tgProcessingFuncHandler)
54
	tgProcessingFuncHandler = tracing.TracingMiddleware(tgProcessingFuncHandler)
55

56
	// Инициализация телеграм клиента.
57
	tgClient, err := tg.New(config, tgProcessingFuncHandler)
58
	if err != nil {
59
		logger.Fatal("Ошибка инициализации ТГ-клиента:", "err", err)
60
	}
61

62
	// Инициализация хранилищ (подключение к базе данных).
63
	dbconn, err := dbutils.NewDBConnect(connectionStringDB)
64
	if err != nil {
65
		logger.Fatal("Ошибка подключения к базе данных:", "err", err)
66
	}
67
	// БД информации пользователей.
68
	userStorage := db.NewUserStorage(dbconn, mainCurrency, 0)
69
	// БД курсов валют.
70
	exchangeRatesStorage := db.NewExchangeRatesStorage(dbconn, currenciesName)
71

72
	// Инициализация клиента загрузки курсов валют из внешнего источника.
73
	ctx, cancel := signal.NotifyContext(ctx,
74
		syscall.SIGHUP,
75
		syscall.SIGINT,
76
		syscall.SIGTERM,
77
		syscall.SIGQUIT)
78
	defer cancel()
79
	httpClient := net_http.New[cbr.ExchangeRatesJson]()
80
	cbrClient := cbr.New(ctx, httpClient)
81

82
	// Инициализация локального экземпляра класса для работы с курсами валют.
83
	exchangeRates := rates.New(ctx, cbrClient, currenciesName, mainCurrency, exchangeRatesStorage)
84

85
	// Инициализация кэша для кэширования отчетов пользователей.
86
	cacheLRU := cache.NewLRU(5)
87

88
	// Инициализация кафки для отправки сообщений в очередь.
89
	kafkaProducer, err := kafka.NewSyncProducer(brokersList, kafkaTopic)
90
	if err != nil {
91
		logger.Fatal("Ошибка инициализации кафки для отправки сообщений:", "err", err)
92
	}
93

94
	// Инициализация основной модели.
95
	msgModel := messages.New(ctx, tgClient, userStorage, exchangeRates, cacheLRU, kafkaProducer)
96

97
	// Запуск периодическое обновление курсов валют.
98
	uploader.ExchangeRatesUpdater(ctx, exchangeRates, currenciesUpdatePeriod)
99

100
	// Запуск периодическое обновление локального кэша курсов валют из БД.
101
	uploader.ExchangeRatesFromStorageLoader(ctx, exchangeRates, currenciesUpdateCachePeriod)
102

103
	// Запуск сервера для получения отчетов пользователя.
104
	reportserver.StartReportServer(msgModel)
105

106
	// Запуск ТГ-клиента.
107
	tgClient.ListenUpdates(msgModel)
108

109
	logger.Info("Завершение приложения")
110
}
111

112
// Замена параметров по умолчанию параметрами из конфиг.файла.
113
func setConfigSettings(config config.Config) {
114
	if config.MainCurrency != "" {
115
		mainCurrency = config.MainCurrency
116
	}
117
	if len(config.CurrenciesName) > 0 {
118
		currenciesName = config.CurrenciesName
119
	}
120
	if config.CurrenciesUpdatePeriod > 0 {
121
		currenciesUpdatePeriod = time.Duration(config.CurrenciesUpdatePeriod) * time.Minute
122
	}
123
	if config.CurrenciesUpdateCachePeriod > 0 {
124
		currenciesUpdateCachePeriod = time.Duration(config.CurrenciesUpdateCachePeriod) * time.Minute
125
	}
126
	if config.ConnectionStringDB != "" {
127
		connectionStringDB = config.ConnectionStringDB
128
	}
129
	if config.KafkaTopic != "" {
130
		kafkaTopic = config.KafkaTopic
131
	}
132
	if len(config.BrokersList) > 0 {
133
		brokersList = config.BrokersList
134
	}
135
}
136

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.