142 lines
3.2 KiB
Go
142 lines
3.2 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
"math/rand"
|
|
"os"
|
|
"strconv"
|
|
"time"
|
|
|
|
"gitlab.com/flygrounder/go-mtg-vk/internal/caching"
|
|
"gitlab.com/flygrounder/go-mtg-vk/internal/cardsinfo"
|
|
"gitlab.com/flygrounder/go-mtg-vk/internal/scenario"
|
|
"gitlab.com/flygrounder/go-mtg-vk/internal/telegram"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api"
|
|
environ "github.com/ydb-platform/ydb-go-sdk-auth-environ"
|
|
"github.com/ydb-platform/ydb-go-sdk/v3"
|
|
"gitlab.com/flygrounder/go-mtg-vk/internal/vk"
|
|
)
|
|
|
|
type config struct {
|
|
tgToken string
|
|
vkGroupId int64
|
|
vkSecretKey string
|
|
vkToken string
|
|
vkConfirmationString string
|
|
ydbConnectionString string
|
|
port string
|
|
}
|
|
|
|
func getConfig() *config {
|
|
var cfg config
|
|
var exists bool
|
|
var err error
|
|
|
|
cfg.tgToken, exists = os.LookupEnv("TG_TOKEN")
|
|
if !exists {
|
|
panic("TG_TOKEN environment variable not defined")
|
|
}
|
|
|
|
vkGroupId, exists := os.LookupEnv("VK_GROUP_ID")
|
|
if !exists {
|
|
panic("VK_GROUP_ID environment variable not defined")
|
|
}
|
|
cfg.vkGroupId, err = strconv.ParseInt(vkGroupId, 10, 64)
|
|
if err != nil {
|
|
panic("VK_GROUP_ID is not a number")
|
|
}
|
|
|
|
cfg.vkSecretKey, exists = os.LookupEnv("VK_SECRET_KEY")
|
|
if !exists {
|
|
panic("VK_SECRET_KEY environment variable not defined")
|
|
}
|
|
|
|
cfg.vkToken, exists = os.LookupEnv("VK_TOKEN")
|
|
if !exists {
|
|
panic("VK_TOKEN environment variable not defined")
|
|
}
|
|
|
|
cfg.vkConfirmationString, exists = os.LookupEnv("VK_CONFIRMATION_STRING")
|
|
if !exists {
|
|
panic("VK_CONFIRMATION_STRING environment variable not defined")
|
|
}
|
|
|
|
cfg.ydbConnectionString, exists = os.LookupEnv("YDB_CONNECTION_STRING")
|
|
if !exists {
|
|
panic("YDB_CONNECTION_STRING environment variable not defined")
|
|
}
|
|
|
|
cfg.port, exists = os.LookupEnv("PORT")
|
|
if !exists {
|
|
panic("PORT environment variable not defined")
|
|
}
|
|
|
|
return &cfg
|
|
}
|
|
|
|
func main() {
|
|
rand.Seed(time.Now().UTC().UnixNano())
|
|
|
|
cfg := getConfig()
|
|
|
|
bot, _ := tgbotapi.NewBotAPI(cfg.tgToken)
|
|
r := gin.Default()
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
|
defer cancel()
|
|
|
|
db, err := ydb.Open(ctx,
|
|
cfg.ydbConnectionString,
|
|
environ.WithEnvironCredentials(ctx),
|
|
)
|
|
if err != nil {
|
|
panic(fmt.Errorf("connect error: %w", err))
|
|
}
|
|
defer func() { _ = db.Close(ctx) }()
|
|
|
|
cache := &caching.CacheClient{
|
|
Storage: db.Table(),
|
|
Expiration: 12 * time.Hour,
|
|
Prefix: db.Name(),
|
|
}
|
|
err = cache.Init(context.Background())
|
|
if err != nil {
|
|
panic(fmt.Errorf("init error: %w", err))
|
|
}
|
|
|
|
logger := log.New(os.Stdout, "", 0)
|
|
fetcher := &cardsinfo.Fetcher{}
|
|
handler := vk.Handler{
|
|
Scenario: &scenario.Scenario{
|
|
Sender: &vk.ApiSender{
|
|
Token: cfg.vkToken,
|
|
Logger: logger,
|
|
},
|
|
Logger: logger,
|
|
InfoFetcher: fetcher,
|
|
Cache: cache,
|
|
},
|
|
SecretKey: cfg.vkSecretKey,
|
|
GroupId: cfg.vkGroupId,
|
|
ConfirmationString: cfg.vkConfirmationString,
|
|
}
|
|
|
|
tgHandler := telegram.Handler{
|
|
Scenario: &scenario.Scenario{
|
|
Sender: &telegram.Sender{
|
|
API: bot,
|
|
},
|
|
Logger: logger,
|
|
InfoFetcher: fetcher,
|
|
Cache: cache,
|
|
},
|
|
}
|
|
|
|
r.POST("vk", handler.HandleMessage)
|
|
r.POST("tg", tgHandler.HandleMessage)
|
|
_ = r.Run(":" + cfg.port)
|
|
}
|