Javascript 如何避免重复用户在Slack中被bot提及?
所以我正在为Slack开发一个机器人,每周都会提到一个随机用户。我已经到了机器人可以做到这一点,但我不知道如何避免重复。正如您在下面的屏幕截图中所看到的,将显示重复的名称: 这是我的密码: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!');
// 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%!重要;
}
请在我的回答的注释中说明仍不清楚/缺失的内容。