【问题标题】:I'm working on a leveling system bot but i want to add xp every 5 second when the user join voice channel我正在开发一个调平系统机器人,但我想在用户加入语音频道时每 5 秒添加一次 xp
【发布时间】:2021-06-05 23:34:08
【问题描述】:

我想在用户按间隔加入语音频道时添加 xp,但当他们离开频道时它仍然给 xp

我的代码

client.on('voiceStateUpdate', (oldMember, newMember) => {
  let newUserChannel = newMember.channelID; 
  
   const interval = setInterval (() => {
     if (newUserChannel) {
const user =  Levels.fetch(newMember.id, newMember.guild.id);
console.log(`${newMember.id} server ${newMember.guild.id} level : ${user.level} xp : ${user.xp}`)


Levels.appendXp(newMember.id, newMember.guild.id, 1)



     }else {
       const channel = newMember.guild.channels.cache.find(channel => channel.id === "848698518537633895")
       
       channel.send("left channel ").then(clearInterval(interval))
       }
   }, 5000)})

【问题讨论】:

    标签: discord discord.js bots


    【解决方案1】:

    interval 是每次voiceStateUpdate 事件发生时创建的局部变量。

    因此,当用户离开时,您实际上是在调用clearInterval(undefined);,您正在清除一个新的间隔,它什么都不做。此事件发出的状态对象不会自行更新。

    您需要将这些间隔存储在事件侦听器之外的对象中;像这样:

    const XPIntervals = {};
    
    client.on("voiceStateUpdate", (oldState, newState) => {
      const connected = !!newState.channelID,
        userId = newState.id;
    
      if (connected) {
        // intervals don't exist yet
        if (typeof XPIntervals[userId] === "undefined") {
          XPIntervals[userId] = setInterval(() => {
            increaseExp();
          }, 5e3 /* 5 seconds */);
        }
      } else {
        // user left, clear the interval
        clearInterval(XPIntervals[userId]);
    
        // remove the interval object, so it can be created again later
        delete XPIntervals[userId];
      }
    });
    

    【讨论】:

      猜你喜欢
      • 2021-09-10
      • 1970-01-01
      • 2023-02-25
      • 1970-01-01
      • 2021-07-13
      • 2020-07-16
      • 2020-09-07
      • 2020-11-07
      • 2021-04-03
      相关资源
      最近更新 更多