Получить более 100 сообщений

Я пытаюсь найти способ использовать циклы для получения старых сообщений о разногласиях, используя fetchMesasges() и до. Я хотел бы получить более 100 пределов, используя цикл, но я не могу понять это, и каждый пост, который я могу найти, только обсуждает, как использовать циклы для УДАЛЕНИЯ более 100 пределов, мне просто нужно их получить.

Я новичок в кодировании и, в частности, в javascript, поэтому я надеюсь, что кто-то может подтолкнуть меня в правильном направлении.

Вот единственный способ, которым мне удалось получить сообщения, которые находятся дальше 100 назад (после многих неудачных попыток использования циклов):

channel.fetchMessages({ limit: 100 })
    .then(msg => {
        let toBeArray = msg;
        let firstLastPost = toBeArray.last().id;

        receivedMessage.channel
            .fetchMessages({ limit: 100, before: firstLastPost })
            .then(msg => {
                let secondToBeArray = msg;
                let secondLastPost = secondToBeArray.last().id;

                receivedMessage.channel
                    .fetchMessages({ limit: 100, before: secondLastPost })
                    .then(msg => {
                        let thirdArray = msg;
                        let thirdLastPost = thirdArray.last().id;

                        receivedMessage.channel
                            .fetchMessages({ limit: 100, before: thirdLastPost })
                            .then(msg => {
                                let fourthArray = msg;
                            });
                    });
            });
    });
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
7
0
6 911
2

Ответы 2

Что вы можете сделать, так это использовать асинхронная/ожидающая функция и цикл для выполнения последовательных запросов.

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.fetchMessages(options);
        sum_messages.push(...messages.array());
        last_id = messages.last().id;

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

    return sum_messages;
}

это отлично сработало для меня. У меня все еще есть небольшие проблемы с повторением отдельных массивов, поскольку .push создает массив, содержащий отдельные массивы для каждых 100 полученных сообщений. Я пытаюсь найти способ заставить concat работать. В любом случае, спасибо за отзыв, он очень помог!

D. Overton 14.03.2019 07:08

Прочитайте документы для .concat();

Pentium1080Ti 14.03.2019 08:31

@D.Overton Я обновил пример, чтобы использовать оператор спреда (sum_messages.push(...messages.array());)

Jason 14.03.2019 17:17

@ Джейсон Я собираюсь прочитать документы, чтобы лучше с ним ознакомиться. Но я думаю, это именно то, что мне было нужно. Спасибо.

D. Overton 15.03.2019 03:04

Я думаю, вам не хватает длины в последнем условии sum_messages.length >= limit

TechnoTim 18.07.2021 17:00

У меня это работает с использованием discord.js v 11.5.1 и TypeScript. Это обновленная версия сообщение Джейсона.

Причина, по которой я использовал это, заключается в следующем: максимальное ограничение DiscordAPI для получения сообщений составляет 100, а устаревший метод TextChannel#fetchMessages() больше не существует.

Я обновил его, чтобы использовать метод fetch(options?: ChannelLogsQueryOptions, cache?: boolean) объекта Текстовый канал#сообщения для получения коллекций из 100 или менее сообщений.

async function getMessages(channel: TextChannel, limit: number = 100): Promise<Message[]> {
  let out: Message[] = []
  if (limit <= 100) {
    let messages: Collection < string, Message > = await channel.messages.fetch({ limit: limit })
    out.push(...messages.array())
  } else {
    let rounds = (limit / 100) + (limit % 100 ? 1 : 0)
    let last_id: string = ""
    for (let x = 0; x < rounds; x++) {
      const options: ChannelLogsQueryOptions = {
        limit: 100
      }
      if (last_id.length > 0) {
        options.before = last_id
      }
      const messages: Collection < string, Message > = await channel.messages.fetch(options)
      out.push(...messages.array())
      last_id = messages.array()[(messages.array().length - 1)].id
    }
  }
  return out
}

Я также немного обновил фрагмент, добавив возвращаемый тип функции и изменив его с общедоступного метода на статическую функцию.

SeqSEE 11.02.2020 14:30

Другие вопросы по теме