मैं एक कमांड बनाने की कोशिश कर रहा हूं जो उपयोगकर्ताओं को डीएम के माध्यम से संकेतों के बाद अपना पासवर्ड बनाने की अनुमति देता है। मैं उपयोगकर्ता को संदेश भेजने में सक्षम हूं, लेकिन MessageCollector के साथ वापस भेजे गए संदेश को पढ़ने में सक्षम नहीं हूं क्योंकि मुझे डीएम चैनल को संदर्भित करने का कोई तरीका नहीं मिल रहा है।

मैंने यहां bot.on("message", message) के एक अन्य उदाहरण का उपयोग करने की कोशिश की है, लेकिन यह सिस्टम में एक रिसाव पैदा करता है जिससे दूसरा उदाहरण कभी गायब नहीं होता है।

मैं उपयोगकर्ताओं को !CreatePassword *** कहने की आज्ञा का उपयोग नहीं करने दे सकता क्योंकि यह फ़ंक्शन कई अन्य लोगों के साथ एक सख्त क्रम में जुड़ा हुआ है।

हो सकता है कि मैं कुछ मौलिक रूप से गलत कर रहा हूं, या समस्या को खराब तरीके से देख रहा हूं, लेकिन मुझे डीएम चैनल को संदर्भित करने का एक तरीका चाहिए।

यह मेरे कोड का अब तक का सबसे अच्छा पुनरावृत्ति है।

function createAccount(receivedMessage, embedMessage)
{
    const chan = new Discord.DMChannel(bot, receivedMessage.author);

    const msgCollector = new Discord.MessageCollector(chan , m => m.author.id == receivedMessage.author.id);
    msgCollector.on("collect", (message) => 
    {
        // Other Code
        msgCollector.stop();
        // Removing an embed message on the server, which doesn't have a problem.
        embedMessage.delete();
    })
}

यदि आवश्यक हो तो मैं अपना शेष कोड दिखा सकता हूं।

आपके समय के लिए शुक्रिया। मैंने इस पर पूरी रात की नींद खो दी है।

0
Hrugor 3 पद 2018, 16:05

1 उत्तर

सबसे बढ़िया उत्तर

मैं इसे इस तरह से करूंगा (मैं मान लूंगा कि receivedMessage वह संदेश है जिसने कमांड को ट्रिगर किया, अगर मैं गलत हूं तो मुझे सुधारें)

async function createAccount(receivedMessage, embedMessage) {
  // first send a message to the user, so that you're sure that the DM channel exists.
  let firstMsg = await receivedMessage.author.send("Type your password here");

  let filter = () => true; // you don't need it, since it's a DM.
  let collected = await firstMsg.channel.awaitMessages(filter, {
      maxMatches: 1, // you only need one message
      time: 60000 // the time you want it to run for
    }).catch(console.log);

  if (collected && collected.size > 0) {
    let password = collected.first().content.split(' ')[0]; // grab the password
    collected.forEach(msg => msg.delete()); // delete every collected message (and so the password)
    await firstMsg.edit("Password saved!"); // edit the first message you sent
  } else await firstMsg.edit("Command timed out :("); // no message has been received

  firstMsg.delete(30000); // delete it after 30 seconds
}
0
Federico Grandi 3 पद 2018, 18:01