基于变量添加和删除角色

Adding and removing roles based on variables

我已经编写了完成这项工作所需的大约 95% 的代码,只需要完成它,以便发送的嵌入消息显示角色已正确调整的人员列表。有人能给我指出正确的方向,让我正确地对成员进行排序并在嵌入中正确发布吗?

代码如下:

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

        rows.slice().forEach(row => {
            const discord = row.discord
            const member = bot.users.cache.get(discord)
            const rank = 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))

            if (days >= 14 && messages >= 150 && rank === 'Recruit') {
                member.roles.remove(member.guild.roles.cache.find(role => role.name === 'Recruit'))
                member.roles.add(member.guild.roles.cache.find(role => role.name === 'Noble'))
            } else if (days >= 30 && messages >= 750 && rank === 'Noble') {
                member.roles.remove(member.guild.roles.cache.find(role => role.name === 'Noble'))
                member.roles.add(member.guild.roles.cache.find(role => role.name === 'Hero'))
            } else if (days >= 90 && messages >= 1500 && rank === 'Hero') {
                member.roles.remove(member.guild.roles.cache.find(role => role.name === 'Hero'))
                member.roles.add(member.guild.roles.cache.find(role => role.name === 'Fabled'))
            } else if (days >= 180 && messages >= 3000 && rank === 'Fabled') {
                member.roles.remove(member.guild.roles.cache.find(role => role.name === 'Fabled'))
                member.roles.add(member.guild.roles.cache.find(role => role.name === 'Mythic'))
            } else if (days >= 365 && messages >= 6000 && rank === 'Mythic') {
                member.roles.remove(member.guild.roles.cache.find(role => role.name === 'Mythic'))
                member.roles.add(member.guild.roles.cache.find(role => role.name === 'Legend'))
            }

            const noble = a //This needs to be set up
            const hero = b //This needs to be set up
            const fabled = c //This needs to be set up
            const mythic = d //This needs to be set up
            const legend = e //This needs to be set up

            const promotionEmbed = new Discord.MessageEmbed()
                .setColor('#ff6600')
                .setTitle('Promotions')
                .setDescription(`The following members have been promoted:`)
                .addFields({
                    name: 'Noble',
                    value: `${noble.join('\n')}` || 'None', //This needs to be set up
                    inline: true
                }, {
                    name: 'Hero',
                    value: `${hero.join('\n')}` || 'None', //This needs to be set up
                    inline: true
                }, {
                    name: 'Fabled',
                    value: `${fabled.join('\n')}` || 'None', //This needs to be set up
                    inline: true
                }, {
                    name: 'Mythic',
                    value: `${mythic.join('\n')}` || 'None', //This needs to be set up
                    inline: true
                }, {
                    name: 'Legend',
                    value: `${legend.join('\n')}` || 'None', //This needs to be set up
                    inline: true
                })

            genchat.send(promotionEmbed)
        })
    })
})

这个怎么样?

const noble = member.guild.members.cache.filter(member => member.roles.cache.find(role => role.name == "Noble")).array();
const hero =  member.guild.members.cache.filter(member => member.roles.cache.find(role => role.name == "Hero")).array();
const fabled = member.guild.members.cache.filter(member => member.roles.cache.find(role => role.name == "Fabled")).array();
const mythic = member.guild.members.cache.filter(member => member.roles.cache.find(role => role.name == "Mythic")).array();
const legend = member.guild.members.cache.filter(member => member.roles.cache.find(role => role.name == "Legend")).array();

你过滤公会成员,留下有角色的。

编辑:

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

        let noble = []
        let hero = []
        let fabled = []
        let mythic = []
        let legend = []

        rows.slice().forEach(row => {
            const discord = row.discord
            const member = bot.users.cache.get(discord)
            const rank = 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))

            if (days >= 14 && messages >= 150 && rank === 'Recruit') {
                member.roles.remove(member.guild.roles.cache.find(role => role.name === 'Recruit'))
                member.roles.add(member.guild.roles.cache.find(role => role.name === 'Noble'))
                noble.push(member)
            } else if (days >= 30 && messages >= 750 && rank === 'Noble') {
                member.roles.remove(member.guild.roles.cache.find(role => role.name === 'Noble'))
                member.roles.add(member.guild.roles.cache.find(role => role.name === 'Hero'))
                hero.push(member)
            } else if (days >= 90 && messages >= 1500 && rank === 'Hero') {
                member.roles.remove(member.guild.roles.cache.find(role => role.name === 'Hero'))
                member.roles.add(member.guild.roles.cache.find(role => role.name === 'Fabled'))
                fabled.push(member)
            } else if (days >= 180 && messages >= 3000 && rank === 'Fabled') {
                member.roles.remove(member.guild.roles.cache.find(role => role.name === 'Fabled'))
                member.roles.add(member.guild.roles.cache.find(role => role.name === 'Mythic'))
                mythic.push(member)
            } else if (days >= 365 && messages >= 6000 && rank === 'Mythic') {
                member.roles.remove(member.guild.roles.cache.find(role => role.name === 'Mythic'))
                member.roles.add(member.guild.roles.cache.find(role => role.name === 'Legend'))
                legend.push(member)
            }
        })

        const promotionEmbed = new Discord.MessageEmbed()
            .setColor('#ff6600')
            .setTitle('Promotions')
            .setDescription(`The following members have been promoted:`)
            .addFields({
                name: 'Noble',
                value: `${noble.join('\n')}` || 'None', //This needs to be set up
                inline: true
            }, {
                name: 'Hero',
                value: `${hero.join('\n')}` || 'None', //This needs to be set up
                inline: true
            }, {
                name: 'Fabled',
                value: `${fabled.join('\n')}` || 'None', //This needs to be set up
                inline: true
            }, {
                name: 'Mythic',
                value: `${mythic.join('\n')}` || 'None', //This needs to be set up
                inline: true
            }, {
                name: 'Legend',
                value: `${legend.join('\n')}` || 'None', //This needs to be set up
                inline: true
            })
        genchat.send(promotionEmbed)

    })
})

如果我没理解错的话,每一行都是一个discord用户。您需要在 foreach 之外累积对用户的更改。并在for循环结束后发送消息。

还没有测试过,希望对你有帮助。

Skulaurun 让我从 95% 提高到 99%,只需调整成员的定义方式并添加更多 sql 来更新数据库,但这是完成的工作代码。

此代码根据存储在 mysql 数据库中的服务器 activity(发送的消息)和时间(他们注册到服务器的时间)信息分配成员角色。

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

        const genchat = bot.channels.cache.get('785187526477742141');

        let noble = []
        let hero = []
        let fabled = []
        let mythic = []
        let legend = []

        rows.slice().forEach(row => {
            const guild = bot.guilds.cache.get('779892144026288179')
            const discord = row.discord
            const member = guild.members.cache.get(discord)
            const rank = 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))

            if (days >= 14 && messages >= 150 && rank === 'Recruit') {
                member.roles.remove(guild.roles.cache.find(role => role.name === 'Recruit'))
                member.roles.add(guild.roles.cache.find(role => role.name === 'Noble'))

                noble.push(member)

                con.query(`UPDATE users SET rank = 'Noble' WHERE discord = '${member.user.id}'`, (err) => {
                    if (err) throw err
                })
            } else if (days >= 30 && messages >= 750 && rank === 'Noble') {
                member.roles.remove(guild.roles.cache.find(role => role.name === 'Noble'))
                member.roles.add(guild.roles.cache.find(role => role.name === 'Hero'))

                hero.push(member)

                con.query(`UPDATE users SET rank = 'Hero' WHERE discord = '${member.user.id}'`, (err) => {
                    if (err) throw err
                })
            } else if (days >= 90 && messages >= 1500 && rank === 'Hero') {
                member.roles.remove(guild.roles.cache.find(role => role.name === 'Hero'))
                member.roles.add(guild.roles.cache.find(role => role.name === 'Fabled'))

                fabled.push(member)

                con.query(`UPDATE users SET rank = 'Fabled' WHERE discord = '${member.user.id}'`, (err) => {
                    if (err) throw err
                })
            } else if (days >= 180 && messages >= 3000 && rank === 'Fabled') {
                member.roles.remove(guild.roles.cache.find(role => role.name === 'Fabled'))
                member.roles.add(guild.roles.cache.find(role => role.name === 'Mythic'))

                mythic.push(member)

                con.query(`UPDATE users SET rank = 'Mythic' WHERE discord = '${member.user.id}'`, (err) => {
                    if (err) throw err
                })
            } else if (days >= 365 && messages >= 6000 && rank === 'Mythic') {
                member.roles.remove(guild.roles.cache.find(role => role.name === 'Mythic'))
                member.roles.add(guild.roles.cache.find(role => role.name === 'Legend'))
                
                legend.push(member)

                con.query(`UPDATE users SET rank = 'Legend' WHERE discord = '${member.user.id}'`, (err) => {
                    if (err) throw err
                })
            }
        })

        const promotionEmbed = new Discord.MessageEmbed()
            .setColor('#ff6600')
            .setTitle('Promotions')
            .setDescription(`The following members have been promoted:`)
            .addFields({
                name: 'Noble',
                value: `${noble.join('\n')}` || 'None',
                inline: true
            }, {
                name: 'Hero',
                value: `${hero.join('\n')}` || 'None',
                inline: true
            }, {
                name: 'Fabled',
                value: `${fabled.join('\n')}` || 'None',
                inline: true
            }, {
                name: 'Mythic',
                value: `${mythic.join('\n')}` || 'None',
                inline: true
            }, {
                name: 'Legend',
                value: `${legend.join('\n')}` || 'None',
                inline: true
            })
        genchat.send(promotionEmbed)

    })
});