【问题标题】:Weird reaction behavior, ticket system discord.js奇怪的反应行为,票务系统 discord.js
【发布时间】:2020-11-24 17:23:48
【问题描述】:

我正在尝试使用我的 discord.js 机器人为我的 discord 服务器创建一个自己的票务系统。 如果用户使用 ???? 对某个消息做出反应emoji,我想让它先立即删除反应,然后继续。所以基本上反应计数保持在 1(我的机器人中唯一的一个)。 问题是,如果我重新启动机器人并对消息做出反应,它不会删除我的反应,但是当我手动删除它并重试时,它会起作用!

这是我的代码:

client.on("messageReactionAdd", async (messageReaction, user) => {
    if (messageReaction.partial) {
        try {
            await messageReaction.fetch();
        } catch (error) {
            console.log("couldn't fetch message1", error);
        }
    }
    let msg = messageReaction.message;
    if (msg.id === config.support_msg_id) {
        const userReactions = msg.reactions.cache.filter(reaction => reaction.users.cache.has(user.id));
        try {
            for (const reaction of userReactions.values()) {
                await reaction.users.remove(user.id);
            }
        } catch (error) {
            console.error('Failed to remove reactions.');
        }
    }
});

【问题讨论】:

    标签: javascript node.js discord discord.js ticket-system


    【解决方案1】:

    问题在于messageReactionAdd 事件仅在向缓存 消息添加反应时触发,如Discord.js docs 所述:

    每当响应添加到缓存消息时发出。

    您可以通过使用以下代码在机器人启动时将每条消息添加到缓存中来解决此问题:

    client.on('ready', () => {
      client.guilds.cache.each(guild => {
        guild.channels.cache.each(channel => {
          if (channel.type === 'text' || channel.type === 'dm') {
            channel.messages.fetch();
          }
        });
      });
    });
    

    如果您想防止过多的消息被添加到缓存中,可以将ChannelLogsQueryOptions 传递给MessageManager.fetch() 函数。

    【讨论】:

    • 它对内存有什么影响?
    • @Cursed 我没试过,所以我不完全确定它会用掉多少内存。
    • 想象一下在拥有 100 多个 dms 和服务器的大型机器人上获取所有消息
    • @Cursed 好吧,这可能会导致问题,但除非有人尝试,否则我们永远不会知道。
    • 抱歉回答晚了,我不知怎么弄丢了这个问题。我已经在获取我的活动中收到的任何消息。所以无论如何它应该去缓存,不是吗?那么为什么它不起作用
    猜你喜欢
    • 1970-01-01
    • 2021-12-01
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2019-08-12
    • 1970-01-01
    • 2021-07-07
    相关资源
    最近更新 更多