119 lines
3.4 KiB
Go

package main
import (
"context"
"log/slog"
"os"
"os/signal"
"strings"
"git.maximotejeda.com/maximo/telegram-base-bot/config"
"git.maximotejeda.com/maximo/telegram-base-bot/internal/adapters/grpc/tgbuser"
"git.maximotejeda.com/maximo/telegram-base-bot/internal/application/commands"
"git.maximotejeda.com/maximo/telegram-base-bot/internal/application/helpers"
"git.maximotejeda.com/maximo/telegram-base-bot/internal/application/messages"
"git.maximotejeda.com/maximo/telegram-base-bot/internal/application/middlewares"
"git.maximotejeda.com/maximo/telegram-base-bot/internal/application/queries"
"git.maximotejeda.com/maximo/telegram-base-bot/internal/ports"
"github.com/go-telegram/bot"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
)
var log *slog.Logger
func main() {
lvelEnv := config.GetEnvironment()
var lvel slog.Level
if lvelEnv == "dev" || lvelEnv == "development" {
lvel = slog.LevelDebug
} else {
lvel = slog.LevelInfo
}
log = slog.New(slog.NewJSONHandler(os.Stderr, &slog.HandlerOptions{
AddSource: true,
Level: lvel,
}))
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt)
defer cancel()
// a folder will be mounted and save dirs will be created on them
// assets for the bot
// assets sent from users for temp use
r, err := helpers.OpenBotDir(ctx, log, nil, "bot_media/", 0777)
if err != nil {
panic(err)
}
defer r.Close()
userSVC, conn := CreateAdaptersGRPC()
defer conn.Close()
authRequired := middlewares.SetAuthRequired(userSVC, log)
logMD := middlewares.CreateLogMiddleWare(ctx, log)
opts := []bot.Option{
bot.WithMiddlewares(logMD, authRequired),
bot.WithAllowedUpdates(bot.AllowedUpdates{
"message",
"edited_message",
"message_reaction",
"message_reaction_count",
"callback_query",
"id",
}),
}
b, err := bot.New(config.GetToken(), opts...)
if err != nil {
panic(err)
}
bInfo, err := b.GetMe(ctx)
if err != nil {
panic(err)
}
// attempt to add bot to db
err = userSVC.CreateBot(bInfo.Username)
if err != nil {
// want to fail fast in case of creating and svc not available
// if i cant auth i dont want to run
if strings.Contains(err.Error(), "rpc error: code = Unavailable desc = connection error: desc") {
panic(err)
}
}
commands.RegisterCommands(ctx, log, b)
messages.RegisterMessageHandler(ctx, log, b)
queries.RegisterQueries(ctx, log, b)
messages.RegisterMessageReactionHandler(ctx, log, b)
messages.RegisterLocationHandler(ctx, log, b)
messages.RegisterVoiceHandler(ctx, log, b, r)
messages.RegisterDocumentHandler(ctx, log, b, r)
messages.RegisterPhotosHandler(ctx, log, b, r)
b.Start(ctx)
}
// CreateAdaptersGRPC
// Create connections for service
func CreateAdaptersGRPC() (ports.UserService, *grpc.ClientConn) {
// we are outside update so we will be querying db to
// get users interested in specific updates ex bpd, brd, apa
// userID inst=> comma separated string
var opts []grpc.DialOption
opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials()))
userConn, err := grpc.NewClient(config.GetUserServiceURL(), opts...)
if err != nil {
log.Error("creating grpc conn", "error", err)
panic(err)
}
log.Info("success creating conn", "error", err)
user, err := tgbuser.NewAdapter(userConn)
if err != nil {
log.Error("creating service adapter", "error", err)
panic(err)
}
log.Info("success creating svc ", "error", err)
return user, userConn
}