102 lines
2.6 KiB
Go
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
|
|
}
|