【发布时间】:2019-11-18 03:27:52
【问题描述】:
我想使用一个机器人来使用 discord.js f.e. 对频道中的每条消息做出反应。我有一个表情符号竞赛频道,我想在其中的每个帖子上添加 ✅ 和 ✖ 反应 ofc,所有不必要的消息都被清理,所以有大约 50 条消息
【问题讨论】:
标签: discord discord.js
我想使用一个机器人来使用 discord.js f.e. 对频道中的每条消息做出反应。我有一个表情符号竞赛频道,我想在其中的每个帖子上添加 ✅ 和 ✖ 反应 ofc,所有不必要的消息都被清理,所以有大约 50 条消息
【问题讨论】:
标签: discord discord.js
根据https://discord.js.org/#/docs/main/stable/class/TextChannel
你可以使用fetchMessages
从特定频道获取所有消息,然后返回Message的集合
然后您可以使用.react 函数通过迭代并在每个消息上调用.react 来将您的反应应用于此消息集合。
编辑:
channelToFetch.fetchMessages()
.then(messages => {
messages.tap(message => {
message.react(`CHARACTER CODE OR EMOJI CODE`).then(() => {
// Do what ever or use async/await syntax if you don't care
about Promise handling
})
})
})
【讨论】:
TextChannel.fetchMessages()获取频道中已发送的消息。Message.react() 添加反应。const emojiChannelID = 'ChannelIDHere';
client.on('ready', async () => {
try {
const channel = client.channels.get(emojiChannelID);
if (!channel) return console.error('Invalid ID or missing channel.');
const messages = await channel.fetchMessages({ limit: 100 });
for (const [id, message] of messages) {
await message.react('✅');
await message.react('✖');
}
} catch(err) {
console.error(err);
}
});
client.on('message', async message => {
if (message.channel.id === emojiChannelID) {
try {
await message.react('✅');
await message.react('✖');
} catch(err) {
console.error(err);
}
}
});
在这段代码中,您会注意到我使用的是for...of 循环而不是Map.forEach()。这背后的原因是后者将简单地调用方法并继续前进。这将导致任何被拒绝的承诺 not 被捕获。我还使用了async/await 样式而不是then() 链,这很容易变得混乱。
【讨论】:
=> 实际上是arrow function 语法的一部分。 <= 和 >= 是 relational operators。 => 和 >= 很容易混淆,但它们有很大的不同。
Map.forEach(),但没有想到/不知道。你说的是message.react 承诺,不是吗?因为如果一个承诺被拒绝,forEach 将停止,所以它会被停止并像你一样进入,不是吗?
forEach() 的工作方式,不。它只是调用 Promise 并继续迭代。到它完成时,Promise 仍将处于待处理状态。即使您使用await 关键字,它也不会对这个问题有效。请参阅 here 以获得对工作原理和问题的更全面的解释。