- Протокол взаимодействия
- Оповещение сервера
WS
P
/chat/login
Подписаться на события пользователяWS
A
/chat/logout
Отписаться от событий пользователяWS
P
/chat/join
Присоединится к каналуWS
P
/chat/leave
Покинуть каналWS
P
/chat/history
История каналаWS
A
/chat/publish
Отправить сообщениеWS
P
/chat/channel/list
Список пользователей в канале
- Оповещение клиента
- Каналы чата
- Типы сообщений
Клиент и сервер обмениваются событиями через websocket библиотеку socket.io
. Адрес подключения - wss://chat.peka2.tv
(в зависимости от используемой библиотеки может понадобится указать боле полный вариант - wss://chat.peka2.tv/?EIO=3&transport=websocket
, так же доступно подключение по ws:// протоколу). Поддерживается только 13 версия протокола websocket.
При соединении значении опции transports
может быть только 'websocket'. Все события для сервера получают ответ через коллбек.
Примеры взаимодействия для разных языков
В сообщениях чата могут встречаться bbcode теги.
Все параметры должны отправляться с данными тех типов, что указаны в документации. В случае неверного типа сервер может ничего не ответить на запрос.
{
status: string; // 'ok' при успешном выполнении, 'error' при ошибке
result: Array | Object | null;
}
Далее в блоке ответ у методов указано содержимое поля result
в случае успешного выполнения.
В случае ошибки обязательно присутствует объект result
и содержит поле message
с текстом ошибки.
запрос
{
token: string; // JWT токен
}
ответ
{}
*jwt.io
Подписывает на события, относящиеся к пользователю.
запрос
{}
ответ
{}
Отписывает от событий, относящихся к пользователю.
запрос
{
channel: string; // Идентификатор канала, см. раздел 4
}
ответ
{}
Присоединяет к событиям выбранного канала, если канал не указан - присоединяет к общему.
запрос
{
channel: string; // Идентификатор канала, см. раздел 4
}
ответ
{}
Отсоединяет от событий выбранного канала.
запрос
{
channel: string; // Идентификатор канала, см. раздел 4
amount: number; // Необходимое количество сообщений для выборки
query?: Object { // Дополнительные условия выборки, см. описание ниже
conditions: [ // Список условий
{ // Условие
field: string; // Имя поля
operation: string; // Тип сравнения
value: string[], // Массив строковых значений
glue: string; // Тип соединения в запросе
},
...
],
groups: [ // Список групп условий, такие же объекты как `query` произвольной вложенности
Object,
...
],
glue: string; // Тип соединения, для верхнего уровня всегда 'and'
}
}
ответ
[
Object, // Сообщение, объект из события клиента /chat/message
...
]
/chat/message
Параметр запроса query
позволяет уточнить выборку дополнительными условиями по разным полям.
Формат объектов groups
совпадает с форматом этого объекта. Для query
тип соединения всегда and
.
Группы это условия из conditions
внутри скобок с указанным в glue
соединителем перед ними. Тип соединения первого элемента в массиве conditions
игнорируется.
Доступные значения полей условия
field
- [id, from, to, type]- id - идентификатор сообщения
- from - идентификатор автора сообщения
- to - идентификатор пользователя, к которому обращаются
- type - тип сообщения, см. раздел 5
- anonymous - анонимные сообщения
operation
- [in, not in, =, <>, <, >]value
- все значения обязательно строковые, для одиночного значения указывать внутри массива, например ['1']glue
- [and, or], только в нижнем регистре
Примеры query
и условие запроса которые они дадут
- сообщения только указанного пользователя и обращения к нему
{
conditions: [],
groups: [
{
conditions: [
{field: 'from', operation: '=', value: [1], glue: 'or'},
{field: 'to', operation: '=', value: [1], glue: 'or'}
],
groups: [],
glue: 'and'
}
],
glue: 'and'
}
AND ((`from` = 1 OR `to` = 1))
- без сообщений указанных пользователей(игнор), включая обращения
{
conditions: [
{field: 'from', operation: 'not in', value: [1, 2, 3], glue: 'and'},
{field: 'to', operation: 'not in', value: [1, 2, 3], glue: 'and'}
],
groups: [],
glue: 'and'
}
AND (`from` not in (1, 2, 3) AND `to` not in (1, 2, 3))
- оба случая вместе
{
conditions: [
{field: 'from', operation: 'not in', value: [1, 2, 3], glue: 'and'},
{field: 'to', operation: 'not in', value: [1, 2, 3], glue: 'and'}
],
groups: [
{
conditions: [
{field: 'from', operation: '=', value: [1], glue: 'or'},
{field: 'to', operation: '=', value: [1], glue: 'or'}
],
groups: [],
glue: 'and'
}
],
glue: 'and'
}
AND (`from` not in (1, 2, 3) AND `to` not in (1, 2, 3) AND (`from` = 1 OR `to` = 1))
запрос
{
channel: string; // Идентификатор канала, см. раздел 4
from: {
id: number; // Идентификатор пользователя
name: string; // Имя пользователя
}
to?: Object {
id: number; // Идентификатор пользователя
name: string; // Имя пользователя
}
text: string; // Текст сообщения
anonymous: boolean; // Анонимное сообщение
}
ответ
{
id: number; // Идентификатор добавленного сообщения
}
Будет работать только после /chat/login
запрос
{
channel: string; // Идентификатор канала, см. раздел 4
}
ответ
{
amount: number; // Кол-во сессий в этом канале
users: [ // Список залогиненных пользователей
Object, // Данные пользователя, объект из ответа /api/user
...
]
}
/api/user
Только для публичных каналов(main
, stream/*
)
В поле amount
содержится общее число всех активных сессий в этом канале.
Любая открытая вкладка браузера с чатом этого канала будет давать сессию.
События, которые получает подключившийся к сокету клиент.
Некоторые могут требовать предварительной аутентификации через метод /chat/login
.
{
id: number; // Идентификатор сообщения
channel: string; // Идентификатор канала, см. раздел 4
from: { // Отправитель сообщения
id: number; // Идентификатор пользователя
name: string; // Имя пользователя
},
to: Object | null; // Получатель сообщения, аналогично from
text: string; // Текст сообщения
time: unixtime; // Время сообщения
type: string; // Тип сообщения, см. раздел 5
store: { // Активные бонусы пользователя отправителя
bonuses: number[]; // Список идентификаторов купленных бонусов, см /api/store/bonus/list
icon: number; // Идентификатор активной иконки, см /api/icon/list
subscriptions: number[]; // Список идентификаторов стримеров на которых подписан пользователь
};
parentId: number; // Идентификатор сообщения родителя
anonymous: boolean; // Флаг анонимного сообщения
}
/api/store/bonus/list
, /api/icon/list
Приходит для всех сообщений в подсоединённый канал.
{
id: number; // Идентификатор сообщения
channel: string; // Идентификатор канала, см. раздел 4
reason: string; // Причина удаления
data: Object; // Дополнительные данные, зависят от причины удаления
}
Приходит для сообщений, которые должны быть удалены из чата.
В зависимости от причины удаления может содержать дополнительные данные.
Ниже указано содержание объекта data
для разных причин.
{
banId: number; // Идентификатор бана
reasonId: number; // Идентификатор причины бана
}
Удаление сообщения при бане гражданами.
main
Мэин чат(общий)admin
Админка(доступ у модераторов, саппортов)all
Общий поток публичных каналов(main
,stream/*
)system
Системные сообщенияstream/<streamerId>
Стримgoodgame.ru/<streamerId>
Сообщения с гудгеймаtwitch.tv/<streamerId>
Сообщения с твичаsupport/<id>
Вопрос к поддержкеprivate/<fromId>/<toId>
Личные сообщения, (from_id <= to_id)comments/stream/<streamerId>
Комментарии к стримуcomments/longread/<articleId>
Комментарии к статьеcomments/news/<newsPostId>
Комментарии к новостиcomments/blog/<blogPostId>
Комментарии к блогу
streamerId
, fromId
, toId
- идентификаторы соответствующих пользователей
message
Обычное сообщение(включая другие стримсервисы)system
Системные сообщенияdonate
Донатcomment
Комментарии к публикациям (комментарии к стримам имеют типmessage
)