Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.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
Javascript 如何避免重复用户在Slack中被bot提及?_Javascript_Bots_Slack Api_Slack_Botkit - Fatal编程技术网

Javascript 如何避免重复用户在Slack中被bot提及?

Javascript 如何避免重复用户在Slack中被bot提及?,javascript,bots,slack-api,slack,botkit,Javascript,Bots,Slack Api,Slack,Botkit,所以我正在为Slack开发一个机器人,每周都会提到一个随机用户。我已经到了机器人可以做到这一点,但我不知道如何避免重复。正如您在下面的屏幕截图中所看到的,将显示重复的名称: 这是我的密码: // Handle events related to the websocket connection to Slack controller.on('rtm_open', function (bot) { console.log('** The RTM api just connected!');

所以我正在为Slack开发一个机器人,每周都会提到一个随机用户。我已经到了机器人可以做到这一点,但我不知道如何避免重复。正如您在下面的屏幕截图中所看到的,将显示重复的名称:

这是我的密码:

// Handle events related to the websocket connection to Slack
controller.on('rtm_open', function (bot) {
  console.log('** The RTM api just connected!');

  // Get all users
  bot.api.users.list({}, function(err, list){

    // If list and members exist
    if (list && list.members) {

      list.members = list.members.filter(function(member) {
        return (member.real_name != undefined && member.real_name != "" && member.real_name != null && member.real_name != "slackbot");
      });

      // console.log(list.members);
      var previousRandomNumber = -1;

      // Every X amount of milliseconds
      var interval = setInterval(function() {
        var members = list.members;

        // Generating random number from 0 to how many members exist (exclusive) in the member list
        var randomNumber = Math.floor(Math.random() * members.length);

        console.log('1) previous: ' + previousRandomNumber + '  randomNumber ' + randomNumber);
        if (previousRandomNumber == randomNumber) {
          randomNumber = Math.floor(Math.random() * members.length);
        }
        console.log('2) previous: ' + previousRandomNumber + '  randomNumber ' + randomNumber);

        previousRandomNumber = randomNumber;

        // Get random name
        var randomName = members[randomNumber].name;

        //console.log(randomName);

        // If random name is null or undefined, reshuffle.
        if (randomName == null || randomName == "" || randomName == undefined) {
          console.log('user has been deleted');

          // clearInterval(interval);

        } else {
          console.log('actual person - ' + randomName);
          // Configuring webhook and sending message to channel
          bot.configureIncomingWebhook({url: 'https://hooks.slack.com/services/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'});
          bot.sendWebhook({
            text: '@' + randomName + ", you've been selected for #snapshot! ",
            channel: '#test',
          },function(err,res) {
            // handle error
          });
        }
      }, 3000); // 604800000 ms = 1 week
      console.log("message");
    }
  })
});


有人知道我如何拼接阵列中已提及的名称吗?

为了避免重复,您需要存储已提及的用户ID,并在每次运行时(例如,每周一次)从用户列表副本中删除这些ID。在提到所有用户之前,您必须重置

有许多方法可以存储ID。e、 g.您可以将它们放入数据库中,也可以将它们安全地放入存储在服务器上的JSON文件中。

首先,我同意您需要明确确保不会两次选择同一成员。这可以通过将您已经选择(或仍然需要选择)的成员存储在数据库中来实现。我们没有足够的细节来帮助你如何做到这一点

然而,我想补充的是,选择随机成员而不重复的最佳方法不是随机选择一个用户,并确保您以前没有选择该成员。这可能需要很长时间。可以从数组中删除成员,但还有另一种方法

(在中!)单击成员数组,然后按顺序在其上循环。选择所有成员后,可以再次洗牌。下面是一个使用ES6语法和a的示例,因为这似乎是它的理想用例。如果(没有IE,其他主要浏览器没有问题),您可以通过将
列表.members
传递到
uniquerandomite
并在间隔中使用
iterator.next().value
来使用它

函数洗牌(a){
for(设i=a.length;i;i--){
设j=Math.floor(Math.random()*i);
[a[i-1],a[j]=[a[j],a[i-1]];
}
}
函数*uniquerandomitate(数组){
var-ind=0;
while(true){
洗牌(阵法);
for(设i=0;i
。作为控制台包装器{
最大高度:100%!重要;

}
请在我的回答的注释中说明仍不清楚/缺失的内容。