2017-11-08 3 views
1

Also ich bin neu zu discord botting und js und ich spiele mit meinem eigenen Bot herum. Ich möchte ein Minispiel schreiben. Wenn Sie im Chat ?type eingeben, sagt der Bot etwas im Chat und editiert diese Nachricht während des Countdowns. Wenn das Herunterzählen beendet ist, wird das zufällig generierte Wort angezeigt. Der Spieler muss das exakte zufällige Wort im Chat eingeben und der Bot zeigt die Gesamtzeit an.Die zweite Funktion in setTimeout() läuft nicht

Hier ist mein Code:

case "type": 
     let randomWord = Math.random().toString(36).replace(/[^a-z]+/g, ''); 
     let timer = 3; 
     message.channel.send("Generating a new word..") 
      .then((msg)=> { 
      var interval = setInterval(function() { 
       msg.edit(`Starting in **${timer--}**..`) 
      }, 1000) 
      }); 
     setTimeout(function() { 
      clearInterval(interval); 
      message.channel.send(randomWord) 
      .then(() => { 
      message.channel.awaitMessages(response => response.content == randomWord, { 
       max: 1, 
       time: 10000, 
       errors: ['time'], 
      }) 
      .then(() => { 
       message.channel.send(`Your time was ${(msg.createdTimestamp - message.createdTimestamp)/1000} seconds.`); 
      }) 
      .catch(() => { 
       message.channel.send('There was no collected message that passed the filter within the time limit!'); 
      }); 
      }); 
     }, 5000); 
     break; 

Zur Zeit der Code stoppt, nachdem es nach unten gezählt 0. Ich verstehe nicht, warum message.channel.send(randomWord) funktioniert nicht. Auch würde ich es lieben, wenn jemand mir helfen könnte, diesen Code zu ändern, um asynch zu verwenden und abzuwarten, ob das etwas lebensfähig ist.

Antwort

0

Ich fing an, Ihr Problem zu erforschen, und hier ist das System, das ich mir ausgedacht habe.

Hier ist der Bot, der Nachrichten von verschiedenen Benutzern abhört. Sobald ein Benutzer '?type' eingibt, wird die Funktion runWordGame aufgerufen, die den Kanal der Nachricht weiterleitet.

// set message listener 
client.on('message', message => { 
    switch(message.content.toUpperCase()) { 
     case '?type': 
      runWordGame(message.channel); 
      break; 
    } 
}); 

Hier in runWordGame, der Bot ein zufälliges Wort schafft, zeigt dann einen Countdown für den Benutzer (siehe displayMessageCountdown unten). Wenn der Countdown abgelaufen ist, wird die Nachricht mit dem Zufallswort bearbeitet. Als nächstes wartet der Bot 10 Sekunden lang auf 1 Nachricht - darauf wartend, dass der Benutzer das Zufallswort eingibt. Bei Erfolg wird eine Erfolgsmeldung gesendet. Andernfalls wird eine Fehlermeldung gesendet.

// function runs word game 
function runWordGame(channel) { 
    // create random string 
    let randomWord = Math.random().toString(36).replace(/[^a-z]+/g, ''); 

    channel.send("Generating a new word..") 
    .then(msg => { 
     // display countdown with promise function :) 
     return displayMessageCountdown(channel); 
    }) 
    .then(countdownMessage => { 
     // chain promise - sending message to channel 
     return countdownMessage.edit(randomWord); 
    }) 
    .then(randomMsg => { 
     // setup collector 
     channel.awaitMessages(function(userMsg) { 
      // check that user created msg matches randomly generated word :) 
      if (userMsg.id !== randomMsg.id && userMsg.content === randomWord) 
       return true; 
     }, { 
      max: 1, 
      time: 10000, 
      errors: ['time'], 
     }) 
     .then(function(collected) { 
      // here, a message passed the filter! 
      let successMsg = 'Success!\n'; 

      // turn collected obj into array 
      let collectedArr = Array.from(collected.values()); 

      // insert time it took user to respond 
      for (let msg of collectedArr) { 
       let timeDiff = (msg.createdTimestamp - randomMsg.createdTimestamp)/1000; 

       successMsg += `Your time was ${timeDiff} seconds.\n`; 
      } 

      // send success message to channel 
      channel.send(successMsg); 
     }) 
     .catch(function(collected) { 
      // here, no messages passed the filter 
      channel.send(
       `There were no messages that passed the filter within the time limit!` 
      ); 
     }); 
    }) 
    .catch(function(err) { 
     console.log(err); 
    }); 
} 

Diese Funktion extrapoliert die Anzeige der Countdown-Meldung. Das gleiche Nachrichtenobjekt wird bearbeitet, bis der Timer auf Null kommt, dann wird das Promise aufgelöst, was die nächste .then(... Methode innerhalb von runWordGame auslöst.

// Function displays countdown message, then passes Message obj back to caller 
function displayMessageCountdown(channel) { 
    let timer = 3; 

    return new Promise((resolve, reject) => { 
     channel.send("Starting in..") 
     .then(function(msg) { 
      var interval = setInterval(function() { 
       msg.edit(`Starting in **${timer--}**..`); 

       // clear timer when it gets to 0 
       if (timer === 0) { 
        clearInterval(interval); 
        resolve(msg); 
       } 
      }, 1000); 
     }) 
     .catch(reject); 
    }); 
} 

Lassen Sie mich wissen, wenn Sie Fragen haben, oder wenn Sie nach einem anderen Endergebnis suchen.

Verwandte Themen