Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 根据服务器上的X时间将用户移动到其他角色_Node.js_Discord_Discord.js - Fatal编程技术网

Node.js 根据服务器上的X时间将用户移动到其他角色

Node.js 根据服务器上的X时间将用户移动到其他角色,node.js,discord,discord.js,Node.js,Discord,Discord.js,我已经在这件事上胡闹了很长一段时间,但我似乎没有让它起作用。 我希望我的Discord机器人在用户获得“见习”角色时自动分配不同的角色。这是因为我想给我们游戏内公会的新成员一个为期一周的测试期,然后他们才能成为正式的“会员”。 我如何使用Discord机器人实现自动化 到目前为止,我一直在尝试这样的事情,但都没有用: bot.on('message', message => { if (message.member.roles.has(role => role.name ==

我已经在这件事上胡闹了很长一段时间,但我似乎没有让它起作用。
我希望我的Discord机器人在用户获得“见习”角色时自动分配不同的角色。这是因为我想给我们游戏内公会的新成员一个为期一周的测试期,然后他们才能成为正式的“会员”。
我如何使用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!`);
    }
});

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

Discord.js有一个事件,你可以听它调用它,每当公会成员被。。。好。。。更新。其中包括添加/删除角色。这意味着您可以侦听成员更新,并确定用户是否已获得新角色,以及该新角色是否为“新手”

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

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

bot.on('guildMemberUpdate',(旧成员,新成员)=>{
if(!(oldMember.roles.has(role=>role.name==='novatate'))&&
newMember.roles.has(role=>role.name==='noviate')){
//成员已获得“见习”角色
//这不起作用,它只是一个保存时间戳的演示
save('assignedRole',{user:newMember.id,guild:newMember.guild,date:newdate()});
}
});
函数周期检查(){
让rows=database.get('assignedRole');
让alteredRows=行;
for(让一行中的一行){
如果(日期差(行日期)>=7){
让guild=bot.guilds.find(guild=>guild.id==row.guild);
让member=guild.members.find(member=>member.id==row.user);
member.addRole(“成员”);
交替行拼接(交替行索引,1);
}
}
//删除用于清理数据库的记录
set('assignedRole',alteredRows);
}
函数dateDiff(日期){
让timeDiff=Math.abs(new Date().getTime()-new Date(Date).getTime());
返回数学单元(timeDiff/(1000*3600*24));
}

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

使用
setInterval
定期检查公会的所有用户(每10秒、30秒、1分钟或更多,取决于时间敏感度)。如果成员具有“见习”角色,请选中。如果现在比member.joinedAt至少多7天,则添加
成员
角色并删除
见习者
角色。此外,
array.has()
不是JavaScript内置函数(请参见第2行-
message.member.roles.has(…)
)。改为使用。@ItaiSteinherz是一个
集合
,它是一个对象扩展映射。而
map.has()
是一个完全有效的函数;)@MadWard我没有假设,因为您将函数传递给了
。has
。如果
roles
是一个
Map
,那么条件应该是
message.member.roles.array().some(role=>role.name===“novatite”)
@ItaiSteinherz,你是对的
message.member.roles.has
无法正常检查用户的角色。您的建议:
message.member.roles.array()。但有些(role=>role.name==='noviate')
会这样做。谢谢噢!没想到会这么难,因为我只知道一些基本的JS。这超出了我的范围,因为我不太理解您的示例(即periodicalCheck函数)。无论如何谢谢你!你不明白它的哪些部分?我也许能更好地解释它们我该如何将其保存在文件中?另外:
alteredRows.splice(alteredRows.indexOf(row),1)这是做什么的<代码>返回数学单元(timeDiff/(1000*3600*24))这里计算的是什么?3600秒=1小时,*24=天,1000=??@nerdrocker我不太明白你所说的“如何将此保存到文件中?”。。。至于其他问题,你可以在这里读到。对于
Math.ceil
部分,
new Date().getTime()
以毫秒为单位返回值,而不是以秒为单位。因此,要计算已经过去了多少天,可以将时间除以一天中的毫秒数。
Math.ceil
只需将值向上舍入为整数谢谢!好吧,你说:“在那之后,你需要将时间戳/日期保存在一个文件或某个数据库中,并定期检查。”-我的问题是:你如何做到这一点?我没有这方面的经验。这就是为什么我说的超出了我的范围。顺便说一句,我非常感谢你的帮助!