Skip to content

Latest commit

 

History

History
executable file
·
348 lines (308 loc) · 14.8 KB

chat.md

File metadata and controls

executable file
·
348 lines (308 loc) · 14.8 KB

API Чата

  1. Протокол взаимодействия
  2. Оповещение сервера
  3. Оповещение клиента
  4. Каналы чата
  5. Типы сообщений

Протокол взаимодействия

Клиент и сервер обмениваются событиями через 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 с текстом ошибки.

Подписаться на события пользователя

WS P /chat/login

запрос

{
    token: string; // JWT токен
}

ответ

{}

*jwt.io
Подписывает на события, относящиеся к пользователю.

Отписаться от событий пользователя

WS A /chat/logout

запрос

{}

ответ

{}

Отписывает от событий, относящихся к пользователю.

Присоединится к каналу

WS P /chat/join

запрос

{
    channel: string;  // Идентификатор канала, см. раздел 4
}

ответ

{}

Присоединяет к событиям выбранного канала, если канал не указан - присоединяет к общему.

Покинуть канал

WS P /chat/leave

запрос

{
    channel: string; // Идентификатор канала, см. раздел 4
}

ответ

{}

Отсоединяет от событий выбранного канала.

История канала

WS P /chat/history

запрос

{
    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))

Отправить сообщение

WS A /chat/publish

запрос

{
    channel: string; // Идентификатор канала, см. раздел 4
    from: {
        id: number; // Идентификатор пользователя
        name: string; // Имя пользователя
    }
    to?: Object {
        id: number; // Идентификатор пользователя
        name: string; // Имя пользователя
    }
    text: string; // Текст сообщения
    anonymous: boolean; // Анонимное сообщение
}

ответ

{
    id: number; // Идентификатор добавленного сообщения
}

Будет работать только после /chat/login

Список пользователей в канале

WS P /chat/channel/list

запрос

{
    channel: string; // Идентификатор канала, см. раздел 4
}

ответ

{
    amount: number; // Кол-во сессий в этом канале
    users: [ // Список залогиненных пользователей
        Object, // Данные пользователя, объект из ответа /api/user
        ...
    ]
}

/api/user
Только для публичных каналов(main, stream/*)
В поле amount содержится общее число всех активных сессий в этом канале. Любая открытая вкладка браузера с чатом этого канала будет давать сессию.

Оповещение клиента

События, которые получает подключившийся к сокету клиент.
Некоторые могут требовать предварительной аутентификации через метод /chat/login.

Новое сообщение

WS P /chat/message
{
    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
Приходит для всех сообщений в подсоединённый канал.

Удаление сообщения

WS P /chat/message/remove
{
    id: number; // Идентификатор сообщения
    channel: string; // Идентификатор канала, см. раздел 4
    reason: string; // Причина удаления
    data: Object; // Дополнительные данные, зависят от причины удаления
}

Приходит для сообщений, которые должны быть удалены из чата.
В зависимости от причины удаления может содержать дополнительные данные. Ниже указано содержание объекта data для разных причин.

ban
{
    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)