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

Плагины чата

Если вы хотите создать плагин, который будет взаимодействовать в чате, реагировать на зрителей или модерировать сообщения, это страница, с которой стоит начать. Примеры кода представлены на обоих поддерживаемых языках. Сначала настройте вашу цепочку инструментов на странице SDK для JavaScript или Python.

Owncast предоставляет функционал чата на трех уровнях:

  1. Обработчики событий чата, чтобы ваш плагин мог реагировать, когда люди разговаривают, присоединяются, выходят или меняют своё имя.
  2. API чата и пользователей, чтобы ваш плагин мог отправлять сообщения, проверять состояние чата и модерировать пользователей.
  3. Фильтры чата, чтобы ваш плагин мог переписывать или удалять сообщения до того, как их увидят зрители.

Что вы можете создать​

  • Чат-боты, которые отвечают на команды или ключевые слова.
  • Приветственные боты, которые приветствуют людей, когда они присоединяются.
  • Боты-напоминалисты, которые отправляют сообщения, когда начинается трансляция.
  • Боты обратного отсчета и таймеры, работающие на основе owncast.timer или обработчика тиков.
  • Помощники модерации, которые скрывают сообщения, отключают клиентов или отключают агрессивных пользователей.
  • Фильтры, которые переписывают, переводят или удаляют сообщения перед их трансляцией.

Бот-ответчик - это всего лишь один обработчик:

const { definePlugin, owncast } = require("@owncast/plugin-sdk");

module.exports = definePlugin({
onChatMessage(msg) {
const name = msg.user?.displayName ?? "someone";
owncast.chat.send(`${name} said: ${msg.body}`);
},
});

Реакция на чат​

Определите onChatMessage (@plugin.on_chat_message в Python), чтобы видеть каждое сообщение после проверки фильтров и перед его трансляцией зрителям:

module.exports = definePlugin({
onChatMessage(msg) {
owncast.chat.send(`echo: ${msg.body}`);
},
});

Поля, к которым вы чаще всего обращаетесь, это msg.body (сырой текст), msg.user (идентичность отправителя, с user.id для состояния по каждому пользователю и user.scopes для проверки модератора), и msg.timestamp (детерминированный, поэтому предпочитайте его часам при сравнении прошедшего времени или утверждении в тестах). Не привязывайте состояние или разрешения к отображаемым именам.

Для полного содержимого сообщений и каждого другого события, на которое может подписаться чат-плагин (вход и выход пользователей, переименование, модерация и т. д.), смотрите Справочник событий.

Отправка сообщений в чате​

owncast.chat.send​

Отправить сообщение в чате. Отправляется от имени бота вашего плагина. Принимает обычный текст, а не разметку: пользовательский интерфейс чата экранирует его при отображении, поэтому такие символы, как \<, &, и " отображаются как текст, а не HTML.

owncast.chat.send("hello chat");
owncast.chat.sendAction("waves"); // /me-style action message
owncast.chat.system("Stream starting in 5 minutes");

Требует chat.send.

owncast.chat.sendAction​

Отправить сообщение в стиле действия (/me): sendAction на JavaScript, send_action на Python. Как и send, принимает обычный текст и экранирован HTML пользовательским интерфейсом чата при отображении.

Требует chat.send.

owncast.chat.system​

Отправить сообщение серверного объявления. Идентичность бота не прикреплена. Содержимое отображается встроенным HTML. Используйте это для коротких уведомлений, атрибутированных сервером, таких как "Трансляция начнется через 5 минут". Считайте содержимое ненадежным HTML-кодом: не интерполируйте контролируемый зрителем вход, не экранируя его.

Требует chat.send.

Идентичность чата​

У каждого плагина есть ровно одна идентичность чата: бот, который Owncast предоставляет при установке вашего плагина. Его отображаемое имя — это bot.displayName вашего манифеста, если оно установлено, иначе name.

Оба send и sendAction отправляют от этого имени через нормальную цепочку чата Owncast, включая фильтры, ограничения по частоте и модерацию. Плагины не могут отправлять сообщения под произвольными именами или выдавать себя за реальных пользователей.

Пользователь бота определяется по slug плагина, поэтому идентичность сохраняется даже после редактирования манефеста в части name или bot.displayName. Если вам нужно несколько персонажей чата, доставьте несколько плагинов.

Чтение состояния чата​

owncast.chat.history​

Вернуть самые последние сообщения чата (необязательное ограничение по умолчанию — 50). Каждая запись имеет форму { id, user?, clientId?, body, timestamp }.

Требует chat.history.

owncast.chat.clients​

Return the list of currently connected chat clients: { id, userId?, displayName?, connectedAt?, userAgent?, ipAddress?, messageCount? }. id - это идентификатор клиента на соединение, используемый owncast.chat.kick.

Требует chat.history.

owncast.server.emotes​

Читать индивидуальные чат-емодзи сервера ({ имя, url }), когда ваш бот хочет ссылаться на или воспроизводить каталог емодзи.

Требует server.read.

owncast.users.list и owncast.users.get​

Читать список пользователей чата или одну запись пользователя по id.

Требует users.read.

API модерации​

Это deleteMessage / kick / sendTo / replyTo на JavaScript и delete_message / kick / send_to / reply_to на Python.

owncast.chat.deleteMessage​

Скрыть сообщение чата от зрителей по идентификатору сообщения.

Требует chat.moderate.

owncast.chat.kick​

Отключить клиента чата по идентификатору клиента.

Требует chat.moderate.

owncast.chat.sendTo​

Отправить личное сообщение одному подключенному клиенту по идентификатору клиента.

Требует chat.send.

owncast.chat.replyTo​

Отправить ответ обратно тому, кто отправил сообщение в чате. Вы можете передать либо полный объект сообщения из обработчика чат-сообщений / фильтра, либо только идентификатор клиента, если это все, что у вас есть. Возвращает ложное значение, когда соединение отправителя больше не известно, что позволяет вам спокойно вернуться к публичному сообщению.

module.exports = definePlugin({
onChatMessage(msg) {
if (!owncast.chat.replyTo(msg, "psst: got your message")) {
owncast.chat.send("got your message"); // sender already disconnected
}
},
});

Требует chat.send.

Команды​

Для команд чата объявите таблицу команд с псевдонимами, периодами ожидания, контролем модераторов и автоматическими списками !help. Смотрите Команды чата.

Модерация пользователей​

owncast.users.setEnabled​

Включить или отключить пользователя чата по идентификатору, с необязательной причиной: setEnabled на JavaScript, set_enabled на Python.

Требует users.moderate.

owncast.users.banIP​

Запретить IP-адрес на вход в чат: banIP на JavaScript, ban_ip на Python.

Требует users.moderate.

Фильтры чата​

Фильтры видят сообщения чата до их трансляции с возможностью переписать или удалять их. Фильтры выполняются сначала с наименьшим приоритетом. drop завершает цепочку, и сообщение никогда не достигает более поздних фильтров или уведомлений. modify передает новое содержимое следующему фильтру.

filterChatMessage​

Принимает ту же форму ChatMessage, что и обработчик сообщений чата, и возвращает один из трех результатов, построенных с помощью помощника filter:

  • pass: пропустить сообщение без изменений.
  • modify: заменить его новым содержимым.
  • drop: удалить его (с причиной). Цепочка останавливается здесь.
const { definePlugin, filter } = require("@owncast/plugin-sdk");

module.exports = definePlugin({
filterChatMessage(msg) {
if (msg.body.includes("spam")) return filter.drop("spam keyword");
if (msg.body.includes("damn")) {
return filter.modify({ ...msg, body: msg.body.replace("damn", "****") });
}
return filter.pass();
},
});

Требуется разрешение chat.filter. Хост отклоняет загрузку, если плагин определяет обработчик фильтра без объявления этого разрешения.

Приоритет фильтра (необязательный)​

Меньшие номера выполняются первыми. По умолчанию 100. Set it with filterPriority (JavaScript) on the plugin definition, or by calling plugin.set_filter_priority(priority) (Python).

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

Безопасность фильтров​

  • Ошибки рассматриваются как пропуск. Фильтр, который бросает исключение, никогда не блокирует чат.
  • Фильтры имеют временные ограничения на выполнение в 50 мс. Медленный фильтр отменяется и рассматривается как пропуск.
  • После 5 последовательных ошибок (ошибки или таймауты) плагин автоматически отключается на остальную часть сеанса. Успешный вызов фильтра сбрасывает счетчик.

Ограничения, установленные хостом, которые важны для плагинов чата​

Несколько лимитов хоста заслуживают внимания при проектировании:

  • время выполнения фильтра: 50 мс на сообщение
  • время выполнения обработчика событий (сообщение чата, пользователь присоединился и т. д.): 500 мс на вызов
  • жесткий лимит на вызов: 10 с
  • размер вывода фильтра: 1 MiB
  • ожидающие таймеры: 64 одновременно
  • диапазон задержек таймера: 100 мс до 24 ч

Это означает, что чат-боты и фильтры должны оставаться легкими, избегать медленных сетевых задержек в горячем пути и сохранять переписанные данные небольшими.

Разрешения, которые вам обычно понадобятся​

  • chat.send: отправлять сообщения в чате и личные ответы.
  • chat.history: читать последние сообщения в чате и подключенных клиентов.
  • chat.moderate: скрывать сообщения и отключать клиентов.
  • chat.filter: переписывать или удалять сообщения перед трансляцией.
  • users.read: проверять записи пользователей.
  • users.moderate: отключать пользователей чата или блокировать IP-адреса.

Смотрите Разрешения для полной модели безопасности.

Примеры чат-плагинов​

SDK плагина поставляется с небольшими примерами, ориентированными на чат, которые тесно соответствуют шаблонам на этой странице (каждый имеет как версию на JavaScript, так и версию на Python):

  • echo-bot: самый маленький возможный ответный бот, использующий обработчик чат-сообщений + owncast.chat.send.
  • chat-logger: регистрирует каждое чат-сообщение без ответа.
  • stream-tracker: объединяет чат-команды, обработчики жизненного цикла пользователей чата и объявления действий.
  • profanity-filter: переписывает сообщения, не удаляя их.
  • slow-mode: удаляет сообщения, используя msg.timestamp для ограничения скорости.
  • engagement-bot: модерация путем удаления сообщения.
  • timer-bot: боты-напоминания/обратного отсчета, управляемые из чата, с использованием таймеров и обработчика тиков.

Просмотрите их на examples/js · examples/python.

Где это вписывается в другие документы плагинов​

  • Выбор SDK и страницы JavaScript / Python охватывают настройку, CLI и синтаксис, специфичные для языка.
  • Чат-команды охватывает таблицы команд, автоматический !help и смешивание команд с вашими собственными обработчиками чата.
  • Обработчики событий — это полный справочник обработчиков для всех событий плагина.
  • API Owncast — это полный справочник API для всех методов owncast.*.
  • Справочник манифеста охватывает разрешения, поля идентичности бота и каждое свойство манифеста.
  • Участие в пользовательском интерфейсе охватывает пользовательский интерфейс со стороны зрителя, наложения, кнопки, скрипты и стили, если ваш чат-плагин также включает frontend компоненты.

Если вы начинаете с нуля, сначала прочитайте Быстрый старт, а затем вернитесь сюда.


Improve this page

See something missing or incorrect? Edit this page and improve the documentation for everyone.

Contributors to this documentation