summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/cmd/main.go55
-rw-r--r--app/go.mod5
-rw-r--r--app/go.sum4
-rw-r--r--app/internal/create_bot.go74
4 files changed, 95 insertions, 43 deletions
diff --git a/app/cmd/main.go b/app/cmd/main.go
index 14980b7..87212ef 100644
--- a/app/cmd/main.go
+++ b/app/cmd/main.go
@@ -2,7 +2,6 @@ package main
import (
"encoding/json"
- "fmt"
"log"
"net/http"
"os"
@@ -10,6 +9,7 @@ import (
"syscall"
"github.com/ketsuna-org/bot-creator-api/internal"
+ zmq "github.com/pebbe/zmq4"
)
func init() {
@@ -23,18 +23,33 @@ func main() {
mux.HandleFunc("GET /", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello, World!"))
})
- botId := "xxxxx"
- botToken := "xxxxx"
+ botToken := "XXXXXXXXXXXX" // Replace with your bot token
+
+ ctx, err := zmq.NewContext()
+ if err != nil {
+ log.Fatalf("[SERVER] Failed to create context: %v", err)
+ }
+ defer ctx.Term()
+
+ dealer, err := ctx.NewSocket(zmq.REP)
+ if err != nil {
+ log.Fatalf("[SERVER] Failed to create dealer: %v", err)
+ }
+ defer dealer.Close()
+
+ err = dealer.Bind("tcp://*:5555")
+ if err != nil {
+ log.Fatalf("[SERVER] Failed to bind dealer: %v", err)
+ }
bot := &internal.Bot{
- BotID: botId,
BotToken: botToken,
}
- conn, err := internal.Start(bot)
+
+ bot, err = internal.Start(bot, dealer)
if err != nil {
- log.Fatalf("Error starting bot: %v", err)
+ log.Fatalf("[SERVER] Error starting bot: %v", err)
}
- defer conn.Close()
// Handle the bot connection
data, err := json.Marshal(map[string]interface{}{
"command": "update",
@@ -45,10 +60,22 @@ func main() {
},
})
if err != nil {
- log.Fatalf("Error marshaling JSON: %v", err)
+ log.Fatalf("[SERVER] Error marshaling JSON: %v", err)
}
- conn.Write(data)
+ go bot.SendMessage(string(data))
+ dataX, err := json.Marshal(map[string]interface{}{
+ "command": "update",
+ "data": map[string]interface{}{
+ "ping": map[string]string{
+ "response": "pong ((userName)) avec une modif !",
+ },
+ },
+ })
+ if err != nil {
+ log.Fatalf("[SERVER] Error marshaling JSON: %v", err)
+ }
+ go bot.SendMessage(string(dataX))
// Handle if signal is received
signals := make(chan os.Signal, 1)
@@ -60,18 +87,12 @@ func main() {
// let's kill the bot
if bot.Cmd != nil {
if err := bot.Cmd.Process.Kill(); err != nil {
- log.Printf("Error killing bot process: %v", err)
+ log.Printf("[SERVER] Error killing bot process: %v", err)
} else {
- log.Printf("Bot process killed successfully")
+ log.Printf("[SERVER] Bot process killed successfully")
}
}
// let's remove the socket
- socketPath := fmt.Sprintf("/tmp/%s.sock", bot.BotID)
- if err := os.RemoveAll(socketPath); err != nil {
- log.Printf("Error removing socket: %v", err)
- } else {
- log.Printf("Socket removed successfully")
- }
os.Exit(0)
}()
panic(http.ListenAndServe(":2030", mux))
diff --git a/app/go.mod b/app/go.mod
index 0fdbadd..86e0320 100644
--- a/app/go.mod
+++ b/app/go.mod
@@ -2,4 +2,7 @@ module github.com/ketsuna-org/bot-creator-api
go 1.23.3
-require github.com/arangodb/go-driver/v2 v2.1.3 // indirect
+require (
+ github.com/arangodb/go-driver/v2 v2.1.3 // indirect
+ github.com/pebbe/zmq4 v1.3.1 // indirect
+)
diff --git a/app/go.sum b/app/go.sum
index e3078d7..b8dd409 100644
--- a/app/go.sum
+++ b/app/go.sum
@@ -1,2 +1,6 @@
github.com/arangodb/go-driver/v2 v2.1.3 h1:PpLSe8E2RalFuqTGi2yfHDe3ltOomfFCIToB66p1lr8=
github.com/arangodb/go-driver/v2 v2.1.3/go.mod h1:aoDzrsO7PQEFat3Q9pp4zfv6W+WotA7GcCeJQJfX+tc=
+github.com/pebbe/zmq4 v1.3.1 h1:WmGnjErIFjb43M6hq5nB/g9cUx9YQAXurAwfZV2Cgeo=
+github.com/pebbe/zmq4 v1.3.1/go.mod h1:nqnPueOapVhE2wItZ0uOErngczsJdLOGkebMxaO8r48=
+gopkg.in/zeromq/goczmq.v4 v4.1.0 h1:CE+FE81mGVs2aSlnbfLuS1oAwdcVywyMM2AC1g33imI=
+gopkg.in/zeromq/goczmq.v4 v4.1.0/go.mod h1:h4IlfePEYMpFdywGr5gAwKhBBj+hiBl/nF4VoSE4k+0=
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
}