首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使bot收费硬币与用户在话音信道中的状态无关

如何使bot收费硬币与用户在话音信道中的状态无关
EN

Stack Overflow用户
提问于 2020-05-22 12:52:21
回答 1查看 104关注 0票数 0

我正在用一个硬币系统制作一个机器人,一个人已经帮了我(费德里科·格兰迪(Federico Grandi ) @Federico Grandi),让机器人检查语音频道的用户以及他在那里的数量。现在我不知道如何让机器人在一分钟后立即列出硬币,而不是当用户注销时。

代码语言:javascript
运行
复制
let coins = require("./coins.json");

let voiceStates = {}

bot.on('voiceStateUpdate', (oldState, newState) => {

  let { id } = oldState

  if (!oldState.channel) {

    console.log('user joined voice channel');

    voiceStates[id] = new Date()

  } else if (!newState.channel) {
    console.log('user left voice channel')

    let now = new Date()

    let joined = voiceStates[id] || new Date()

    let dateDiff = now.getTime() - joined.getTime();

    if (oldState.selfMute === true && newState.selfMute === true){
        console.log('2');
    }

    if (dateDiff > 60 * 1000) {
      console.log('user earned 200 coins');

      coins[message.author.id] = {
        coins: coins[message.author.id].coins + 200

       };
      }
    }
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-22 14:07:19

试试这个:

代码语言:javascript
运行
复制
let coins = require("./coins.json");

let voiceStates = {};

bot.on('voiceStateUpdate', (oldState, newState) => {
  let { id } = oldState;

  if (!oldState.channel) {
    console.log('user joined voice channel');

    voiceStates[id] = { joined: new Date() };
    // If the user is not muted...
    if (!newState.selfMute) {
      // ...execute a callback a minute later (this may be cancelled: see below)
      voiceStates[id].timeout = setTimeout(() => {
        // charge the coins
        // do whatever after the user has been on the channel unmuted for a minute
      }, 60000);
    }
  } else if (!newState.channel || newState.selfMute) {
    // If the user left the channel or muted themselves and there is a timeout...
    if (voiceStates[id].timeout) {
      // ...cancel the timeout
      clearTimeout(voiceStates[id].timeout);
      voiceStates[id].timeout = undefined;
    }

    if (!newState.channel) {
      // rest of your code for if the user left the channel...
      console.log('user left voice channel');

      let now = new Date();

      // Only difference from your code is here
      let joined = voiceStates[id] && voiceStates[id].joined || new Date();

      let dateDiff = now.getTime() - joined.getTime();

      if (oldState.selfMute === true && newState.selfMute === true) {
        console.log('2');
      }

      if (dateDiff > 60 * 1000) {
        console.log('user earned 200 coins');

        coins[message.author.id] = {
          coins: coins[message.author.id].coins + 200
        };
      }
    }
  }
});

这使用setTimeout在一分钟后给硬币充电。如果用户离开频道或自行静音,此定时器将被取消/清除。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61955483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档