Перейти к основному содержимому

Статистика сервера

Операции возвращают статистику серверов выбранного проекта. Публичный счётчик текущего онлайна независим от выключения исторического графика, но требует site.statistics.online: true. Переключатели публикации, персонажи и аккаунты описаны отдельно; отсутствующие настройки считаются выключенными.

Текущий онлайн​

QuerydocumentId: serversOnlineauth: public

serversOnline​

Опубликованный онлайн одного, нескольких или всех серверов текущего проекта через общую точку GraphQL.

Выбор серверов​

  • Без gameServerIds или с null: все серверы проекта.
  • gameServerIds: [1]: один сервер.
  • gameServerIds: [1, 2]: выбранные серверы. В списке допускается от 1 до 100 уникальных ID.
  • Указывайте уникальные ID серверов выбранного проекта; пустой список недопустим.

Результат​

Тип ответа: [ServerOnline!]. Внешний список допускает null: при выключенном site.statistics.online поле целиком равно null. Если публикация включена, но у проекта нет серверов, возвращается пустой список.

ПолеТипОписание
gameServerIdInt!Игровой сервер.
stateServerOnlineState!FRESH, STALE, MISSING или UNAVAILABLE.
currentUnsignedIntОпубликованный онлайн с учётом настроенной прибавки и множителя.
peakUnsignedIntРекорд опубликованного онлайна среди сохранённых замеров.
observedAtStringВремя замера в UTC, RFC 3339.
staleAtStringВремя, после которого замер считается устаревшим.
loginAvailableBooleanРезультат проверки доступности сервера входа.
gameAvailableBooleanРезультат проверки доступности игрового сервера.

UnsignedInt передаётся числом JSON в диапазоне от 0 до 4 294 967 295, без строковых преобразований.

0 означает измеренный нулевой онлайн. MISSING означает отсутствие замера, UNAVAILABLE означает временную недоступность данных; в обоих случаях числовые поля и время равны null. При STALE сохраняются последнее значение и время замера. Положительный онлайн не доказывает доступность сервера.

Проверки доступности возвращают null, если нет актуального результата или проверка не настроена. При отображении сохранённого ответа учитывайте staleAt. Множитель повторно на сайте не применяется.

Общий онлайн вычисляется по нужным строкам ответа. Если хотя бы одного замера нет, сумму нельзя подписывать как полный онлайн. Если один из замеров устарел, общий счётчик тоже должен быть отмечен как устаревший.

Пример обмена​

Запрос
documentId: serversOnline
{
"documentId": "serversOnline",
"variables": {
"gameServerIds": [
1,
2
]
}
}
Ответ
200 OK
{
"data": {
"serversOnline": [
{
"gameServerId": 1,
"state": "FRESH",
"current": 1250,
"peak": 1800,
"observedAt": "2026-09-08T13:30:00.000000Z",
"staleAt": "2026-09-08T13:40:00.000000Z",
"loginAvailable": true,
"gameAvailable": true
},
{
"gameServerId": 2,
"state": "MISSING",
"current": null,
"peak": null,
"observedAt": null,
"staleAt": null,
"loginAvailable": null,
"gameAvailable": null
}
]
}
}

История онлайна​

QuerydocumentId: serverOnlineHistoryauth: public

serverOnlineHistory​

История опубликованного онлайна и разрешённых рядов населения. Один элемент содержит среднее по реально полученным измерениям за интервал, а не отдельный замер. Пустые интервалы не заполняются нулями.

Переключатели проекта действуют дополнительно к настройкам рядов сервера: выключенный site.statistics.online скрывает points[].online, а выключенный site.statistics.characters скрывает points[].characters. Скрытые значения равны null. Пример ниже предполагает включённую публикацию обоих показателей.

Входные данные​

ПолеТипОписание
gameServerIdInt!ID доступного игрового сервера.
rangeOnlineReportRange!Период. По умолчанию WEEK.
ПериодПродолжительностьИнтервал графика
DAYПоследние 24 часа5 минут
WEEKПоследние 7 дней15 минут
MONTHПоследние 30 дней1 час
QUARTERПоследние 90 дней3 часа

Результат​

ServerOnlineHistory!

ПолеТипОписание
metaOnlineReportMetadata!Состояние измерений и даты обновления.
periodOnlineReportPeriodГраницы from, until в UTC; начало включено, конец исключён.
bucketSecondsIntДлительность интервала в секундах.
points[OnlineHistoryBucket!]!Не более 721 непустого интервала в хронологическом порядке.
points[].timestampString!Начало интервала UTC в RFC3339. Первый интервал может начинаться до period.from.
points[].samplesUnsignedInt!Количество измерений в интервале внутри запрошенного периода.
points[].onlineFloatСредний опубликованный онлайн; null при скрытом ряде.
points[].charactersFloatСреднее число персонажей; null при скрытом ряде.
points[].clansFloatСреднее число кланов; null при скрытом или неподдерживаемом показателе.

При отсутствии измерений или разрешённых рядов points пуст. Измеренный ноль остаётся значением 0, а промежутки без данных остаются разрывами графика.

Состояние данных​

Поле meta.state принимает FRESH, STALE, MISSING или UNAVAILABLE. Свежесть относится к последнему измерению, а не к возрасту рекорда или отдельных исторических точек.

generatedAt - время формирования ответа, observedAt - последнее измерение, staleAt - время, после которого оно считается устаревшим. Все даты передаются в RFC3339 UTC. При MISSING даты измерений равны null. При UNAVAILABLE даты, периоды и скалярные значения отчёта равны null, коллекции пусты.

Недоступный раздел или неверные параметры возвращают ошибку GraphQL без данных. Не заменяйте ошибку состоянием MISSING или нулевым отчётом.

Пример обмена​

Запрос
documentId: serverOnlineHistory
{
"documentId": "serverOnlineHistory",
"variables": {
"gameServerId": 97010,
"range": "DAY"
}
}
Ответ
200 OK
{
"data": {
"serverOnlineHistory": {
"meta": {
"state": "STALE",
"generatedAt": "2026-09-08T17:29:57.251Z",
"observedAt": "2026-09-08T17:19:26.799Z",
"staleAt": "2026-09-08T17:29:26.799Z"
},
"period": {
"from": "2026-09-07T17:29:57.000000Z",
"until": "2026-09-08T17:29:57.000000Z"
},
"bucketSeconds": 300,
"points": [
{
"timestamp": "2026-09-08T15:00:00Z",
"samples": 6,
"online": 6.333333333333333,
"characters": 12,
"clans": 4
},
{
"timestamp": "2026-09-08T17:15:00Z",
"samples": 6,
"online": 6.333333333333333,
"characters": 12,
"clans": 4
}
]
}
}
}

Хроника Рейтингов​

QuerydocumentId: serverTimelineauth: public

serverTimeline​

Описание​

Изменения лидеров и позиций в опубликованных рейтингах с курсорной пагинацией. Это не журнал изменений онлайна. При недействительном или устаревшем курсоре начните с первой страницы.

Входные данные​

ПолеТипОбязательныйОписание
gameServerIdInt✓ID игрового сервера.
firstIntнетРазмер страницы от 1 до 50. По умолчанию 20.
afterStringнетКурсор из pageInfo.endCursor предыдущей страницы.

Результат​

Тип ответа - TimelineEventConnection!. События находятся в nodes, состояние следующей страницы - в pageInfo.

Ошибки​

  • SERVER_NOT_FOUND - сервер не найден или недоступен.
  • VALIDATION - обязательные параметры указаны неверно.

Пример обмена​

Запрос
documentId: serverTimeline
{
"documentId": "serverTimeline",
"variables": {
"gameServerId": 1,
"first": 20,
"after": null
}
}
Ответ
200 OK
{
"data": {
"serverTimeline": {
"nodes": [
{
"date": "2026-07-17 18:30:00",
"event": "new_leader",
"data": {
"type": "top_pvp",
"name": "Asterios",
"value": 18420
}
}
],
"pageInfo": {
"hasNextPage": true,
"endCursor": "eyJrZXkiOiJjOGQwMTc4MTBlMzA2MzQyN2VmMzg1ODhjYjVkN2EzNzgyNDQzMTE1OWJhY2YwMmI0MDRiMmEyY2Q0MmEyY2Y3In0"
}
}
}
}

Связанные типы​

Рекорды онлайна​

QuerydocumentId: serverRecordsauth: public

serverRecords​

Максимальный опубликованный онлайн с временем первого достижения одинакового максимума. Рекорды рассчитываются по сохранившимся измерениям; удалённая история в расчёт не входит.

Входные данные​

ПолеТипОписание
gameServerIdInt!ID доступного игрового сервера.

Результат​

ServerRecords!

ПолеТипОписание
metaOnlineReportMetadata!Состояние измерений и даты обновления.
allTimeOnlineRecordМаксимум за всю сохранённую историю.
todayOnlineRecordС начала текущих суток UTC.
weekOnlineRecordЗа предыдущие 7 дней.
monthOnlineRecordС начала текущего календарного месяца UTC.
valueUnsignedInt!Измеренный максимум, в том числе 0.
observedAtString!Время замера рекорда в RFC3339 UTC.

Каждый рекорд равен null при отсутствии измерений за его период. Вымышленные даты и нулевые рекорды не подставляются. Выбор периода графика не меняет периоды этих четырёх рекордов.

Состояние данных​

Поле meta.state принимает FRESH, STALE, MISSING или UNAVAILABLE. Свежесть относится к последнему измерению, а не к возрасту рекорда или отдельных исторических точек.

generatedAt - время формирования ответа, observedAt - последнее измерение, staleAt - время, после которого оно считается устаревшим. Все даты передаются в RFC3339 UTC. При MISSING даты измерений и все четыре рекорда равны null. При UNAVAILABLE все даты в meta и все четыре рекорда равны null.

Недоступный раздел или неверные параметры возвращают ошибку GraphQL без данных. Не заменяйте ошибку состоянием MISSING или нулевым отчётом.

Пример обмена​

Запрос
documentId: serverRecords
{
"documentId": "serverRecords",
"variables": {
"gameServerId": 97010
}
}
Ответ
200 OK
{
"data": {
"serverRecords": {
"meta": {
"state": "STALE",
"generatedAt": "2026-09-08T17:29:51.696Z",
"observedAt": "2026-09-08T17:19:26.799Z",
"staleAt": "2026-09-08T17:29:26.799Z"
},
"allTime": {
"value": 9,
"observedAt": "2026-09-08T15:03:26.016Z"
},
"today": {
"value": 9,
"observedAt": "2026-09-08T15:03:26.016Z"
},
"week": {
"value": 9,
"observedAt": "2026-09-08T15:03:26.016Z"
},
"month": {
"value": 9,
"observedAt": "2026-09-08T15:03:26.016Z"
}
}
}
}

Тепловая карта активности​

QuerydocumentId: serverActivityHeatmapauth: public

serverActivityHeatmap​

Средний опубликованный онлайн по дню недели и часу UTC за выбранный период. Возвращаются только ячейки, для которых есть измерения.

Входные данные​

ПолеТипОписание
gameServerIdInt!ID доступного игрового сервера.
rangeOnlineReportRange!Период. По умолчанию MONTH.

Допустимые периоды: DAY (24 часа), WEEK (7 дней), MONTH (30 дней), QUARTER (90 дней).

Результат​

ServerActivityHeatmap!

ПолеТипОписание
metaOnlineReportMetadata!Состояние измерений и даты обновления.
periodOnlineReportPeriodГраницы from, until в UTC; начало включено, конец исключён.
cells[OnlineActivityCell!]!До 168 непустых ячеек.
cells[].weekdayInt!От 1 (понедельник) до 7 (воскресенье).
cells[].hourInt!Час UTC от 0 до 23.
cells[].samplesUnsignedInt!Количество измерений.
cells[].averageFloat!Среднее по измерениям ячейки, включая измеренные нули.

Отсутствующая ячейка означает отсутствие измерений, а не нулевой онлайн.

Состояние данных​

Поле meta.state принимает FRESH, STALE, MISSING или UNAVAILABLE. Свежесть относится к последнему измерению, а не к возрасту рекорда или отдельных исторических точек.

generatedAt - время формирования ответа, observedAt - последнее измерение, staleAt - время, после которого оно считается устаревшим. Все даты передаются в RFC3339 UTC. При MISSING даты измерений равны null. При UNAVAILABLE даты, периоды и скалярные значения отчёта равны null, коллекции пусты.

Недоступный раздел или неверные параметры возвращают ошибку GraphQL без данных. Не заменяйте ошибку состоянием MISSING или нулевым отчётом.

Пример обмена​

Запрос
documentId: serverActivityHeatmap
{
"documentId": "serverActivityHeatmap",
"variables": {
"gameServerId": 97010,
"range": "DAY"
}
}
Ответ
200 OK
{
"data": {
"serverActivityHeatmap": {
"meta": {
"state": "STALE",
"generatedAt": "2026-09-08T17:29:57.420Z",
"observedAt": "2026-09-08T17:19:26.799Z",
"staleAt": "2026-09-08T17:29:26.799Z"
},
"period": {
"from": "2026-09-07T17:29:57.000000Z",
"until": "2026-09-08T17:29:57.000000Z"
},
"cells": [
{
"weekday": 2,
"hour": 15,
"samples": 6,
"average": 6.333333333333333
},
{
"weekday": 2,
"hour": 17,
"samples": 6,
"average": 6.333333333333333
}
]
}
}
}

Распределение классов​

QuerydocumentId: rankingClassDistributionauth: public

rankingClassDistribution​

Считает каждого персонажа один раз среди текущих опубликованных рейтингов, в пределах настроенного размера топов. Это не население всего игрового мира. Если наблюдения различаются, используется самое свежее значение класса; неизвестный класс не заменяется старым известным значением.

Требуются включённые раздел распределения классов и публикация site.statistics.characters. Таблицы рейтингов и быстро растущие игроки настраиваются независимо.

Единственный входной параметр: gameServerId: Int!, положительный ID сервера текущего проекта.

Поле результатаЗначение
stateFRESH, STALE, PARTIAL, MISSING, SOURCE_ERROR или UNAVAILABLE.
generatedAt, observedAtДаты отчёта UTC; null для UNAVAILABLE.
totalCharactersУникальные персонажи доступных опубликованных топов.
unknownCharactersПерсонажи, у которых в самом свежем наблюдении нет кода класса.
classescode и целочисленное count, по убыванию количества и возрастанию кода. Код "0" допустим.
sourcestype, state, snapshotId, capturedAt, staleAt каждого выбранного рейтинга. Метаданные отсутствующего наблюдения равны null.

sum(classes.count) + unknownCharacters = totalCharacters. Доля считается от этого общего числа, включая неизвестные классы. Клиент определяет названия по игровому справочнику; коды классов не являются расами.

PARTIAL означает, что некоторые рейтинги ещё не получены или завершились ошибкой; количества рассчитаны по остальным наблюдениям. STALE сохраняет доступные, но задержавшиеся данные. Успешные пустые наблюдения возвращают FRESH или STALE с нулевыми количествами. Нулевые количества при MISSING и SOURCE_ERROR не подтверждают отсутствие персонажей в игре. UNAVAILABLE возвращает null вместо количеств, пустые списки и null вместо дат.

Запрос
documentId: rankingClassDistribution
{
"documentId": "rankingClassDistribution",
"variables": {
"gameServerId": 1
}
}
Ответ
200 OK
{
"data": {
"rankingClassDistribution": {
"state": "PARTIAL",
"generatedAt": "2026-09-09T10:00:00.000Z",
"observedAt": "2026-09-09T10:00:00.000Z",
"totalCharacters": 6,
"unknownCharacters": 1,
"classes": [
{
"code": "88",
"count": 3
},
{
"code": "94",
"count": 2
}
],
"sources": [
{
"type": "top_exp",
"state": "FRESH",
"snapshotId": "01a07fab-8130-7000-8000-000000000001",
"capturedAt": "2026-09-09T09:59:00.000Z",
"staleAt": "2026-09-09T10:59:00.000Z"
},
{
"type": "top_hero",
"state": "MISSING",
"snapshotId": null,
"capturedAt": null,
"staleAt": null
}
]
}
}
}