DiscordJS 获取超过 100 条消息

2022-01-10 00:00:00 discord node.js javascript discord.js

我正在尝试在 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);
  }
});

相关文章