所以我正在为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");
}
})
});
有人知道我是如何从数组中拼接已经提到的名字的吗?
发布于 2017-04-14 06:46:49
为了避免重复,您需要存储已经提到的用户的it,并在每次运行用户列表时(例如,每周一次)从您的用户列表副本中删除这些it。在提到所有用户之前,您必须重置。
存储ID的方式有很多种。例如,您可以将它们放入数据库中,也可以将它们保存到服务器上存储的JSON文件中。
发布于 2017-04-18 17:48:26
首先,我同意Erik的观点,即您需要显式地确保不会两次选择同一个成员。这可以通过将您已经选择(或仍然需要选择)的成员存储在数据库中来完成。我们没有足够的细节来帮助您如何做到这一点。
然而,我想补充的是,选择随机成员而不重复的最好方法不是随机选择一个用户,并确保您以前没有选择过该成员。这可能需要很长时间。您可以从数组中删除成员,但还有另一种方法。
Shuffle (在right way中!)成员数组,然后简单地按顺序遍历它们。当所有成员都被选中后,您可以再次混洗。下面是一个使用ES6语法和generator的示例,因为这似乎是它的理想用例。如果browser support (没有IE,其他主要浏览器都可以)不是问题,您可以通过将list.members
传递给uniqueRandomIterate
并在您的间隔中使用iterator.next().value
来使用它。
function shuffle(a) {
for (let i = a.length; i; i--) {
let j = Math.floor(Math.random() * i);
[a[i - 1], a[j]] = [a[j], a[i - 1]];
}
}
function* uniqueRandomIterate(array) {
var ind = 0;
while (true) {
shuffle(array);
for (let i = 0; i < members.length; ++i) {
yield array[i];
}
console.log('got everyone, starting over');
}
}
var members = ['a', 'b', 'c', 'd', 'e', 'f'],
iterator = uniqueRandomIterate(members);
for (let i = 0; i < 3 * members.length; ++i) {
console.log(iterator.next().value);
}
.as-console-wrapper {
max-height: 100% !important;
}
https://stackoverflow.com/questions/43398069
复制相似问题