基于变量的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
相关产品推荐
相关产品推荐

