Skip to main content
Успешный HTTP-запрос означает, что API обработал запрос. Чтобы понять, можно ли использовать статистику, проверьте состояние отчёта в status, а для общего списка — также complete.
Отсутствующий или устаревший отчёт сам по себе не вызывает HTTP-ошибку: API может вернуть HTTP 200, а состояние конкретного сервера передать в JSON.

Что входит в счётчики

Сервис считает сообщения в настроенных основных общих каналах Discord. Учитываются все авторы, включая ботов, без фильтра по ролям. API публикует счётчики, названия и идентификаторы серверов и каналов; тексты сообщений и данные авторов не возвращаются. Удалённые, недоступные и ещё не проиндексированные Discord сообщения не учитываются. После переиндексации счётчики могут измениться. Поэтому значение отражает сохранённый отчёт, а не поток событий в реальном времени.

Два формата ответа

Объект сервера имеет одинаковую схему в обоих форматах и для всех периодов. В общем списке серверы идут в порядке номеров; сортировка рейтинга на сайте этот порядок не меняет.

Общие метаданные

Подробные примеры календарных границ приведены на странице «Периоды и даты».

Один сервер

Условный пример месячного ответа без собранного отчёта. Название, идентификатор и значения приведены для иллюстрации схемы:

Общий список

В дополнение к метаданным периода общий ответ содержит:
При complete: false общая сумма неполная. Даже если у сервера со статусом stale заполнен счётчик, этот счётчик не включается в верхнеуровневое поле totalMessages.
Например, если один сервер имеет status: "ok" и 1 200 сообщений, а другой — status: "stale" и 800 сообщений, общий итог составит 1 200, readyServers — 1, а complete — false. Это условный пример, показывающий правило агрегации.
В интерфейсе рядом с общей суммой показывайте охват: readyServers из totalServers. Так пользователь увидит, за сколько серверов получены актуальные данные.

Объект Server

Храните guildId и идентификаторы каналов строками. Числа Discord могут выходить за пределы точности JavaScript Number; преобразование в число способно изменить ID.
error описывает ошибку отчёта внутри успешного ответа. Это поле следует читать вместе со status. Не рассчитывайте на закрытый перечень кодов ошибок сбора: такой перечень в контракте API не задан.

Объект Channel

Условный пример одного канала:
Массив channels описывает учтённые каналы, а не полный список каналов Discord-сервера. Пустой массив при отсутствии отчёта не доказывает, что на сервере нет каналов или сообщений.

Статусы отчёта

При обработке ответа сначала проверьте HTTP-статус, затем server.status или статусы элементов servers. Одной проверки response.ok недостаточно для вывода о полноте статистики.

null и ноль

totalMessages: 0 — числовое значение счётчика. totalMessages: null — пригодного отчёта нет. Эти состояния нельзя объединять: подмена null нулём создаст ложное падение активности и исказит сравнение серверов.
Пример отображения
Это пример только для отображения значения. Статус отчёта показывайте отдельно, в том числе когда числовой счётчик присутствует. Для дня, недели и диапазона действуют дополнительные правила:
  • Нет хотя бы одного дневного отчёта сервера — totalMessages: null; частичная сумма не выдаётся за весь период.
  • Все дни есть, но хотя бы один отчёт устарел — сумма сохраняется со статусом stale.
  • generatedAt составного периода — самое раннее время формирования входящих отчётов.

Свежесть данных

Смотрите на status и generatedAt вместе. generatedAt обозначает время формирования отчёта, а не время последнего сообщения или последнего обращения к API. Для архивных дневных снимков старая дата формирования сама по себе не означает неисправность: API сохраняет завершённые дни. refreshMinutes задаёт паузу между проходами сборщика. Сам сбор также занимает время, а серверы могут иметь разные generatedAt. Вызов API не запускает немедленное обновление статистики.
Не выводите одинаковое время обновления для всего списка на основании одного сервера. Время формирования принадлежит конкретному отчёту.

Иконки и баннеры

Поля iconUrl и bannerUrl содержат текущие метаданные сервера, даже при запросе архивного периода или при отсутствии отчёта. Это не исторические изображения на дату статистики. Для получения изображений без статистики используйте GET /api/discord-icons. Метод возвращает JSON со ссылками на Discord CDN. У объектов в этом ответе есть только поля number, name, guildId, iconUrl и bannerUrl; счётчики и статусы отчётов не требуются. Иконка и баннер обновляются сборщиком вместе. В старых метаданных без баннера bannerUrl остаётся null до обновления. Если метаданные недоступны или повреждены, метод иконок может ответить HTTP 200 с iconUrl: null; сам HTTP-запрос не запускает обновление из Discord.