package main import ( "context" "log/slog" "runtime" "git.maximotejeda.com/maximo/cedulados-bot/config" "git.maximotejeda.com/maximo/cedulados-bot/internal/adapter/grpc/cedulados" user "git.maximotejeda.com/maximo/cedulados-bot/internal/adapter/grpc/users" "git.maximotejeda.com/maximo/cedulados-bot/internal/application/api" "git.maximotejeda.com/maximo/cedulados-bot/internal/ports" tgb "github.com/go-telegram-bot-api/telegram-bot-api/v5" "golang.org/x/sync/semaphore" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" ) var ( maxWorkers = runtime.GOMAXPROCS(4) sem = semaphore.NewWeighted(2) ) func main() { ctx := context.Background() bot, err := tgb.NewBotAPI(config.GetToken()) log := slog.Default() if err != nil { log.Error("initiating bot", "error",err.Error()) return } bot.Debug = true log.Info("Authorized on account %s", "username", bot.Self.UserName, "maxWorkers", 2) u := tgb.NewUpdate(0) u.Timeout = 60 updates := bot.GetUpdatesChan(u) sign := make(chan int) app := api.NewApi(ctx, log, bot) _, us, cCoon, uConn := CreateAdaptersGRPC() _ = us.CreateBot(bot.Self.UserName) cCoon.Close() uConn.Close() // break if not admin set _ = config.GetAdminsList() for { select { case update := <-updates: if err := sem.Acquire(ctx, 1); err != nil{ log.Error("failed to get semaphore", "err", err.Error) bot.Send(tgb.NewMessage(update.Message.Chat.ID, "too may request, Please try again")) continue } go func(){ defer sem.Release(1) c, u, cConn, uConn := CreateAdaptersGRPC() app.Run(&update, c, u) defer cConn.Close() defer uConn.Close() }() case <-sign: } } } func CreateAdaptersGRPC() (ports.CeduladosService, ports.UserService, *grpc.ClientConn, *grpc.ClientConn) { log := slog.Default() // 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())) cedConn, err := grpc.NewClient(config.GetCeduladosServiceURL(), opts...) if err != nil { log.Error("creating gerpc conn", "error", err) panic(err) } userConn, err := grpc.NewClient(config.GetUserServiceURL(), opts...) if err != nil { log.Error("creating gerpc conn", "error", err) panic(err) } ced, err := cedulados.NewAdapter(cedConn) if err != nil { log.Error("creating service adapter", "error", err) panic(err) } user, err := user.NewAdapter(userConn) if err != nil { log.Error("creating service adapter", "error", err) panic(err) } return ced, user, cedConn, userConn }