是否有可能获得对特定表情符号做出反应的用户集合? (不和谐 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 错误:未知表情符号 - 对嵌入做出反应

[使用message.content.startswith时如何使Discord机器人对服务器表情符号做出反应

Discord JS - 如何对同一个嵌入做出多次反应?

Random.Randint() 重复