首页 > 解决方案 > 结束client.on函数

问题描述

我正在尝试制作一个锁定机器人,并且我已经完成了大部分工作,除了 end 命令。我试图以 client.on() 函数结束。任何帮助将不胜感激。这是我到目前为止的代码:

if (command == "lockdown") {
    if (!args[0]) return message.channel.send("Please type start or end.");

    if (args[0] === "start") {
       client.on('guildMemberAdd', (member) => {
          member.kick();
          console.log('kicked');
       })

     }

     if (args[0] === "end") {
      //i don't know what to put here.
    }
}

标签: javascriptnode.jsdiscord.js

解决方案


尽管 BigPouley 的方法可行,但还有一种更有效的方法。如果您EventEmitter#removeListener在锁定结束后拨打电话,它将完全停止收听Client#guildMemberAdd.

如果您考虑一下您认为服务器将处于锁定与否的时间,将会有很多公会成员经历了该事件,然后因为当前没有锁定而被拒绝。

这也等于浪费了很多内存,这显然是您不想要的。它可以像这样工作:

// before your `client.on('message')` event,
// you should declare the function to trigger
// when someone joins during lockdown
const lockdown = (member) => {
 member.kick();
 console.log('kicked');
};
// this is because to unsubscribe to an event,
// you need the origin function it was listening to

client.on('message', (message) => {
 // bla bla bla command handling...

 if (command == 'lockdown') {
  if (!args[0]) return message.channel.send('Please type start or end.');

  if (args[0] === 'start') {
   // you don't want to subscribe to an event twice,
   // so make sure there isn't a lockdown already in progress
   if (client.eventNames.includes('guildMemberAdd')) {
    // this server is already locked down!
   }

   // use the function you made
   client.on('guildMemberAdd', lockdown);
  }

  if (args[0] === 'end') {
   // now do the reverse and check if there
   // *isn't* a lockdown in progress
   if (!client.eventNames.includes('guildMemberAdd')) {
    // this server isn't locked down!
   }

   // now enter the *same* function to unsubscribe
   client.removeListener('guildMemberAdd', lockdown);
  }
 }
});

推荐阅读