You need to enable JavaScript to run this app. 基于变量的Discord角色增减:如何正确在Embed消息中展示晋升用户列表
优惠活动
大模型
产品
解决方案
定价
更多

基于变量的Discord角色增减:如何正确在Embed消息中展示晋升用户列表

核心修改说明

你原有代码存在三个核心问题:

  • 未提前初始化等级对应存储数组,也没有在用户晋升时将用户归入对应分组
  • Embed创建与发送逻辑写在用户遍历循环内部,会导致每处理一个用户就发送一次公告,无法汇总所有晋升名单
  • 缺少晋升后同步更新数据库用户rank字段的逻辑,会导致后续重复触发晋升判定
  • 原代码直接取User对象操作角色会报错,需要从服务器成员缓存中获取GuildMember对象才有roles属性

修改后完整代码如下:

// 替换为你自己的Discord服务器ID
const GUILD_ID = '你的服务器ID'

cron.schedule('00 12 * * *', function () {
    con.query(`SELECT * FROM users WHERE member = 'Yes' AND user_registered < DATE_SUB(NOW(),INTERVAL 14 DAY)`, async (err, rows) => {
        if (err) throw err

        // 前置初始化各等级晋升存储数组
        const noble = []
        const hero = []
        const fabled = []
        const mythic = []
        const legend = []
        const guild = bot.guilds.cache.get(GUILD_ID)

        for (const row of rows) {
            const discordId = row.discord
            const member = guild.members.cache.get(discordId)
            // 成员不在服务器则直接跳过
            if (!member) continue

            const oldRank = row.rank
            const messages = row.messages
            const registered = row.user_registered
            const days = Math.round((Date.now() / 1000 / 60 / 60 / 24) - (registered / 1000 / 60 / 60 / 24))
            let newRank = null

            if (days >= 14 && messages >= 150 && oldRank === 'Recruit') {
                await member.roles.remove(guild.roles.cache.find(role => role.name === 'Recruit'))
                await member.roles.add(guild.roles.cache.find(role => role.name === 'Noble'))
                newRank = 'Noble'
                // 可将<@${discordId}>替换为member.user.username展示纯用户名
                noble.push(`<@${discordId}>`)
            } else if (days >= 30 && messages >= 750 && oldRank === 'Noble') {
                await member.roles.remove(guild.roles.cache.find(role => role.name === 'Noble'))
                await member.roles.add(guild.roles.cache.find(role => role.name === 'Hero'))
                newRank = 'Hero'
                hero.push(`<@${discordId}>`)
            } else if (days >= 90 && messages >= 1500 && oldRank === 'Hero') {
                await member.roles.remove(guild.roles.cache.find(role => role.name === 'Hero'))
                await member.roles.add(guild.roles.cache.find(role => role.name === 'Fabled'))
                newRank = 'Fabled'
                fabled.push(`<@${discordId}>`)
            } else if (days >= 180 && messages >= 3000 && oldRank === 'Fabled') {
                await member.roles.remove(guild.roles.cache.find(role => role.name === 'Fabled'))
                await member.roles.add(guild.roles.cache.find(role => role.name === 'Mythic'))
                newRank = 'Mythic'
                mythic.push(`<@${discordId}>`)
            } else if (days >= 365 && messages >= 6000 && oldRank === 'Mythic') {
                await member.roles.remove(guild.roles.cache.find(role => role.name === 'Mythic'))
                await member.roles.add(guild.roles.cache.find(role => role.name === 'Legend'))
                newRank = 'Legend'
                legend.push(`<@${discordId}>`)
            }

            // 同步更新数据库用户等级,避免下次重复判定晋升
            if (newRank) {
                con.query(`UPDATE users SET rank = ? WHERE discord = ?`, [newRank, discordId], (updateErr) => {
                    if (updateErr) console.error('用户等级更新失败:', updateErr)
                })
            }
        }

        // 所有用户处理完成后统一生成并发送公告
        const promotionEmbed = new Discord.MessageEmbed()
            .setColor('#ff6600')
            .setTitle('成员晋升公告')
            .setDescription(`本次晋升的成员名单如下:`)
            .addFields(
                {
                    name: 'Noble',
                    value: noble.join('\n') || '无',
                    inline: true
                }, 
                {
                    name: 'Hero',
                    value: hero.join('\n') || '无',
                    inline: true
                }, 
                {
                    name: 'Fabled',
                    value: fabled.join('\n') || '无',
                    inline: true
                }, 
                {
                    name: 'Mythic',
                    value: mythic.join('\n') || '无',
                    inline: true
                }, 
                {
                    name: 'Legend',
                    value: legend.join('\n') || '无',
                    inline: true
                }
            )

        genchat.send(promotionEmbed)
    })
})

内容的提问来源于stack exchange,提问作者Kaspr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 16:48:03