我想知道在discord.js中如何制作像赠品机器人这样的交互式赠品命令
我在V11 / 12版中 例如,当我执行g!giveaway start时,它将启动一个交互式设置,它将像这样
机器人会说 “时间”
然后,我将其设置为带有变量的类型(m代表分钟,d代表天,w代表周)
然后它会说
“好吧!现在您想赠予什么?”
然后我只说我想赠予的东西
然后它会说
“太好了!赠品将进入哪个频道?”
然后我放置频道
然后机器人说
“好!(奖品)的赠品已在(频道)开始,并将持续(时间)秒/天/周
请在这里获得帮助,
答案 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 + "!");
}
});
请注意,这只是一个示例,在实际的实现中,您必须正确处理错误。这是示例结果:
如果您需要更多输入,只需创建更多收集器和答案,然后根据需要使用该信息即可。
答案 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轻松创建赠品。