是否有可能获得对消息使用特定表情符号做出反应的用户集合? (Discord JS)

时间:2020-08-10 00:20:59

标签: automation cron discord bots discord.js

我正在研究高级Discord Bot。通过cron作业可以实现几个功能。我正在使用的一项新功能要求该机器人收集一组对具有特定表情符号的特定消息做出反应的用户。基于此,用户将获得临时角色(由于其文档与当前问题相同,因此很可能具有相同的问题)。

我拥有提取特定消息及其内容所需的所有数据,但是我不知道如何通过cron访问它。

我有不和谐服务器ID,不和谐频道ID,不和谐消息ID和表情符号雪花。因此,从理论上讲,我应该能够通过API访问其所有内容。但是,我注意到大多数功能都是通过缓存的数据进行的,并且仅在事件发生时进行。

它执行的类似cron作业是将每日概览发送到已启用该功能的特定频道。 length

但是,使用此功能,我需要获取一条消息,以及所有与(理想情况下)表情符号雪花做出反应的所有用户的集合。

必须通过cron,使用discord命令进行此操作是不可行的,因为自动化是关键。它也应该在没有任何缓存数据的情况下工作(真正的问题所在)。再一次,我拥有提取消息并找到基于雪花的表情符号所需的所有数据,我只是不知道如何通过cron做到这一点。该漫游器还对其在其上运行的服务器具有所有必需的权限。

任何指针或解决方案将不胜感激。

cronjob中的当前代码:

client.channels.get([channel id]).send([formatted data]);

目前,工作比效率更重要。 由于明显的原因,我省略了这些查询,它们并不是该问题的必要信息。

1 个答案:

答案 0 :(得分:0)

通过原始事件,我能够解决此问题。

我的旧代码已被完全删除,因此可以将其作为参考资料。

相反,我钻研了以前从未见过的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]);
                }
            })();
        });
    })();
});

代码不是完美的或干净的,但是对于陷入类似问题的人们来说,它只是一个基本的起点。对于我的特定问题,这就是解决方案。