【发布时间】:2021-04-02 14:56:51
【问题描述】:
我目前正在尝试创建一个 Discord.js 命令,让第一个做出反应的人赢得奖品。我现在遇到两个问题。首先,机器人正在获取通过命令输入的最后一个奖品,而不是当前奖品。其次,在机器人重启之前发送的赠品在机器人重启后将不起作用。
代码如下:
const DropModel = require('../modules/DropModel');
const { MessageEmbed, ReactionCollector } = require("discord.js")
const { COLOR, MONGO } = require("../util/BotUtil");
module.exports = {
name: "drop",
description: "First to react wins the giveaway!",
async execute(message, args) {
let prizes = args.slice(0).join(' ').toString()
if (!prizes) return message.channel.send("You didn't provide a prize.");
const newDrop = new DropModel({
guildId: message.guild.id,
prize: prizes,
channelId: message.channel.id,
createdBy: message.author,
timeCreated: new Date(),
});
newDrop.save();
let Drops = await DropModel.findOne({ guildId: message.guild.id, channelId: message.channel.id });
if (!Drops) return;
const { prize, createdBy } = Drops;
const DropEmbed = new MessageEmbed()
.setTitle(`${prize}`)
.setDescription(`First to React with ???? wins the giveaway
Hosted by: ${createdBy}`)
.setColor(COLOR)
.setTimestamp();
const dropMsg = await message.channel.send(`???? **giveaway** ????`, DropEmbed);
await Drops.remove();
await dropMsg.react('????');
const filter = (reaction, user) => !user.bot;
const reaction = new ReactionCollector(dropMsg, filter, { max: 1 });
reaction.on('collect', async (reaction, user) => {
const { embeds } = dropMsg;
const embed = embeds[0];
embed.setTitle(`Someone called giveaway!`);
embed.setDescription(`Winner: ${user.toString()}
Please contact ${createdBy} to claim your giveaway!`);
await dropMsg.edit(embed);
dropMsg.channel.send(`${user.toString()} won **${prize}**!`);
});
}
}
对于上述问题的任何帮助将不胜感激!谢谢!
【问题讨论】:
-
第2期正常。你会想要托管你的机器人,否则一旦你的机器人关闭,任何信息都会丢失
-
正如 Elitezen 提到的,预计第二期。如果您想解决第二个问题,您需要在创建赠品时将赠品的数据保存在数据库或 JSON 文件中,并且当机器人启动时(在您的
client.on("ready")处理程序中)您应该检查数据库/文件以查看当前是否正在运行任何赠品。如果应该运行任何赠品(意味着它们仍保存在数据库/文件中),您将需要为每个赠品重新创建反应收集器。一旦赠品结束,您需要将其从数据库/文件中删除。
标签: javascript discord discord.js bots