2017-04-13 52 views
3

所以我正在爲Slack工作,每週都會提到一個隨機用戶。我明白了bot的確如此,但我不確定如何避免重複。正如你可以看到下面的截圖,正在顯示重名:如何避免重複用戶被Slack中的bot提及?

duplicate names

這裏是我的代碼:

// 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"); 
    } 
    }) 
}); 

Link to repo on GitHub

有誰知道我怎麼會莫名其妙地拼接已經從數組中提到的名稱?

+1

請評論我的回答是什麼還不清楚/失蹤指定。 –

回答

4

爲避免重複,您需要存儲已提及的用戶的ID,並在您每次運行時從用戶列表的副本中刪除這些用戶的ID(例如每週一次)。在所有用戶都被提及之前,您必須重置。

有很多方法可以存儲這些ID。例如您可以將它們放入數據庫中,也可以將它們安全存儲到服務器上存儲的JSON文件中。

2

首先,我同意Erik您需要明確確保您不要兩次選擇相同的成員。這可以通過將已經選擇(或仍然需要選擇)的成員存儲在數據庫中來完成。我們沒有足夠的細節來幫助您如何做到這一點。

但是,我想補充的是,選擇隨機成員不重複的最佳方法是而不是通過隨機選擇一個用戶,並確保您以前沒有選擇該成員。這可能需要很長時間。您可以從陣列中刪除一個成員,但有另一種方法。

Shuffle(在right way!)成員數組,然後簡單地依次循環它們。當所有成員都被選中後,您可以再次洗牌。這裏是一個使用ES6語法和generator的例子,因爲這對於它來說似乎是一個理想的用例。如果browser support(沒有IE,其他主要瀏覽器都沒有問題)不成問題,則可以在您的間隔內使用list.membersuniqueRandomIterate並使用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; 
 
}