Discord.js client.on guildMemberAdd多次触发

时间:2020-10-06 21:36:51

标签: javascript node.js discord discord.js bots

正如标题所解释的,我在discord.js(v12)机器人上具有一个函数,该函数负责欢迎用户并在其上施加特定角色,这是这样的:

client.on("guildMemberAdd", member => {
    member.roles.add('604250195001081859');
    member.guild.channels.cache.get("707323130523418686").send(`Hi ${member.user} blabla`);
    console.log(member.user.id + ' is in da house');
});

现在,我有一个问题:每次有人加入服务器时,就像一次又一次地触发此事件,淹没了通道。

如果我设置“ client.once”,显然不会发生这种情况,但是在这种情况下,仅在用户的第一次访问时才给出该消息,而第二个用户则不再接收该消息。

我一直在到处寻找答案,但是我似乎是唯一遇到此问题的人,希望有人能帮助我。

p.s。 我想澄清一下,该机器人没有其他活动实例,它托管在小型vultr的vps上。

2 个答案:

答案 0 :(得分:0)

对我来说,这很常见,请访问discord dev门户并生成一个新令牌,然后将新令牌粘贴到您的代码中。由于某种原因,它可以同时运行您的机器人的多个实例并生成一个新令牌,从而可以解决该问题。我知道您说您没有正在运行的多个实例,但是您将无法看到这些实例,这是一个奇怪的错误。

答案 1 :(得分:0)

好的,过了一会儿我发现了问题......如果你在整个项目中遇到这个检查来找到这个方法调用:

client.login(<token>)

如果在 keepalive 函数中调用它,或者在任何情况下在服务器启动之后/之外多次调用的函数中调用它,它会创建一个新的机器人实例,每个实例都会响应事件,从而有效地创建大量消息(在聊天消息的情况下,但函数内部的任何操作都会根据创建的实例数量重复)。

简而言之,login() 方法只需要调用一次就可以避免创建新实例。

是的,你现在可以把所有你想要的烂番茄都扔给我。