package logger import ( "fmt" "log/slog" "github.com/bwmarrin/discordgo" "github.com/leolionad58/ticketbot/internal/config" "github.com/leolionad58/ticketbot/internal/db" ) type DiscordLogger struct { Session *discordgo.Session Config *config.Provider } func NewDiscordLogger(s *discordgo.Session, cfg *config.Provider) *DiscordLogger { return &DiscordLogger{Session: s, Config: cfg} } func (l *DiscordLogger) send(embed *discordgo.MessageEmbed) { cfg := l.Config.Get() if cfg.Bot.LogsChannel == "" { return } l.sendTo(cfg.Bot.LogsChannel, embed) } func (l *DiscordLogger) sendTo(channelID string, embed *discordgo.MessageEmbed) { if channelID == "" { return } if _, err := l.Session.ChannelMessageSendEmbed(channelID, embed); err != nil { slog.Error("discord log: send", "err", err) } } func (l *DiscordLogger) logChannel(ticket *db.Ticket) string { if ticket.LogChannelID != "" { return ticket.LogChannelID } return l.Config.Get().Bot.LogsChannel } func (l *DiscordLogger) LogTicketOpened(ticket *db.Ticket, userID string) { l.sendTo(l.logChannel(ticket), &discordgo.MessageEmbed{ Title: "Ticket ouvert", Color: 0x57f287, Fields: []*discordgo.MessageEmbedField{ {Name: "Type", Value: ticket.Type, Inline: true}, {Name: "Utilisateur", Value: fmt.Sprintf("<@%s>", userID), Inline: true}, {Name: "Channel", Value: fmt.Sprintf("<#%s>", ticket.ChannelID), Inline: true}, {Name: "Numéro", Value: fmt.Sprintf("%04d", ticket.TicketNumber), Inline: true}, }, }) } func (l *DiscordLogger) LogTicketClaimed(ticket *db.Ticket, staffID string) { l.sendTo(l.logChannel(ticket), &discordgo.MessageEmbed{ Title: "Ticket claim", Color: 0xfee75c, Fields: []*discordgo.MessageEmbedField{ {Name: "Staff", Value: fmt.Sprintf("<@%s>", staffID), Inline: true}, {Name: "Ticket", Value: fmt.Sprintf("<#%s>", ticket.ChannelID), Inline: true}, }, }) } func (l *DiscordLogger) LogTicketClosed(ticket *db.Ticket, staffID, reason, transcriptPath string) { l.sendTo(l.logChannel(ticket), &discordgo.MessageEmbed{ Title: "Ticket fermé", Color: 0xed4245, Fields: []*discordgo.MessageEmbedField{ {Name: "Staff", Value: fmt.Sprintf("<@%s>", staffID), Inline: true}, {Name: "Ticket", Value: fmt.Sprintf("%s-%04d", ticket.Type, ticket.TicketNumber), Inline: true}, {Name: "Raison", Value: reason}, }, }) } func (l *DiscordLogger) LogConvocationOpened(staffID, targetID, reason, channelID string) { l.send(&discordgo.MessageEmbed{ Title: "Convocation ouverte", Color: 0x5865f2, Fields: []*discordgo.MessageEmbedField{ {Name: "Staff", Value: fmt.Sprintf("<@%s>", staffID), Inline: true}, {Name: "Utilisateur", Value: fmt.Sprintf("<@%s>", targetID), Inline: true}, {Name: "Raison", Value: reason}, {Name: "Channel", Value: fmt.Sprintf("<#%s>", channelID), Inline: true}, }, }) } func (l *DiscordLogger) LogError(msg string, fields ...any) { slog.Error(msg, fields...) content := msg l.send(&discordgo.MessageEmbed{ Title: "Erreur critique", Description: content, Color: 0xff0000, }) }