summaryrefslogtreecommitdiff
path: root/app/internal/create_bot.go
diff options
context:
space:
mode:
Diffstat (limited to 'app/internal/create_bot.go')
-rw-r--r--app/internal/create_bot.go53
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
}