63 lines
1.6 KiB
Go
63 lines
1.6 KiB
Go
package lib
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/bwmarrin/discordgo"
|
|
)
|
|
|
|
// Represents a function that processes a message
|
|
type MessageProcessor func(s *discordgo.Session, m *discordgo.MessageCreate, ctx *ProcessContext) error
|
|
|
|
// Holds shared data between processors
|
|
type ProcessContext struct {
|
|
UserID int
|
|
GuildID string
|
|
DiscordUser *discordgo.User
|
|
}
|
|
|
|
// Handles the registration and execution of message processors
|
|
type MessageProcessorManager struct {
|
|
processors []MessageProcessor
|
|
}
|
|
|
|
// Creates a new MessageProcessorManager
|
|
func NewMessageProcessorManager() *MessageProcessorManager {
|
|
return &MessageProcessorManager{
|
|
processors: make([]MessageProcessor, 0),
|
|
}
|
|
}
|
|
|
|
// Adds a new message processor to the manager
|
|
func (pm *MessageProcessorManager) RegisterProcessor(processor MessageProcessor) {
|
|
pm.processors = append(pm.processors, processor)
|
|
}
|
|
|
|
// Runs all registered processors on a message
|
|
func (pm *MessageProcessorManager) ProcessMessage(s *discordgo.Session, m *discordgo.MessageCreate) {
|
|
if m.Author.Bot {
|
|
return
|
|
}
|
|
|
|
// Create processing context
|
|
ctx := &ProcessContext{
|
|
GuildID: m.GuildID,
|
|
DiscordUser: m.Author,
|
|
}
|
|
|
|
// Get or create user and guild profile together
|
|
userID, err := GetOrCreateUserWithGuild(m.Author.ID, m.Author.Username, m.GuildID)
|
|
if err != nil {
|
|
ThrowWithError("MessageProcessor", fmt.Sprintf("failed to handle user and guild profile: %v", err))
|
|
return
|
|
}
|
|
|
|
ctx.UserID = userID
|
|
|
|
// Run each processor with the context
|
|
for _, processor := range pm.processors {
|
|
if err := processor(s, m, ctx); err != nil {
|
|
ThrowWithError("MessageProcessor", err.Error())
|
|
}
|
|
}
|
|
}
|