我已经搞混了很长时间了,但我似乎没有使它起作用。
我希望我的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)时如何设置“计时器”,所以我希望有人能指出我正确的方向。
答案 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
方法的方法。