【问题标题】:Adding and removing roles based on variables基于变量添加和删除角色
【发布时间】:2021-09-19 09:34:32
【问题描述】:

我已经编写了完成这项工作所需的大约 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)
        })
    })
})

【问题讨论】:

    标签: mysql cron discord.js


    【解决方案1】:

    这个怎么样?

    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)
    
        })
    })
    

    如果我理解正确,每一行都是一个不和谐用户。您需要将更改累积到 foreach 之外的用户。并在 for 循环结束后发送消息。

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

    【讨论】:

    • 这难道不会拉起该角色的所有成员,而不是那些角色被改变的成员吗?
    • 我已经更新了我的答案。那应该只发送具有调整角色的人。
    【解决方案2】:

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

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

    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)
    
        })
    });
    

    【讨论】:

      猜你喜欢
      • 2021-06-27
      • 2021-05-14
      • 2021-06-06
      • 2022-10-24
      • 2020-01-04
      • 2020-10-16
      • 2020-07-13
      • 1970-01-01
      • 2012-01-14
      相关资源
      最近更新 更多