Skip to content

Simple tool that subscribes to specific twitch channel events and stops stream from OBS when raid is executed.

Notifications You must be signed in to change notification settings

blackVanilla/raid-stopper

Repository files navigation

Raid Stopper

Приложение на Go для автоматической остановки стрима в OBS при отправке рейда на другой канал Twitch.

Описание

Когда вы отправляете рейд на другой канал через Twitch, это приложение автоматически останавливает стрим в OBS через WebSocket. Приложение использует Twitch PubSub WebSocket API для мониторинга событий рейдов в реальном времени.

Возможности

  • 🎯 Мониторинг событий рейдов через Twitch PubSub WebSocket
  • 🛑 Автоматическая остановка стрима в OBS при отправке рейда
  • 🔄 Автоматическое переподключение при потере соединения (экспоненциальный backoff: 1с → 2с → 4с → ... → 5 мин)
  • 💓 Поддержка соединения через PING/PONG (каждые 4 минуты)
  • 📝 Подробное логирование всех событий
  • 🧹 Чистый и оптимизированный код (481 строка)

Требования

  • Go 1.21 или выше
  • OBS Studio с включенным WebSocket сервером (v5)
  • Twitch OAuth токен для бота
  • Numeric User ID канала для мониторинга

Установка

Способ 1: Готовые бинарники (рекомендуется)

Скачайте последний релиз для вашей платформы из Releases:

  • Windows (x64): raid-stopper-windows-amd64.exe или raid-stopper-windows-amd64.zip
  • Linux (x64): raid-stopper-linux-amd64.zip
  • Linux (ARM64): raid-stopper-linux-arm64.zip
  • macOS (Intel): raid-stopper-macos-amd64.zip
  • macOS (Apple Silicon): raid-stopper-macos-arm64.zip

Примечание: ZIP-архивы содержат исполняемый файл и config.example.json для быстрого старта.

Способ 2: Сборка из исходников

  1. Клонируйте репозиторий:
git clone <repository-url>
cd raid-stopper
  1. Установите зависимости:
go mod download
  1. Соберите проект:
go build -o raid-stopper

Настройка

  1. Создайте конфигурационный файл:
cp config.example.json config.json
  1. Отредактируйте config.json с вашими данными:
{
  "twitch": {
    "channel_id": "123456789",
    "bot_username": "your_bot_username",
    "bot_oauth_token": "oauth:your_oauth_token"
  },
  "obs": {
    "host": "localhost",
    "port": 4455,
    "password": "your_obs_websocket_password"
  }
}

Параметры конфигурации

Twitch

  • channel_id (string) - Numeric User ID канала для мониторинга рейдов
  • bot_username (string) - Имя пользователя бота (отдельный аккаунт для авторизации)
  • bot_oauth_token (string) - OAuth токен бота для PubSub авторизации

Важно: Канал (channel_id) и бот (bot_username + bot_oauth_token) - это независимые сущности. Бот используется только для авторизации в PubSub API.

OBS

  • host (string) - Адрес OBS WebSocket сервера (обычно localhost)
  • port (int) - Порт OBS WebSocket сервера (по умолчанию 4455)
  • password (string) - Пароль для подключения к OBS WebSocket

Как получить Twitch User ID

Numeric User ID можно получить несколькими способами:

Способ 1: Онлайн сервисы

Способ 2: Twitch API

curl -H "Client-ID: YOUR_CLIENT_ID" \
     -H "Authorization: Bearer YOUR_TOKEN" \
     https://api.twitch.tv/helix/users?login=CHANNEL_NAME

Способ 3: Браузер (DevTools)

  1. Откройте страницу канала на Twitch
  2. Откройте DevTools (F12)
  3. Найдите в Network запросы к API - User ID будет в URL или ответах

Получение Twitch OAuth токена

Рекомендуемый способ:

  1. Перейдите на https://twitchtokengenerator.com/
  2. Выберите "Custom Scope Token"
  3. Выберите необходимые скоупы (для базового PubSub доступа можно оставить пустым)
  4. Нажмите "Generate Token"
  5. Авторизуйтесь через Twitch
  6. Скопируйте Access Token
  7. Добавьте префикс oauth: в конфиге: "oauth:your_token_here"

Альтернативные способы:

Настройка OBS WebSocket

  1. Откройте OBS Studio
  2. Перейдите в ИнструментыНастройки WebSocket-сервера
  3. Включите "Включить сервер WebSocket"
  4. Установите пароль (запомните его для конфига)
  5. Запомните порт (по умолчанию 4455)
  6. Нажмите "ОК"

Примечание: Требуется OBS Studio 28.0.0 или выше с встроенным WebSocket сервером v5

Запуск

Windows:

raid-stopper-windows-amd64.exe

Linux / macOS:

chmod +x raid-stopper-linux-amd64  # или macos-amd64 / macos-arm64 / linux-arm64
./raid-stopper-linux-amd64

Из исходников:

go run .

Как это работает

┌─────────────────────────────────────────────────────────────┐
│                     Raid Stopper Flow                        │
└─────────────────────────────────────────────────────────────┘

1. Запуск приложения
   ↓
2. Подключение к Twitch PubSub WebSocket
   └─→ wss://pubsub-edge.twitch.tv

3. Подписка на топик raid.{channel_id}
   └─→ Авторизация через bot_oauth_token

4. Подключение к OBS WebSocket
   └─→ ws://localhost:4455

5. Ожидание событий рейдов
   ↓
6. Получение события raid_go_v2 (рейд отправлен)
   ├─→ Логирование информации о рейде
   │   └─→ Канал назначения, имя, количество зрителей
   │
   └─→ Остановка стрима в OBS
       └─→ Проверка статуса → StopStream

7. Поддержка соединения
   ├─→ PING каждые 4 минуты
   └─→ Проверка PONG каждые 30 секунд

8. При потере соединения
   └─→ Автоматическое переподключение
       └─→ Exponential backoff: 1s → 2s → 4s → ... → 5min

Обработка событий

  • raid_go_v2 - рейд отправлен (выполнен) → стрим останавливается
  • ⏭️ raid_update_v2 - рейд создан (не выполнен) → игнорируется, только логируется

Логи

Приложение выводит подробные логи в консоль:

2025/12/29 20:00:00 Starting Raid Stopper...
2025/12/29 20:00:00 Configuration loaded successfully
2025/12/29 20:00:00 Connected to OBS WebSocket v5.3.0 (OBS Studio 30.0.0)
2025/12/29 20:00:00 Connected to Twitch PubSub WebSocket
2025/12/29 20:00:00 Subscribing to raid events for channel ID: 123456789
2025/12/29 20:00:00 Subscribing as bot 'your_bot' to channel ID: 123456789
2025/12/29 20:00:00 Subscribing to topic: raid.123456789
2025/12/29 20:00:01 Successfully subscribed to topic
2025/12/29 20:00:01 Raid Stopper is now running. Press Ctrl+C to exit.

... при отправке рейда ...

2025/12/29 20:15:30 RAID EXECUTED: Raiding target_channel (TargetName) with 150 viewers
2025/12/29 20:15:30 RAID detected! Raiding target_channel (TargetName) with 150 viewers. Stopping stream...
2025/12/29 20:15:30 Stream stopped successfully!
2025/12/29 20:15:30 Stream stopped successfully after raid to target_channel

Остановка приложения

Нажмите Ctrl+C для корректного завершения работы. Приложение закроет все соединения и завершится.

Структура проекта

raid-stopper/
├── main.go               # Точка входа приложения (60 строк)
├── config.go             # Конфигурация (38 строк)
├── twitch.go             # Twitch PubSub WebSocket клиент (283 строки)
├── obs.go                # OBS WebSocket клиент (73 строки)
├── config.example.json   # Пример конфигурации
├── config.json           # Рабочая конфигурация (не в git)
├── go.mod                # Go модули
├── go.sum                # Зависимости
├── .gitignore            # Git ignore
└── README.md             # Документация

Всего: 481 строка чистого, оптимизированного кода

Технические детали

Twitch PubSub API

Используемые топики:

  • raid.{channel_id} - события рейдов для указанного канала

Типы событий:

  • raid_go_v2 - рейд выполнен (обрабатывается → остановка стрима)
  • raid_update_v2 - рейд создан (игнорируется)

Авторизация:

  • Требуется OAuth токен (любой валидный токен, не обязательно от владельца канала)
  • Токен передаётся в поле auth_token при подписке на топик

Поддержание соединения:

  • PING каждые 4 минуты
  • Проверка PONG каждые 30 секунд
  • Timeout: 10 секунд после PING

OBS WebSocket v5

Используемые методы:

  • GetVersion - получение версии OBS
  • GetStreamStatus - проверка статуса стрима
  • StopStream - остановка стрима

Особенности:

  • Перед остановкой проверяется, активен ли стрим
  • Если стрим уже остановлен, команда игнорируется
  • Поддерживается только протокол WebSocket v5

Переподключение

При потере соединения используется exponential backoff:

1 сек → 2 сек → 4 сек → 8 сек → 16 сек → 32 сек →
64 сек → 128 сек → 256 сек → 300 сек (5 мин, максимум)

После успешного переподключения backoff сбрасывается на 1 секунду.

Troubleshooting

Ошибка: "Failed to connect to Twitch"

  • Проверьте интернет-соединение
  • Убедитесь, что wss://pubsub-edge.twitch.tv доступен

Ошибка: "PubSub error response"

  • Проверьте правильность channel_id (должен быть numeric)
  • Проверьте валидность bot_oauth_token
  • Убедитесь, что токен не истёк

Ошибка: "Failed to connect to OBS"

  • Убедитесь, что OBS Studio запущен
  • Проверьте, включен ли WebSocket сервер в OBS
  • Проверьте правильность хоста, порта и пароля в конфиге

Стрим не останавливается при рейде

  • Проверьте, что указан правильный channel_id
  • Убедитесь, что приложение получило событие (смотрите логи)
  • Проверьте логи на наличие ошибок от OBS

"No PONG received, connection appears dead"

  • Проблема с сетью или фаервол блокирует WebSocket
  • Приложение автоматически переподключится

FAQ

Q: Можно ли мониторить несколько каналов одновременно? A: Нет, текущая версия поддерживает только один канал. Для нескольких каналов запустите несколько экземпляров приложения с разными конфигами.

Q: Нужно ли, чтобы бот был модератором канала? A: Нет, бот используется только для авторизации в PubSub API. Права модератора не требуются.

Q: Можно ли использовать токен владельца канала вместо бота? A: Да, можно использовать любой валидный OAuth токен.

Q: Приложение останавливает стрим при создании рейда или при его отправке? A: Только при отправке рейда (raid_go_v2). Создание рейда (raid_update_v2) игнорируется.

Q: Как узнать свой Channel ID? A: См. раздел "Как получить Twitch User ID" выше.

Q: Приложение работает на Linux/Mac? A: Да, Go - кроссплатформенный язык. Просто соберите под нужную ОС: GOOS=linux go build или GOOS=darwin go build

Зависимости

  • github.com/gorilla/websocket - WebSocket клиент для Twitch PubSub
  • github.com/andreykaipov/goobs - OBS WebSocket клиент (v5)

Лицензия

MIT

CI/CD

Проект использует GitHub Actions для автоматической сборки и публикации релизов:

  • Build Workflow - автоматическая сборка на всех платформах при push и PR
  • Release Workflow - автоматическая публикация релизов при создании тега

Создание релиза:

git tag v1.0.0
git push origin v1.0.0

GitHub Actions автоматически соберёт бинарники для всех платформ и опубликует их в Releases.

Автор

Создано с помощью Claude Code


🎯 Raid Stopper - простой, надёжный и эффективный инструмент для автоматизации завершения стримов при рейдах.

About

Simple tool that subscribes to specific twitch channel events and stops stream from OBS when raid is executed.

Topics

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages