有没有办法对使用 discord.js 发送的每条消息做出反应
Posted
技术标签:
【中文标题】有没有办法对使用 discord.js 发送的每条消息做出反应【英文标题】:Is there a way to react to every message ever sent with discord.js 【发布时间】:2019-11-18 03:27:52 【问题描述】:我想使用一个机器人来使用 discord.js f.e. 对频道中的每条消息做出反应。我有一个表情符号竞赛频道,我想在其中的每个帖子上添加 ✅ 和 ✖ 反应 ofc,所有不必要的消息都被清理,所以有大约 50 条消息
【问题讨论】:
【参考方案1】:根据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
)
)
)
【讨论】:
【参考方案2】: 使用TextChannel.fetchMessages()
获取频道中已发送的消息。
遍历Collection。
使用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()
链,这很容易变得混乱。
【讨论】:
让它像那样工作,谢谢,但我对 js 编码很陌生,这是什么 => 我认为这并不意味着 sammerl 或等于=>
实际上是arrow function 语法的一部分。 <=
和 >=
是 relational operators。 =>
和 >=
很容易混淆,但它们有很大的不同。
你能在被拒绝的承诺部分上进行开发吗?我在之前的一个答案中使用了Map.forEach()
,但没有想到/不知道。你说的是message.react
承诺,不是吗?因为如果一个承诺被拒绝,forEach
将停止,所以它会被停止并像你一样进入,不是吗?
forEach()
的工作方式,不。它只是调用 Promise 并继续迭代。到它完成时,Promise 仍将处于待处理状态。即使您使用await
关键字,它也不会对这个问题有效。请参阅 here 以获得对工作原理和问题的更全面的解释。以上是关于有没有办法对使用 discord.js 发送的每条消息做出反应的主要内容,如果未能解决你的问题,请参考以下文章
Discord JS - 向机器人所在的每台服务器中的每个用户发送 dm