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

Обзор Gateway

Gateway — это постоянное WebSocket-соединение с Floodilka. Через него клиент получает события (новые сообщения, присоединения участников, изменения голосового состояния и т.д.) и отправляет служебные команды (heartbeat, обновление статуса, запрос списка участников).

REST API нужен для действий (отправить сообщение, создать канал). Gateway — для подписки на то, что происходит.

Основной адрес:

wss://gateway.floodilka.com/

Но рекомендуется сначала получить актуальный URL из REST — так клиент автоматически подхватит миграцию на другой кластер:

Окно терминала
curl https://floodilka.com/api/v1/gateway/bot \
-H "Authorization: Bot ВАШ_БОТ_ТОКЕН"

Ответ:

{
"url": "wss://gateway.floodilka.com",
"shards": 1,
"session_start_limit": {
"total": 1000,
"remaining": 999,
"reset_after": 14400000,
"max_concurrency": 1
}
}
  • url — к нему надо подключаться. Может меняться при инфраструктурных работах
  • session_start_limit — сколько новых IDENTIFY разрешено. Ограничение мягкое, но ретраи в цикле IDENTIFY → INVALID_SESSION → IDENTIFY съедают бюджет быстро

URL принимает параметры в query-строке:

ПараметрЗначенияОписание
v1Обязательный. Версия протокола. Без — 4012 INVALID_API_VERSION
encodingjsonФормат сообщений. Сейчас поддержан только json
compressnone (по умолчанию), zstd-streamСжатие потоковых сообщений через zstd

Типичный URL:

wss://gateway.floodilka.com/?v=1&encoding=json

С zstd-сжатием (полезно для ботов на больших серверах):

wss://gateway.floodilka.com/?v=1&encoding=json&compress=zstd-stream

Каждое сообщение — JSON-объект с четырьмя полями:

{
"op": 0,
"d": { "content": "hello" },
"s": 42,
"t": "MESSAGE_CREATE"
}
ПолеКогда естьЗначение
opВсегдаОпкод. См. Опкоды
dПочти всегдаPayload. Форма зависит от op или t
sТолько при op: 0Номер события в сессии. Его надо помнить для heartbeat и RESUME
tТолько при op: 0Тип события. См. События
import {WebSocket} from 'ws';
const ws = new WebSocket('wss://gateway.floodilka.com/?v=1&encoding=json');
ws.on('message', (raw) => {
const msg = JSON.parse(raw.toString());
if (msg.op === 10) {
// HELLO — запускаем heartbeat и отправляем IDENTIFY
setInterval(() => ws.send(JSON.stringify({op: 1, d: null})), msg.d.heartbeat_interval);
ws.send(JSON.stringify({
op: 2,
d: {
token: process.env.FLOODILKA_BOT_TOKEN,
properties: {os: 'linux', browser: 'mybot', device: 'mybot'},
},
}));
}
if (msg.op === 0 && msg.t === 'READY') console.log('ready', msg.d.user.username);
if (msg.op === 0 && msg.t === 'MESSAGE_CREATE') console.log('msg', msg.d.content);
});