DiscordJS 获取超过 100 条消息

DiscordJS fetching more then 100 messages(DiscordJS 获取超过 100 条消息)
本文介绍了DiscordJS 获取超过 100 条消息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我正在尝试在 DiscordJS 中获取超过 100 条消息.我在 here 找到了这段代码,但它不起作用:

I'm trying to fetch more than 100 messages in DiscordJS. I've found this code here but it doesn't work:

async function lots_of_messages_getter(channel, limit = 500) {
    const sum_messages = [];
    let last_id;

    while (true) {
        const options = { limit: 100 };
        if (last_id) {
            options.before = last_id;
        }

        const messages = await channel.fetch(options);
        sum_messages.push(...messages.array());
        last_id = messages.last().id;

        if (messages.size != 100 || sum_messages >= limit) {
            break;
        }
    }

    return sum_messages;
}

client.on("message", async message => {
    const channel = client.channels.cache.get("12345");
    if (message.content.startsWith(prefix+"random")){
        console.log(lots_of_messages_getter());
    }
});

它给了我这个错误:

(node:6312) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'fetch' of undefined

如何解决这个问题?我对 Node.js 有点陌生.

How can this be fixed? I'm kinda new to Node.js.

推荐答案

以下适用于 discord.js v12 和 v13.与您从中获取代码的 旧答案 不同,它返回一个 collection,所以可以使用.first()等方法.last().find().get().filter()

The following works in discord.js v12 and v13. Unlike the older answers where you got your code from, it returns a collection, so you can use methods like .first(), .last(), .find(), .get(), .filter(), etc.

const { Collection } = require('discord.js');

async function fetchMore(channel, limit = 250) {
  if (!channel) {
    throw new Error(`Expected channel, got ${typeof channel}.`);
  }
  if (limit <= 100) {
    return channel.messages.fetch({ limit });
  }

  let collection = new Collection();
  let lastId = null;
  let options = {};
  let remaining = limit;

  while (remaining > 0) {
    options.limit = remaining > 100 ? 100 : remaining;
    remaining = remaining > 100 ? remaining - 100 : 0;

    if (lastId) {
      options.before = lastId;
    }

    let messages = await channel.messages.fetch(options);

    if (!messages.last()) {
      break;
    }

    collection = collection.concat(messages);
    lastId = messages.last().id;
  }

  return collection;
}

示例用法:

client.on('message', async (message) => {
  if (message.author.bot) return;

  try {
    const list = await fetchMore(message.channel, 120);

    console.log(
      list.size,
      list.filter((msg) => msg.content.includes('something')),
    );
  } catch (err) {
    console.log(err);
  }
});

这篇关于DiscordJS 获取超过 100 条消息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Discord.js Arguments With Spaces(Discord.js 带空格的参数)
my discord.js bot doesn#39;t reply to a user message even if there isn#39;t any error(即使没有任何错误,我的 discord.js 机器人也不会回复用户消息)
Make a bot wait for some time before continuing the code(在继续代码之前让机器人等待一段时间)
Invalid Form Body in Discord.js ban command(Discord.js 禁止命令中的无效表单正文)
Set Discord Bot Activity to the number of Online users. Discord.js(将 Discord Bot 活动设置为在线用户数.不和谐.js)
Got quot;Unexpected end of inputquot; in Javascript when making a Discord Bot(得到“输入意外结束;在 Javascript 中制作 Discord Bot)