package reactionroles import ( "fmt" "log" "github.com/bwmarrin/discordgo" ) type Handler struct { GuildID string ChannelID string MsgRoleMap map[string]int64 } func (h *Handler) Register(sess *discordgo.Session) { sess.AddHandler(h.handleReactionAdd) sess.AddHandler(h.handleReactionRemove) log.Printf("[ReactionRoles] Registered handler for channel %s (%d message-role mappings)", h.ChannelID, len(h.MsgRoleMap)) } func (h *Handler) handleReactionAdd(s *discordgo.Session, event *discordgo.MessageReactionAdd) { if event.UserID == s.State.User.ID { return } if event.ChannelID != h.ChannelID { return } roleID, ok := h.MsgRoleMap[event.MessageID] if !ok { return } err := s.GuildMemberRoleAdd(h.GuildID, event.UserID, fmt.Sprintf("%d", roleID)) if err != nil { log.Printf("[ReactionRoles] Error adding role %d to user %s: %v", roleID, event.UserID, err) } else { log.Printf("[ReactionRoles] Added role %d to user %s", roleID, event.UserID) } } func (h *Handler) handleReactionRemove(s *discordgo.Session, event *discordgo.MessageReactionRemove) { if event.UserID == s.State.User.ID { return } if event.ChannelID != h.ChannelID { return } roleID, ok := h.MsgRoleMap[event.MessageID] if !ok { return } err := s.GuildMemberRoleRemove(h.GuildID, event.UserID, fmt.Sprintf("%d", roleID)) if err != nil { log.Printf("[ReactionRoles] Error removing role %d from user %s: %v", roleID, event.UserID, err) } else { log.Printf("[ReactionRoles] Removed role %d from user %s", roleID, event.UserID) } }