Discord js - 如何在给定的时间段内继续对消息做出反应并编辑嵌入
Posted
技术标签:
【中文标题】Discord js - 如何在给定的时间段内继续对消息做出反应并编辑嵌入【英文标题】:Discord js - How to keep reacting to a message and editing the embed till a given time period 【发布时间】:2021-03-11 15:33:28 【问题描述】:所以我正在创建一个机器人,它返回单词的城市字典含义。在单击右箭头时,它会显示下一个含义。 但我只能这样做一次。 我做了哪些更改,以便我可以对消息做出反应,并且它会在发出命令后 10 秒内改变含义。 因为一旦我点击右箭头,它就会向我显示下一个含义,但我们反应过一次后,我无法返回上一个含义或获取下一个含义。
async execute(message, args)
// if (!message.channel.nsfw) return message.channel.send("You can only send messages in a NSFW marked channel.")
let worder = args[0];
if (!worder) return message.channel.send("Specify a word")
let defin = await ud.all(args.join(' ')).catch(e =>
message.channel.send("Word not found")
return;
);
message.channel.send( embed: generateEmbed(defin, 0) ).then(async message =>
if (defin.length < 1) return
await message.react("➡️")
const filter = (reaction, user) =>
return ['⬅️', '➡️'].includes(reaction.emoji.name)
;
message.awaitReactions(filter, time: 1000 ).then(collected =>
const reaction = collected.first();
let currentIndex = 0
message.reactions.removeAll().then(async() =>
reaction.emoji.name === '⬅️' ? currentIndex -= 1 : currentIndex += 1
console.log(currentIndex)
message.edit(generateEmbed(defin, currentIndex))
if (currentIndex !== 0) await message.react('⬅️')
console.log(currentIndex, defin.length)
if (currentIndex + 1 < defin.length) await message.react('➡️')
)
);
);
【问题讨论】:
【参考方案1】:另一种方法是使用函数刷新awaitReactions。
function checkForReactions(message)
const filter = (reaction, user) =>
return ['⬅️', '➡️'].includes(reaction.emoji.name)
;
message.awaitReactions(filter, time: 1000 ).then(collected =>
const reaction = collected.first();
let currentIndex = 0
message.reactions.removeAll().then(async() =>
reaction.emoji.name === '⬅️' ? currentIndex -= 1 : currentIndex += 1
console.log(currentIndex)
message.edit(generateEmbed(defin, currentIndex))
if (currentIndex !== 0) await message.react('⬅️')
console.log(currentIndex, defin.length)
if (currentIndex + 1 < defin.length) await message.react('➡️');
//Repeat the process!
checkForReactions(message);
);
);
async execute(message, args)
// if (!message.channel.nsfw) return message.channel.send("You can only send messages in a NSFW marked channel.")
let worder = args[0];
if (!worder) return message.channel.send("Specify a word")
let defin = await ud.all(args.join(' ')).catch(e =>
message.channel.send("Word not found")
return;
);
message.channel.send( embed: generateEmbed(defin, 0) ).then(async message =>
if (defin.length < 1) return
await message.react("➡️")
checkForReactions(message);
);
【讨论】:
【参考方案2】:因此,当使用awaitReactions
时,它只执行一次,这就是它只执行一次的原因。你可以做的是改用messageReactionAdd。
因此,您可以拥有一个包含所有要检查反应的消息 ID 的数组,然后在 messageReactionAdd 中检查 id 是否匹配,如果匹配,则您有新的反应!
let listOfMessages = ["sampleId","000000000"]
client.messageReactionAdd = function(reaction,user)
if(user.bot)return;
if(listOfMessages.includes(reaction.message.id))
if(['⬅️', '➡️'].includes(reaction.emoji.name))
//do yer stuff
//reaction.message.edit()
;
【讨论】:
如果服务器上有很多用户怎么办?那就难了哈哈以上是关于Discord js - 如何在给定的时间段内继续对消息做出反应并编辑嵌入的主要内容,如果未能解决你的问题,请参考以下文章
如何将消息发送到指定的频道 - Discord.js v13 TypeScript
启动服务器时如何在 discord.js 中调用 client.on(..) 函数