如何在discord.js中进行交互式命令

时间:2019-11-17 12:24:28

标签: node.js discord.js

我想知道在discord.js中如何制作像赠品机器人这样的交互式赠品命令

我在V11 / 12版中 例如,当我执行g!giveaway start时,它将启动一个交互式设置,它将像这样

机器人会说 “时间”

然后,我将其设置为带有变量的类型(m代表分钟,d代表天,w代表周)

然后它会说

“好吧!现在您想赠予什么?”

然后我只说我想赠予的东西

然后它会说

“太好了!赠品将进入哪个频道?”

然后我放置频道

然后机器人说

“好!(奖品)的赠品已在(频道)开始,并将持续(时间)秒/天/周

请在这里获得帮助,

2 个答案:

答案 0 :(得分:1)

发送消息并使用收集器(awaitMessages)等待响应

我们将要在询问后等待消息,因此我们将使用收集器。

异步TextChannel.awaitMessages()read docs)可用于收集消息。它需要一个过滤器来知道接受哪些消息,以及一些知道何时停止收集消息的选项。

// accepted messages will be those from the same author, we compare IDs to make sure
const filter = msg => msg.author.id == message.author.id;

// the only option needed will be maxMatches, to only take one message before ending the collector
const options = {
  maxMatches: 1
};

然后收集器将返回Collection条消息,由于只有一条,我们将始终取.first()并存储其内容。

// assuming you have the `channel` object, and are inside an async function
let collector = await channel.awaitMessages(filter, options);
let answer = collector.first().content;

在每个channel.send()之后,对用户要查找的每个不同答案使用以上内容。

有关如何使用收集器的示例

client.on("message", async message => {
  if (message.content === "!color") {
    // request
    message.channel.send("What's your fav color?");

    // collector
    let collector = await message.channel.awaitMessages(filter, options);
    let answer = collector.first().content;

    // response
    await message.reply("your fav color is " + answer + "!");
  }
});

请注意,这只是一个示例,在实际的实现中,您必须正确处理错误。这是示例结果:

Color command example

如果您需要更多输入,只需创建更多收集器和答案,然后根据需要使用该信息即可。

答案 1 :(得分:0)

您需要使用MessageCollectors。例如:

let opt = {
    prize: null, 
    time: null
};
message.channel.send("Whats the prize?");
let collector = new Discord.MessageCollector(message.channel, () => true);
collector.on("collect", (m) => {
    if(opt.prize && !opt.time){
       opt.time = m.content;
       message.channel.send("Giveaway started! (prize:"+opt.prize+", time:"+opt.time+")");
       collector.stop();
    }
    if(!opt.prize && !opt.time){
         opt.prize = m.content;
         message.channel.send("ok! So what's the time?");
    }
});

您可以根据需要添加任意数量的opt,遵循相同的逻辑。 您可以使用my npm package, discord-giveaways轻松创建赠品。