From 339ba8fe5b6ffff6fa6a68231e564a8b79d353b6 Mon Sep 17 00:00:00 2001 From: lfirmin Date: Mon, 11 May 2026 15:47:08 +0200 Subject: [PATCH] 2eme partie last push --- cmd/bot/main.go | 4 +- internal/discord/bot_service.go | 93 +++++++++++++--- internal/panel/bot_service.go | 1 + internal/panel/handlers/convocations.go | 2 + internal/panel/server.go | 19 ++-- internal/panel/templates/convocations.html | 124 ++++++++++++++------- 6 files changed, 179 insertions(+), 64 deletions(-) diff --git a/cmd/bot/main.go b/cmd/bot/main.go index ff8108a..4556149 100644 --- a/cmd/bot/main.go +++ b/cmd/bot/main.go @@ -50,6 +50,7 @@ func main() { ticketRepo := db.NewTicketRepo(sqldb) claimRepo := db.NewClaimMessageRepo(sqldb) convocRepo := db.NewConvocationConfigRepo(sqldb) + convocPanelRepo := db.NewConvocationPanelRepo(sqldb) adminRepo := db.NewPanelAdminRepo(sqldb) sessionRepo := db.NewPanelSessionRepo(sqldb) auditRepo := db.NewAuditLogRepo(sqldb) @@ -166,7 +167,7 @@ func main() { // Start panel HTTP server if configured if cfg.Panel.BaseURL != "" || cfg.Panel.Port > 0 { - botSvc := discordbot.NewBotService(bot.Session, panelRepo, ticketRepo, convocRepo, guildID, allowedGuilds) + botSvc := discordbot.NewBotService(bot.Session, panelRepo, ticketRepo, convocRepo, convocPanelRepo, guildID, allowedGuilds) panelSrv := panel.NewServer( cfg.Panel, ticketRepo, @@ -175,6 +176,7 @@ func main() { auditRepo, panelRepo, convocRepo, + convocPanelRepo, guildID, botSvc, ) diff --git a/internal/discord/bot_service.go b/internal/discord/bot_service.go index a16aa12..cd474d8 100644 --- a/internal/discord/bot_service.go +++ b/internal/discord/bot_service.go @@ -15,13 +15,14 @@ import ( // BotServiceImpl implements panel.BotService and handlers.DiscordInfo. type BotServiceImpl struct { - session *discordgo.Session - panelRepo *db.PanelConfigRepo - ticketRepo *db.TicketRepo - convocRepo *db.ConvocationConfigRepo - guildID string - allowedGuilds []string - startedAt time.Time + session *discordgo.Session + panelRepo *db.PanelConfigRepo + ticketRepo *db.TicketRepo + convocRepo *db.ConvocationConfigRepo + convocPanelRepo *db.ConvocationPanelRepo + guildID string + allowedGuilds []string + startedAt time.Time } func NewBotService( @@ -29,17 +30,19 @@ func NewBotService( panelRepo *db.PanelConfigRepo, ticketRepo *db.TicketRepo, convocRepo *db.ConvocationConfigRepo, + convocPanelRepo *db.ConvocationPanelRepo, guildID string, allowedGuilds []string, ) *BotServiceImpl { return &BotServiceImpl{ - session: s, - panelRepo: panelRepo, - ticketRepo: ticketRepo, - convocRepo: convocRepo, - guildID: guildID, - allowedGuilds: allowedGuilds, - startedAt: time.Now(), + session: s, + panelRepo: panelRepo, + ticketRepo: ticketRepo, + convocRepo: convocRepo, + convocPanelRepo: convocPanelRepo, + guildID: guildID, + allowedGuilds: allowedGuilds, + startedAt: time.Now(), } } @@ -365,6 +368,68 @@ func (b *BotServiceImpl) SendConvocPanel(guildID string) error { return b.convocRepo.SetConvocPanelMessage(ctx, guildID, cfg.PanelChannelID, msg.ID) } +// SendConvocPanelByID sends (or updates) the Discord embed+button for a specific convocation panel. +func (b *BotServiceImpl) SendConvocPanelByID(panelID int64) error { + ctx := context.Background() + p, err := b.convocPanelRepo.GetByID(ctx, panelID) + if err != nil { + return fmt.Errorf("get convoc panel: %w", err) + } + if p == nil { + return fmt.Errorf("convoc panel %d not found", panelID) + } + if p.ChannelID == "" { + return fmt.Errorf("convoc panel %d has no channel configured", panelID) + } + + title := p.EmbedTitle + if title == "" { + title = "Créer une convocation" + } + color := parseHexColor(p.EmbedColor) + if color == 0 { + color = 0x5865f2 + } + + embed := &discordgo.MessageEmbed{ + Title: title, + Description: p.EmbedDesc, + Color: color, + } + components := []discordgo.MessageComponent{ + discordgo.ActionsRow{Components: []discordgo.MessageComponent{ + discordgo.Button{ + Label: "Créer une convocation", + Style: discordgo.PrimaryButton, + CustomID: fmt.Sprintf("convoc:panel:%s", p.GuildID), + }, + }}, + } + + if p.MessageID != "" { + _, editErr := b.session.ChannelMessageEditComplex(&discordgo.MessageEdit{ + Channel: p.ChannelID, + ID: p.MessageID, + Embeds: &[]*discordgo.MessageEmbed{embed}, + Components: &components, + }) + if editErr == nil { + return nil + } + // Message deleted — fall through to send new + _ = b.convocPanelRepo.SetMessage(ctx, panelID, "") + } + + msg, err := b.session.ChannelMessageSendComplex(p.ChannelID, &discordgo.MessageSend{ + Embeds: []*discordgo.MessageEmbed{embed}, + Components: components, + }) + if err != nil { + return fmt.Errorf("send convoc panel: %w", err) + } + return b.convocPanelRepo.SetMessage(ctx, panelID, msg.ID) +} + func sanitizeConvocUsername(username string) string { var out []byte for _, b := range []byte(username) { diff --git a/internal/panel/bot_service.go b/internal/panel/bot_service.go index e563cf1..ec43ce3 100644 --- a/internal/panel/bot_service.go +++ b/internal/panel/bot_service.go @@ -11,4 +11,5 @@ type BotService interface { DeletePanelMessage(panelID int64) error CreateConvocation(guildID, staffDiscordID, targetDiscordID, reason string) (channelID string, err error) SendConvocPanel(guildID string) error + SendConvocPanelByID(panelID int64) error } diff --git a/internal/panel/handlers/convocations.go b/internal/panel/handlers/convocations.go index b3ab6d6..1240744 100644 --- a/internal/panel/handlers/convocations.go +++ b/internal/panel/handlers/convocations.go @@ -1,9 +1,11 @@ package handlers import ( + "fmt" "net/http" "strings" + "github.com/go-chi/chi/v5" "github.com/leolionad58/ticketbot/internal/db" panelauth "github.com/leolionad58/ticketbot/internal/panel/auth" ) diff --git a/internal/panel/server.go b/internal/panel/server.go index 0f5f9a9..ffcdb10 100644 --- a/internal/panel/server.go +++ b/internal/panel/server.go @@ -28,6 +28,7 @@ func NewServer( auditRepo *db.AuditLogRepo, panelRepo *db.PanelConfigRepo, convocRepo *db.ConvocationConfigRepo, + convocPanelRepo *db.ConvocationPanelRepo, guildID string, bot BotService, ) *Server { @@ -90,12 +91,13 @@ func NewServer( } } convocH := &handlers.ConvocationsHandler{ - TicketRepo: sqlDB, - ConvocRepo: convocRepo, - GuildID: guildID, - BotService: convocBot, - DiscordInfo: convocInfo, - Renderer: rnd, + TicketRepo: sqlDB, + ConvocRepo: convocRepo, + ConvocPanelRepo: convocPanelRepo, + GuildID: guildID, + BotService: convocBot, + DiscordInfo: convocInfo, + Renderer: rnd, } transcriptsH := &handlers.TranscriptsHandler{ TicketRepo: sqlDB, @@ -153,7 +155,10 @@ func NewServer( // Convocations r.Get("/convocations", convocH.HandleGET) r.Post("/convocations", convocH.HandlePOST) - r.Post("/convocations/send-panel", convocH.HandleSendPanel) + r.Post("/convocations/create", convocH.HandleCreate) + r.Post("/convocations/panels/new", convocH.HandleCreatePanel) + r.Post("/convocations/panels/{id}/send", convocH.HandleSendPanel) + r.Post("/convocations/panels/{id}/delete", convocH.HandleDeletePanel) // Transcripts (list + download only; view is outside securityHeaders) r.Get("/transcripts", transcriptsH.HandleList) diff --git a/internal/panel/templates/convocations.html b/internal/panel/templates/convocations.html index 75e49c6..6ba6443 100644 --- a/internal/panel/templates/convocations.html +++ b/internal/panel/templates/convocations.html @@ -32,58 +32,98 @@ -
-

Panel Discord (bouton convocation)

-
-
- - -
-
- - -
-
- - -
-
- - -
-
-
- -
+
+
- - {{if and .Config .Config.PanelChannelID}} -
-
- - -
- {{if and .Config .Config.PanelMessageID}} - Panel envoyé + +
+

Panels de convocation

+ + {{if .ConvocPanels}} +
+ {{range .ConvocPanels}} +
+
+
+

{{.EmbedTitle}}

+

Salon : {{if .ChannelID}}{{.ChannelID}}{{else}}Non configuré{{end}} + {{if .MessageID}}● Envoyé{{end}} +

+
+
+ {{if .ChannelID}} +
+ + +
+ {{end}} +
+ + +
+
+
{{end}}
{{end}} + + +
+ + + + + Ajouter un nouveau panel + +
+ + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
+