根据服务器上的X时间将用户转移到其他角色

时间:2019-01-21 17:03:45

标签: node.js discord discord.js

我已经搞混了很长时间了,但我似乎没有使它起作用。
我希望我的Discord机器人在用户获得“ Novitiate”角色时自动分配其他角色。这是因为我想给新兵一个完整的“会员”一个星期的测试期,让他们加入我们的游戏公会。
如何使用Discord机器人将其自动化?

到目前为止,我一直在尝试这样的事情,但无济于事:

bot.on('message', message => {
    if (message.member.roles.has(role => role.name === 'Novitiate')) {
       // user has that role
       message.member.addRole('Member');
       console.log(`User has been moved to new role!`);
    }
});

我不知道当用户赋予特定角色(Novitiate)时如何设置“计时器”,所以我希望有人能指出我正确的方向。

1 个答案:

答案 0 :(得分:0)

Discord.js有一个事件,您可以收听名为guildMemberUpdate的事件,只要公会成员得到……好……更新,该事件就会被触发。其中包括添加/删除角色。这意味着您可以收听成员更新,并确定用户是否已获得新角色以及该新角色是否为“正在导航”。

之后,您需要将时间戳记/日期保存在文件或某些数据库中,并定期进行检查。如果用户获得角色已超过7天,请为该用户分配一个新角色。

一些示例代码(未经测试,但应该给出想法):

bot.on('guildMemberUpdate', (oldMember, newMember) => {
    if (!(oldMember.roles.has(role => role.name === 'Novitiate')) &&
        newMember.roles.has(role => role.name === 'Novitiate')) {
       // member has gotten the role 'Novitiate'

       // This doesn't work, it just a demo on saving the timestamp
       database.save('assignedRole', { user: newMember.id, guild: newMember.guild, date: new Date() });
    }
});

function periodicalCheck () {
    let rows = database.get('assignedRole');
    let alteredRows = rows;

    for (let row of rows) {
        if (dateDiff(row.date) >= 7) {
            let guild = bot.guilds.find(guild => guild.id === row.guild);
            let member = guild.members.find(member => member.id === row.user);
            member.addRole('Member');
            alteredRows.splice(alteredRows.indexOf(row), 1);
        }
    }

    // Remove the records which have been used to clean up the database
    database.set('assignedRole', alteredRows);
}

function dateDiff (date) {
    let timeDiff = Math.abs(new Date().getTime() - new Date(date).getTime());
    return Math.ceil(timeDiff / (1000 * 3600 * 24)); 
}

现在唯一要做的就是找到一种存储信息并以一定间隔调用periodicalCheck方法的方法。