2024-12-18 11:08:21 -04:00

102 lines
2.6 KiB
Go

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
}