dashboard

Питает виджет последних событий и окно чата. Требует DASHBOARD_EVENTS и/или DASHBOARD_CHAT (см. каждый метод).

Регистрация платформы

Вызывайте при загрузке, чтобы UI мог разрешать id платформ:

await dashboard.registerPlatform({
  id: 'myplatform',
  name: { en: 'My Platform', ru: 'Моя платформа', uk: 'Моя платформа' },
});

Используйте тот же id в поле platform для addRecord / addChatMessage.

Пользователи

await dashboard.upsertUser({
  id: 'user-1',
  name: 'Viewer',
  avatar: 'https://example.com/avatar.png',
  platform: 'myplatform',
  color: '#7fff00',
  icons: ['badge-vip'], // id из registerChatBadges
});

Виджет событий — addRecord

Требуется: DASHBOARD_EVENTS

await dashboard.addRecord(
  {
    id: random.id(),
    type: 'donation', // donation | subscribe | follow | custom | timer
    platform: 'myplatform',
    amount: [10, 'USD'],
    message: { en: 'Thanks!', ru: 'Спасибо!' },
    from: 'user-1',
  },
  { id: 'user-1', name: 'Viewer', platform: 'myplatform' },
  { trigger: { type: 'donation', key: 'USD', value: 10 } }, // опциональный триггер оверлея
);

message принимает простую string, { en, ru?, uk? } или кортеж LangData приложения.

Несколько триггеров: { triggers: [...] }.

Чат — addChatMessage

Требуется: DASHBOARD_CHAT

await dashboard.addChatMessage(
  {
    content: 'Hello chat!',
    platform: 'myplatform',
    from: 'user-1',
    emotes: [{ word: 'Kappa', url: 'https://example.com/kappa.png' }],
    style: {
      color: '#7c4dff',
      header: { en: 'Highlighted', ru: 'Выделено' },
      icon: 'megaphone',
    },
  },
  { id: 'user-1', name: 'Viewer', platform: 'myplatform' },
);

content принимает простую string или { en, ru?, uk? } — не кортежи LangData приложения (аддоны используют свои объекты локализации).

Опциональный style добавляет цветную рамку и опциональную шапку:

Поле Описание
color Цвет рамки и фона шапки (CSS-цвет, например #ff9800)
header Текст шапки (string или { en, ru?, uk? }); без поля — только рамка
icon exclamation, question, megaphone или list

Системный чат — addSystemChatMessage

Требуется: DASHBOARD_CHAT

Системные строки не от пользователей платформы. В UI показывается иконка этого аддона. Опциональный sender выводится перед текстом.

await dashboard.addSystemChatMessage({
  content: { en: 'Connected to chat', ru: 'Подключено к чату' },
  sender: { en: 'My addon' },
  style: {
    color: '#4caf50',
    header: { en: 'Notice' },
    icon: 'exclamation',
  },
});

content, sender и style.header принимают только string или { en, ru?, uk? }.

Значки и эмоуты чата

await dashboard.registerChatBadges([
  { id: 'badge-vip', url: 'https://example.com/vip.png', title: 'VIP' },
]);

await dashboard.registerChatEmotes({
  platforms: ['myplatform'],
  emotes: [{ word: 'hello', url: 'https://example.com/hello.png' }],
});

API чтения (требуют DASHBOARD_CHAT или DASHBOARD_CHAT_INCOMING):

Отправка / входящий чат

Отправка (поле ввода): DASHBOARD_CHAT

await dashboard.onChatSend(async ({ text }) => {
  // отправка текста в API вашей платформы
});
dashboard.offChatSend();

Входящие строки: DASHBOARD_CHAT_INCOMING

dashboard.onChatMessage(msg => {
  console.log(msg.message.content, msg.user?.name, msg.sourceAddonId);
});
dashboard.offChatMessage();

Входящие события — onRecord

Требуется: DASHBOARD_EVENTS_INCOMING

Подписка на новые записи в виджете последних событий. Payload содержит сохранённый record (с системным attach для сработавших оверлеев, звуков, хоткеев и таймера), пользователя, triggers, использованные для матчинга, и sourceAddonId.

В отличие от чата, аддон-источник тоже получает свои записи — удобно проверять результат матчинга после dashboard.addRecord.

dashboard.onRecord(payload => {
  console.log(payload.record.type, payload.record.attach, payload.triggers);
});
dashboard.offRecord();

Триггеры оверлея — registerTriggers

Требуется: DASHBOARD_EVENTS

Регистрирует типы событий, которые пользователь может привязать к оверлеям в настройках. Передавайте соответствующий trigger в опциях addRecord.

await dashboard.registerTriggers([
  {
    type: 'follow',
    label: { en: 'New follower', ru: 'Новый фолловер' },
  },
  {
    type: 'custom',
    key: 'bits',
    label: { en: 'Cheer (bits)' },
    valueType: 'number',
    valueMatch: 'minimum',
    valueHint: { en: 'Minimum bits' },
  },
]);

Поля опции триггера

Поле Описание
type donation, subscribe, subgift, follow, custom
key Фиксированный дискриминатор (bits, redeems, …)
label Локализованное имя в настройках оверлея
valueType text, number, select, dynamic
valueOptions Для select
valueProvider Для dynamic — обработка событий overlayTriggerValue:{provider}:list|create|release
valueMatch exact (по умолчанию) или minimum
keyOptions / keyLabel Выбираемые пользователем ключи (например, валюта)

События dynamic provider

events.On('overlayTriggerValue:rewards:list', async () => ({
  success: true,
  items: [{ id: 'abc', label: 'My reward', meta: '100' }],
}));

events.On('overlayTriggerValue:rewards:create', async ({ title, context }) => ({
  success: true,
  valueId: 'abc',
  label: title,
  notify: {
    variant: 'success',
    title: { ru: 'Награда создана' },
    message: { ru: `Стоимость: ${context?.cost}` },
  },
}));

В ответах можно передать notify — модальное окно в настройках (variant: success | error | info; title?, message).

Привязки триггеров после сохранения настроек

Когда сохранённые правила для вашего аддона меняются, main process вызывает:

events.On('triggers:applied-changed', ({ previous, current }) => {
  // previous / current группируют правила по системам:
  // overlay, timer, game, gameInput, sounds, hotkeys
});

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

Полный контракт — в JSDoc registerTriggers в сгенерированных типах.