feat: leveling system
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
package events
|
||||
|
||||
import (
|
||||
"context"
|
||||
"log"
|
||||
"strconv"
|
||||
"strings"
|
||||
"velox-bot/internal/db/services"
|
||||
|
||||
"github.com/bwmarrin/discordgo"
|
||||
)
|
||||
|
||||
func HandleMessageCreate(s *discordgo.Session, m *discordgo.MessageCreate, services *services.Services) {
|
||||
if m.Author.Bot || m.GuildID == "" {
|
||||
return
|
||||
}
|
||||
ctx := context.Background()
|
||||
guildID := mustParseInt64(m.GuildID)
|
||||
userID := mustParseInt64(m.Author.ID)
|
||||
res, err := services.Level.HandleMessage(ctx, guildID, userID)
|
||||
if err != nil || !res.LeveledUp {
|
||||
return
|
||||
}
|
||||
// Decide where to send the level-up message
|
||||
targetChannelID := m.ChannelID
|
||||
if res.LevelupChannel != 0 {
|
||||
targetChannelID = strconv.FormatInt(res.LevelupChannel, 10)
|
||||
}
|
||||
content, err := services.LevelSettings.GetLevelUpMessage(ctx, guildID)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
content = strings.ReplaceAll(content, "{user}", m.Author.Mention())
|
||||
content = strings.ReplaceAll(content, "{level}", strconv.Itoa(res.NewLevel))
|
||||
|
||||
s.ChannelMessageSend(targetChannelID, content)
|
||||
// Apply role reward if any
|
||||
if res.RoleRewardID != 0 {
|
||||
roleID := strconv.FormatInt(res.RoleRewardID, 10)
|
||||
if err := s.GuildMemberRoleAdd(m.GuildID, m.Author.ID, roleID); err != nil {
|
||||
log.Printf("Failed to add role reward: guild=%s user=%s role=%s err=%v", m.GuildID, m.Author.ID, roleID, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func mustParseInt64(s string) int64 {
|
||||
id, _ := strconv.ParseInt(s, 10, 64)
|
||||
return id
|
||||
}
|
||||
Reference in New Issue
Block a user