gpt4 book ai didi

node.js - 如何让 Discord.js 回复不和谐的 DM 消息

转载 作者:太空宇宙 更新时间:2023-11-04 03:16:02 28 4
gpt4 key购买 nike

我正在尝试让discord.js读取Discord上的DM消息,以拥有一个机器人,该机器人将是从头开始制作的服务器/派系应用程序机器人,但是当您输入%apply到机器人时,我让它发送第一部分,当试图通过问题2时,它不断收到问题2而不是问题3

当 DM 消息与传递的消息不同时,我试图过滤掉 DM 消息,因此我有几个 if 命令

bot.on("message", function(message) {
if (message.author.equals(bot.user)) return;
if (message.content === "%apply") {
apply = "TRUE";
a0 = message.author.lastMessageID
message.author.sendMessage("```We need to ask some questions so we can know a litte bit about yourself```");
message.author.sendMessage("```Application Started - Type '#Cancel' to cancel the application```");
message.author.sendMessage("```Question 1: In-Game Name?```");
}
if ((message.guild === null) && (message.author.lastMessageID != a0) && (message.content != "%apply") && (apply === "TRUE")) {
a1 = message.author.lastMessageID;
message.author.sendMessage("```Question 2: Age?```");
}
if ((message.guild === null) && (message.author.lastMessageID != a1) && (message.author.lastMessageID != a0) && (apply === "TRUE")) {
a2 = message.author.lastMessageID;
message.author.sendMessage("```Question 3: Timezone? NA, AU, EU, NZ, or Other? (If other, describe your timezone)```");
}
if ((message.guild === null) && (message.author.lastMessageID != a2) && (message.author.lastMessageID != a1) && (message.author.lastMessageID != a0) && (apply === "TRUE")) {
a3 = message.author.lastMessageID;
message.author.sendMessage("```Question 4: Do you have schematica?```");
}

我预计它会从问题 1 转到问题 2 问题 3

最佳答案

前言

虽然@Gruntzy的答案没有错,Discord.js 中内置了另一种解决方案,适用于这些情况 - TextChannel.awaitMessages() 。您可以在如下所示的系统中使用它。

示例代码

const questions = [                    // ------------------------------------
"What's your IGN?", //
"How old are you?", // Define the questions you'd like the
"What time zone do you reside in?", // application to have in this array.
"Do you have Schematica?" //
]; // ------------------------------------

const applying = [];

bot.on("message", async message => {
if (message.author.bot) return;

if (message.content.toLowerCase() === "%apply") {
if (applying.includes(message.author.id)) return;

try {
console.log(`${message.author.tag} began applying.`);

applying.push(message.author.id);
await message.channel.send(":pencil: **Application started!** Type `#cancel` to exit.");

for (let i = 0, cancel = false; i < questions.length && cancel === false; i++) {
await message.channel.send(questions[i]);
await message.channel.awaitMessages(m => m.author.id === message.author.id, { max: 1, time: 300000, errors: ["time"] })
.then(collected => {
if (collected.first().content.toLowerCase() === "#cancel") {
await message.channel.send(":x: **Application cancelled.**");
applying.splice(applying.indexOf(message.author.id), 1);
cancel = true;

console.log(`${message.author.tag} cancelled their application.`);
}
}).catch(() => {
await message.channel.send(":hourglass: **Application timed out.**");
applying.splice(applying.indexOf(message.author.id), 1);
cancel = true;

console.log(`${message.author.tag} let their application time out.`);
});
}

await message.channel.send(":thumbsup: **You're all done!**");

console.log(`${message.author.tag} finished applying.`);
} catch(err) {
console.error(err);
}
}
});

说明

为了让代码更容易理解,让我们一步步看一遍......

<强>1。前面几行。

  • questions数组包含您希望在应用程序中询问的所有问题。为了提高效率,我实现了一个数组;只需更改一行即可添加或删除问题,并且不会一遍又一遍地复制和粘贴相同的代码。
  • applying数组将帮助我们在应用程序过程中跟踪用户。

<强>2。消息事件。

  • 我已经实现了一个箭头函数 (ES6) 作为回调并将其声明为异步,因此我们可以使用 await里面。
  • 我们阻止机器人触发任何命令。
  • 我们检查 case iNsEnSiTiVeLy 是否应该运行该命令。
  • 您会注意到后续代码包含在 try...catch statement 中。 。这使我们能够捕获任何 unhandled promise rejections (即如果 TextChannel.send() 抛出错误)很容易。

<强>3。 %apply命令。

  • 我们将用户添加到 applying数组。
  • 我们发送开始消息。
    • 注意关键字 await :它会等待 promise 履行后再继续。
  • 我们使用 for 循环遍历 questions大批。
    • let i = 0, cancel = false声明i (“计数器”变量)和 cancel变量,因此如果用户想要取消应用程序或超时,我们可以停止循环。我们不能使用 break 在我们的 then() 内回调,所以我恢复到这个方法。
    • i < questions.length && cancel === false是我们在继续下一次迭代之前要匹配的条件 - 计数器必须在数组的范围内,并且 cancel仍然必须是false .
    • i++将计数器加 1。
  • 在循环内,我们发送问题,然后调用 TextChannel.awaitMessages() 。我们的第一个参数是消息必须通过的过滤器,第二个参数是选项。
    • 在我们的 then() 回调,我们检查消息是否为 #cancel 。如果是,我们发送取消消息,从数组中删除该用户,并设置 cancel的值为 true .
    • 我们的 catch() 如果 5 分钟内没有提供消息,将调用该方法。因此,在回调中,我们发送超时消息,从数组中删除用户,并设置 cancel的值为 true .
  • 循环完成后,我们会发送完成消息。此时,您可以按照自己的意愿处理该应用程序。

关于node.js - 如何让 Discord.js 回复不和谐的 DM 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56232843/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com