Команда Discord JS Giveaway, выход - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь обернуть голову вокруг этого, я уверен, что это легкое исправление, которое я просматриваю, но кто-нибудь может помочь сделать вывод разумным.

module.exports.run = async (bot, message, args) => {

console.log(`${message.member} ran the "GiveAway" command`);

var item = "";
var time;
var winnerCount
let messageArray = message.content.split(" ");
//-- f!giveaway 1(winnerCount) 60(seconds) Item Giveaway

for (var i = 3; i < messageArray.length; i++){
  item += (messageArray[i] + " ");
}
winnerCount = Number(messageArray[1]);
time = Number(messageArray[2]);


var giveEmbed = new Discord.RichEmbed();
giveEmbed.setDescription(item);
var embedSent = await message.channel.send(giveEmbed);
embedSent.react("?");
setTimeout(function() {


  var peopleReacted = embedSent.reactions.get("?").users;
  var index = Math.floor(Math.random() * peopleReacted.length);
  var winners = [];
  var winnerMsg = "";
  for (var i = 0; i < winners.length; i++){
    winnerMsg += (winners[i].toString() + " ");
  }
  var haveHas = "has";
  if (winners.length == 1){
    haveHas = "has";
  }
  else{
    haveHas = "have";
  }
  message.channel.send(winnerMsg + " " + haveHas + ` won ${item}`);
}, time * 1000); //--conversting seconds into miliseconds
}

Это не ловит пользователяи отображать его с выводом

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Полагаю, ваша проблема в функции setTimeout.Давайте разберем ваш код.

var peopleReacted = embedSent.reactions.get("?").users;
var index = Math.floor(Math.random() * peopleReacted.length);

Прежде всего, ваш код выбирает всех пользователей, которые отреагировали «" », и сохраняет его в массиве peopleReacted.После этого вы получаете случайный индекс из массива peopleReacted, который, как я полагаю, вы позже захотите использовать для получения случайного победителя.

var winners = [];
var winnerMsg = "";
for (var i = 0; i < winners.length; i++){
    winnerMsg += (winners[i].toString() + " ");
}

Затем мы попадаем в этот блок, гдеЯ думаю, что ваша проблема лежит.Здесь вы создаете пустой массив с именем winners.Тогда у вас есть цикл for для этого пустого массива.Поскольку массив пуст, цикл for не будет запускаться ни разу.Следовательно, winnerMsg остается пустым, и вы не получаете имя пользователя.

var haveHas = "has";
if (winners.length == 1){
    haveHas = "has";
}
else{
    haveHas = "have";
}

После этого это происходит.Вы определяете переменную, которой хотите присвоить значение «имеет» или «иметь» в зависимости от количества победителей.Вы проверяете длину массива winners, но, как мы уже обсуждали ранее, этот массив пуст.Пустой массив имеет длину 0, поэтому он войдет в оператор else, объясняя, почему в результате вместо слова has есть слово "have".

Итак, вот моя попытка исправить вашу проблему.Попробуйте этот код и дайте мне знать, что происходит.

setTimeout(function() {
  var peopleReacted = embedSent.reactions.get("?").users;
  var winners = [];

  // Checks if fewer people reacted than the winnerCount allows users to win
  if (peopleReacted.length >= winnerCount) {
    winners = peopleReacted;
  } else {
    // Gets as many random users from the peopleReacted as winnerCount allows users to win
    for (var i = 0; i < winnerCount; i++){
      var index = Math.floor(Math.random() * peopleReacted.length);
      winners.push(peopleReacted[index]);
      // After adding a user to winners, remove that item from the array to prevent him from winning multiple times
      peopleReacted.splice(index, 1);
    }
  }

  var winnerMsg = "User(s) ";
  for (var i = 0; i < winners.length; i++){
    // Add each winner to the winnerMsg
    winnerMsg += (winners[i].toString() + ", ");
  }

  var haveHas;
  if (winners.length === 1){
    haveHas = "has";
  }
  else {
    haveHas = "have";
  }
  message.channel.send(`${winnerMsg} ${haveHas} won ${item}`);
}, time * 1000); //--conversting seconds into miliseconds
0 голосов
/ 30 ноября 2018

Я предполагаю, что вы хотите, чтобы получить людей, которые отреагировали.Я думаю, что причина этого не в том, что сообщения должны быть в кеше, чтобы их можно было отредактировать или чтобы они могли на них реагировать.Я предлагаю вам отдельную команду, которая, когда выполнено, хранит имена людей, которые это сделали.Затем, когда таймер закончится, он возьмет сохраненные данные и разыграет их оттуда.

...