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.go74
1 files changed, 49 insertions, 25 deletions
diff --git a/app/internal/create_bot.go b/app/internal/create_bot.go
index 7f9aa15..4bbe5ae 100644
--- a/app/internal/create_bot.go
+++ b/app/internal/create_bot.go
@@ -2,30 +2,26 @@ package internal
import (
"fmt"
- "net"
+ "log"
"os"
"os/exec"
"syscall"
- "time"
+
+ zmq "github.com/pebbe/zmq4"
)
type Bot struct {
- BotID string `json:"bot_id"`
BotToken string `json:"bot_token"`
Cmd *exec.Cmd // Ajouter une référence à la commande
- processID int // Stocker le PGID (Process Group ID)
+ processID int
+ dealer *zmq.Socket // Stocker le PGID (Process Group ID)
+ read bool
}
-func Start(b *Bot) (net.Conn, error) {
- socketPath := fmt.Sprintf("/tmp/%s.sock", b.BotID)
-
- // Nettoyage préalable du socket
- if err := os.RemoveAll(socketPath); err != nil && !os.IsNotExist(err) {
- return nil, fmt.Errorf("error cleaning socket: %w", err)
- }
+func Start(b *Bot, dealer *zmq.Socket) (*Bot, error) {
// Configuration du bot
- cmd := exec.Command("./bot/build/discord-bot", b.BotToken)
+ cmd := exec.Command("../bot/build/discord-bot", b.BotToken)
cmd.SysProcAttr = &syscall.SysProcAttr{
Setpgid: true, // Permet de kill le processus enfant si nécessaire
}
@@ -39,23 +35,51 @@ func Start(b *Bot) (net.Conn, error) {
}
b.Cmd = cmd
b.processID = cmd.Process.Pid
-
- // Mécanisme d'attente intelligente pour le socket
- var conn net.Conn
- maxRetries := 10
- for i := 0; i < maxRetries; i++ {
- var err error
- conn, err = net.Dial("unix", socketPath)
- if err == nil {
+ 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
}
- time.Sleep(500 * time.Millisecond)
+ }
+ return b, nil
+}
+
+func (b *Bot) Stop() error {
+ if b.Cmd != nil && b.processID != 0 {
+ if err := syscall.Kill(-b.processID, syscall.SIGTERM); err != nil {
+ return fmt.Errorf("[SERVER] failed to stop bot: %w", err)
+ }
+ }
+ return nil
+}
+
+func (b *Bot) SendMessage(message string) error {
+ if b.dealer == nil {
+ return fmt.Errorf("[SERVER] sender socket is not initialized")
+ }
+ 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 !
}
- if conn == nil {
- return nil, fmt.Errorf("failed to connect to bot socket after %d attempts", maxRetries)
+ _, err := b.dealer.Send(message, 0)
+ if err != nil {
+ return fmt.Errorf("[SERVER] failed to send message: %w", err)
}
+ log.Printf("[SERVER] sent message: %s", message)
- fmt.Printf("Bot %s started successfully\n", b.BotID)
- return conn, nil
+ b.read = false
+ return nil
}