- Introduced a new default role service and repository for managing default roles assigned to new members. - Added command to set the default role through the bot's configuration. - Implemented event handling to assign the default role to new guild members upon joining. - Updated main application to include the new default role service in the bot's services.
134 lines
4.0 KiB
Go
134 lines
4.0 KiB
Go
package events
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"velox-bot/internal/db/services"
|
|
|
|
"github.com/bwmarrin/discordgo"
|
|
)
|
|
|
|
// HandleGuildMemberAdd sends a configurable welcome message in a guild channel
|
|
// and an optional configurable DM to the joining user.
|
|
func HandleGuildMemberAdd(s *discordgo.Session, m *discordgo.GuildMemberAdd, svc *services.Services) {
|
|
if s == nil || m == nil || svc == nil || svc.Welcome == nil {
|
|
return
|
|
}
|
|
if m.User == nil {
|
|
return
|
|
}
|
|
|
|
ctx := context.Background()
|
|
guildID := mustParseInt64(m.GuildID)
|
|
|
|
settings, err := svc.Welcome.GetSettings(ctx, guildID)
|
|
if err != nil {
|
|
log.Printf("welcome: failed to load settings for guild %s: %v", m.GuildID, err)
|
|
return
|
|
}
|
|
hasWelcomeChannel := settings != nil && settings.ChannelID != 0
|
|
|
|
memberMention := m.User.Mention()
|
|
|
|
// Resolve guild/server name and user avatar for placeholders / visuals.
|
|
guildName := ""
|
|
userAvatarURL := ""
|
|
if g, err := s.State.Guild(m.GuildID); err == nil && g != nil {
|
|
guildName = g.Name
|
|
} else if g, err := s.Guild(m.GuildID); err == nil && g != nil {
|
|
guildName = g.Name
|
|
}
|
|
if m.User.Avatar != "" {
|
|
userAvatarURL = discordgo.EndpointUserAvatar(m.User.ID, m.User.Avatar)
|
|
}
|
|
|
|
if hasWelcomeChannel {
|
|
// Build guild welcome message.
|
|
channelID := strconv.FormatInt(settings.ChannelID, 10)
|
|
welcomeMsg := strings.TrimSpace(settings.WelcomeMessage)
|
|
if welcomeMsg == "" {
|
|
// Default message when none configured.
|
|
// "<user>! Welcome to <server>! Have fun!"
|
|
welcomeMsg = "<user>! Welcome to <server>! Have fun!"
|
|
}
|
|
welcomeMsg = strings.ReplaceAll(welcomeMsg, "{user}", memberMention)
|
|
if guildName != "" {
|
|
welcomeMsg = strings.ReplaceAll(welcomeMsg, "{server}", guildName)
|
|
welcomeMsg = strings.ReplaceAll(welcomeMsg, "<server>", guildName)
|
|
}
|
|
welcomeMsg = strings.ReplaceAll(welcomeMsg, "<user>", memberMention)
|
|
|
|
embed := &discordgo.MessageEmbed{
|
|
Title: "👋 Welcome!",
|
|
Description: welcomeMsg,
|
|
Color: 0xFFA500,
|
|
Footer: &discordgo.MessageEmbedFooter{
|
|
Text: "ID: " + m.User.ID,
|
|
},
|
|
}
|
|
if userAvatarURL != "" {
|
|
embed.Author = &discordgo.MessageEmbedAuthor{
|
|
Name: m.User.Username,
|
|
IconURL: userAvatarURL,
|
|
}
|
|
embed.Thumbnail = &discordgo.MessageEmbedThumbnail{
|
|
URL: userAvatarURL,
|
|
}
|
|
}
|
|
gif := strings.TrimSpace(settings.WelcomeGIFURL)
|
|
if gif == "" {
|
|
// Default GIF when none configured.
|
|
gif = "https://images-ext-1.discordapp.net/external/uJ6XfdK2WwDnei3RmNWUqSiOVboC4mK9r78TtgVE_9g/https/media.giphy.com/media/XD9o33QG9BoMis7iM4/giphy.gif"
|
|
}
|
|
embed.Image = &discordgo.MessageEmbedImage{URL: gif}
|
|
|
|
if _, err := s.ChannelMessageSendComplex(channelID, &discordgo.MessageSend{
|
|
Content: memberMention,
|
|
Embed: embed,
|
|
}); err != nil {
|
|
log.Printf("welcome: failed to send channel welcome in guild %s: %v", m.GuildID, err)
|
|
}
|
|
}
|
|
|
|
// Optional DM.
|
|
dmText := ""
|
|
if settings != nil {
|
|
dmText = strings.TrimSpace(settings.WelcomeDM)
|
|
}
|
|
if dmText == "" {
|
|
// Default DM when none configured.
|
|
// "Welcome to <server>! Have fun!"
|
|
dmText = "Welcome to <server>! Have fun!"
|
|
}
|
|
dmText = strings.ReplaceAll(dmText, "{user}", memberMention)
|
|
if guildName != "" {
|
|
dmText = strings.ReplaceAll(dmText, "{server}", guildName)
|
|
dmText = strings.ReplaceAll(dmText, "<server>", guildName)
|
|
}
|
|
|
|
dmCh, err := s.UserChannelCreate(m.User.ID)
|
|
if err != nil {
|
|
log.Printf("welcome: failed to create DM channel for user %s: %v", m.User.ID, err)
|
|
return
|
|
}
|
|
if _, err := s.ChannelMessageSend(dmCh.ID, dmText); err != nil {
|
|
log.Printf("welcome: failed to send DM welcome to user %s: %v", m.User.ID, err)
|
|
}
|
|
|
|
// Default role assignment.
|
|
if svc.DefaultRole != nil {
|
|
roleID, err := svc.DefaultRole.GetRole(ctx, guildID)
|
|
if err != nil {
|
|
log.Printf("defaultrole: failed to get default role for guild %s: %v", m.GuildID, err)
|
|
} else if roleID != 0 {
|
|
if err := s.GuildMemberRoleAdd(m.GuildID, m.User.ID, strconv.FormatInt(roleID, 10)); err != nil {
|
|
log.Printf("defaultrole: failed to assign role %d to user %s in guild %s: %v", roleID, m.User.ID, m.GuildID, err)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|