diff --git a/internal/community/commands.go b/internal/community/commands.go index 9087130..a6ed170 100644 --- a/internal/community/commands.go +++ b/internal/community/commands.go @@ -2,7 +2,7 @@ package community import ( "github.com/Neon-Genesis-Linux/pen-bot/internal/core" - "github.com/disgoorg/disgo/discord" + "github.com/Neon-Genesis-Linux/pen-bot/internal/messaging" "github.com/disgoorg/disgo/events" ) @@ -13,9 +13,9 @@ func Register() { } func handlePing(event *events.MessageCreate) { - _, _ = event.Client().Rest.CreateMessage(event.ChannelID, discord.NewMessageCreate().WithContent("pong")) + _ = messaging.SendReply(event, "pong") } func handlePong(event *events.MessageCreate) { - _, _ = event.Client().Rest.CreateMessage(event.ChannelID, discord.NewMessageCreate().WithContent("ping")) + _ = messaging.SendReply(event, "ping") } diff --git a/internal/messaging/message.go b/internal/messaging/message.go new file mode 100644 index 0000000..08f02f6 --- /dev/null +++ b/internal/messaging/message.go @@ -0,0 +1,51 @@ +package messaging + +import ( + "log/slog" + + "github.com/disgoorg/disgo/discord" + "github.com/disgoorg/disgo/events" +) + +// SendOptions configures message sending behavior +type SendOptions struct { + Reply bool // If true, reply to the triggering message +} + +// SendMessage sends a message with optional reply. +// Errors are logged but not returned to user. +// Returns error for caller's information if needed. +func SendMessage(event *events.MessageCreate, content string, opts *SendOptions) error { + if opts == nil { + opts = &SendOptions{} + } + + builder := discord.NewMessageCreate().WithContent(content) + + if opts.Reply { + messageID := event.Message.ID + builder = builder.WithMessageReference(&discord.MessageReference{ + MessageID: &messageID, + }) + } + + _, err := event.Client().Rest.CreateMessage(event.ChannelID, builder) + if err != nil { + slog.Error("failed to send message", + slog.String("channel_id", event.ChannelID.String()), + slog.String("content", content), + slog.Any("error", err), + ) + } + return err +} + +// Send sends a simple message (no reply) +func Send(event *events.MessageCreate, content string) error { + return SendMessage(event, content, nil) +} + +// SendReply sends a message as a reply to the user's message +func SendReply(event *events.MessageCreate, content string) error { + return SendMessage(event, content, &SendOptions{Reply: true}) +}