diff options
Diffstat (limited to 'app/internal/create_bot.go')
| -rw-r--r-- | app/internal/create_bot.go | 53 |
1 files changed, 31 insertions, 22 deletions
diff --git a/app/internal/create_bot.go b/app/internal/create_bot.go index 4bbe5ae..0f47818 100644 --- a/app/internal/create_bot.go +++ b/app/internal/create_bot.go @@ -16,12 +16,13 @@ type Bot struct { processID int dealer *zmq.Socket // Stocker le PGID (Process Group ID) read bool + readyChan chan bool // Canal pour indiquer que le bot est prêt } func Start(b *Bot, dealer *zmq.Socket) (*Bot, error) { // Configuration du bot - cmd := exec.Command("../bot/build/discord-bot", b.BotToken) + cmd := exec.Command("./discord-bot", b.BotToken) cmd.SysProcAttr = &syscall.SysProcAttr{ Setpgid: true, // Permet de kill le processus enfant si nécessaire } @@ -36,18 +37,27 @@ func Start(b *Bot, dealer *zmq.Socket) (*Bot, error) { b.Cmd = cmd b.processID = cmd.Process.Pid b.dealer = dealer - // Here we will receive messages from the bot in a separate goroutine - for { - msg, err := dealer.Recv(0) - if err != nil { - return nil, fmt.Errorf("[SERVER] failed to receive message: %w", err) - } - if msg == "ready" { - log.Printf("[SERVER] Bot is ready") - b.read = true - break + b.readyChan = make(chan bool) + + // Goroutine pour écouter les messages du bot + go func() { + // Boucle de réception des messages du bot via ZeroMQ + for { + msg, err := dealer.Recv(0) + if err != nil { + log.Printf("[SERVER] Failed to receive message from bot %s: %v", b.BotToken, err) + continue // Continue à recevoir les messages même si une erreur se produit + } + + if msg == "ready" { + log.Printf("[SERVER] Bot %s is ready", b.BotToken) + b.read = true + b.readyChan <- true // Indiquer que le bot est prêt + break + } } - } + }() + return b, nil } @@ -56,6 +66,7 @@ func (b *Bot) Stop() error { if err := syscall.Kill(-b.processID, syscall.SIGTERM); err != nil { return fmt.Errorf("[SERVER] failed to stop bot: %w", err) } + log.Printf("[SERVER] Bot %s stopped successfully", b.BotToken) } return nil } @@ -64,22 +75,20 @@ func (b *Bot) SendMessage(message string) error { if b.dealer == nil { return fmt.Errorf("[SERVER] sender socket is not initialized") } + + // Attendre que le bot soit prêt si ce n'est pas déjà fait if !b.read { - // Let's read the message before sending - msg, err := b.dealer.Recv(0) - if err != nil { - return fmt.Errorf("[SERVER] failed to receive message: %w", err) - } - log.Printf("[SERVER] received message: %s", msg) - b.read = true // Fix ici ! + log.Printf("[SERVER] Waiting for bot %s to be ready...", b.BotToken) + <-b.readyChan // Attendre que le bot soit prêt } + // Envoi du message _, err := b.dealer.Send(message, 0) if err != nil { - return fmt.Errorf("[SERVER] failed to send message: %w", err) + return fmt.Errorf("[SERVER] failed to send message to bot %s: %w", b.BotToken, err) } - log.Printf("[SERVER] sent message: %s", message) + log.Printf("[SERVER] Sent message to bot %s: %s", b.BotToken, message) - b.read = false + b.read = false // Réinitialiser l'état de lecture après l'envoi return nil } |
