是否有可能获得对特定表情符号做出反应的用户集合? (不和谐 JS)
Posted
技术标签:
【中文标题】是否有可能获得对特定表情符号做出反应的用户集合? (不和谐 JS)【英文标题】:Is it possible to get a collection of users that reacted with a specific emoji to a message? (Discord JS) 【发布时间】:2020-11-29 14:39:25 【问题描述】:我正在开发高级 Discord Bot。一些功能通过 cron 作业起作用。我正在开发的一项新功能要求机器人获取一组用户,这些用户使用特定的表情符号对特定消息做出反应。基于此,用户将获得一个临时角色(该角色很可能拥有相同类型的问题,因为它的文档与当前问题相同)。
我拥有提取特定消息所需的所有数据以及可能的内容,但是我不知道如何通过 cron 访问它。
我有 discord 服务器 ID、discord 频道 ID、discord 消息 ID 和表情符号雪花。所以理论上我应该能够通过 API 访问它的所有内容。但是,我注意到大多数功能都是通过缓存数据实现的,并且仅在事件发生时。
它所做的一项类似 cron 作业是将每日概览发送到启用它的特定频道。
client.channels.get([channel id]).send([formatted data]);
使用此功能,我需要获取一条消息以及所有对(理想情况下)表情符号雪花做出反应的用户的集合。
它必须通过 cron,使用 discord 命令是不行的,因为自动化是关键。它也应该在没有任何缓存数据的情况下工作(真正的问题出在哪里)。再一次,我拥有提取消息所需的所有数据并根据雪花找到表情符号,我只是不知道如何通过 cron 来完成。该机器人还拥有对其运行的服务器的所有必需权限。
任何指针或解决方案将不胜感激。
cronjob中的当前代码:
(async () =>
// walk through channels in DB
var channels = await query([query]);
for (var i = 0; i < channels.length; i++)
var serv_channel_id = channels[i].server_channel_id;
var disc_channel_id = channels[i].discord_channel_id;
var disc_server_id = channels[i].discord_server_id;
// walk through messages in DB
var messages = await query([query]);
for (var j = 0; j < messages.length; j++)
var serv_message_id = messages[i].server_message_id;
var disc_message_id = messages[i].discord_message_id;
// walk through reactions in DB
var reactions = await query([query]);
for (var k = 0; k < reactions.legnth; k++)
var serv_reaction_id = reactions[i].server_react_id;
var r_to_give = reactions[i].role_to_give;
// get discord list of users that reacted with emoji
// check per user if they have the role, if they dont then assign role
)();
目前工作比效率更重要。 出于明显的原因,我省略了这些查询,它们不是这个问题的必要信息。
【问题讨论】:
【参考方案1】:通过原始事件,我能够解决这个问题。
我的旧代码已被完全删除,因此可以作为参考资料忽略。
相反,我深入研究了我以前从未见过的 API 领域;原始事件。
如果您想了解更多信息,我强烈建议您从这里开始阅读: https://anidiots.guide/coding-guides/raw-events
为了达到我想要的目的而使用的基本代码
client.on('raw', packet =>
(async () =>
// We don't want this to run on unrelated packets
if (!['MESSAGE_REACTION_ADD', 'MESSAGE_REACTION_REMOVE'].includes(packet.t)) return;
// Grab the channel to check the message from
const channel = client.channels.get(packet.d.channel_id);
// make sure channel id is in DB otherwise no need to listen
const check_channel = await query([query]);
if (!Array.isArray(check_channel) || !check_channel.length) return;
// make sure the message is in the DB otherwise no need to listen
const check_message = await query([query]);
if (!Array.isArray(check_message) || !check_message.length) return;
channel.fetchMessage(packet.d.message_id).then(message =>
(async () =>
// Emojis can have identifiers of name:id format, so we have to account for that case as well
const emoji = packet.d.emoji.id ? `$packet.d.emoji.name:$packet.d.emoji.id` : packet.d.emoji.name;
// make sure emoji id is in db
const check_reaction = await query([query]);
if (!Array.isArray(check_reaction) || !check_reaction.length) return;
// add and track user
if (packet.t === 'MESSAGE_REACTION_ADD')
await query([query]);
// remove user from tracking
if (packet.t === 'MESSAGE_REACTION_REMOVE')
await query([query]);
)();
);
)();
);
代码并不完美或不干净,但对于那些陷入类似问题的人来说,它是一个基本的开始。对于我的特定问题,这是解决方案。
【讨论】:
以上是关于是否有可能获得对特定表情符号做出反应的用户集合? (不和谐 JS)的主要内容,如果未能解决你的问题,请参考以下文章
Discord.js DiscordAPI 错误:未知表情符号 - 对嵌入做出反应