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 }