Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const WebSocket = require('ws');
- const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args));
- const TWITCH_CLIENT_ID = '123'; // Идентификатор
- const TWITCH_CLIENT_SECRET = '123'; // Секретный код
- const BROADCASTER_ID = '123'; // ID канала
- let TWITCH_ACCESS_TOKEN = '123'; // Начальный пользовательский токен
- let TWITCH_ACCESS_TOKEN_EXPIRES_AT = Date.now() + (4973003 * 1000); // Время истечения токена
- // Локальный WebSocket сервер для общения с HTML
- const wss = new WebSocket.Server({ port: 9090 });
- wss.on('close', function close(code, reason) { console.log(`Соединение закрыто. Код: ${code}, Причина: ${reason}`); });
- // Отправка сообщения всем подключённым клиентам
- function broadcastMessage(message) {
- wss.clients.forEach(client => {
- if (client.readyState === WebSocket.OPEN) {
- client.send(JSON.stringify(message));
- }
- });
- }
- // Обновление токена с использованием refresh_token
- async function refreshAccessToken() {
- try {
- const response = await fetch('https://id.twitch.tv/oauth2/token', {
- method: 'POST',
- body: new URLSearchParams({
- client_id: TWITCH_CLIENT_ID,
- client_secret: TWITCH_CLIENT_SECRET,
- grant_type: 'client_credentials',
- }),
- });
- const data = await response.json();
- if (data.access_token) {
- console.log('Successfully refreshed access token');
- TWITCH_ACCESS_TOKEN = data.access_token;
- TWITCH_ACCESS_TOKEN_EXPIRES_AT = Date.now() + (data.expires_in * 1000);
- } else {
- console.error('Failed to refresh access token:', data);
- throw new Error('Could not refresh access token');
- }
- } catch (error) {
- console.error('Error refreshing access token:', error);
- throw error;
- }
- }
- // Подключение к Twitch PubSub
- async function connectToPubSub() {
- try {
- // Проверяем срок действия токена и обновляем его, если он истёк
- if (Date.now() >= TWITCH_ACCESS_TOKEN_EXPIRES_AT) {
- console.log('Access token expired. Refreshing...');
- await refreshAccessToken();
- }
- const twitchWs = new WebSocket('wss://pubsub-edge.twitch.tv');
- twitchWs.on('open', () => {
- console.log('Connected to Twitch PubSub');
- twitchWs.send(JSON.stringify({
- type: 'LISTEN',
- data: {
- topics: [`channel-points-channel-v1.${BROADCASTER_ID}`],
- auth_token: TWITCH_ACCESS_TOKEN,
- },
- }));
- });
- twitchWs.on('message', (message) => {
- const messageString = message.toString(); // Преобразуем буфер в строку
- console.log('Received PubSub message:', messageString);
- try {
- const parsedMessage = JSON.parse(messageString);
- if (parsedMessage.type === 'MESSAGE') {
- const event = JSON.parse(parsedMessage.data.message);
- console.log('Parsed event:', event);
- // Проверяем, есть ли данные о награде
- const redemption = event.data?.redemption;
- const rewardCost = redemption?.reward?.cost;
- if (rewardCost) {
- console.log(`Reward redeemed: ${rewardCost} points`);
- // Если стоимость баллов равна 1489, запускаем видео
- if (rewardCost === 1489) {
- console.log('Triggering video playback');
- broadcastMessage({ action: 'playVideosTARO' });
- }
- } else {
- console.error('Reward or cost data is missing in the event:', event);
- }
- }
- } catch (error) {
- console.error('Error parsing PubSub message:', error);
- }
- });
- twitchWs.on('error', (error) => {
- console.error('Twitch PubSub error:', error);
- });
- twitchWs.on('close', () => {
- console.log('Twitch PubSub connection closed, reconnecting...');
- setTimeout(connectToPubSub, 10000); // Повторное подключение через 10 секунд
- });
- } catch (error) {
- console.error('Error connecting to PubSub:', error);
- setTimeout(connectToPubSub, 10000); // Попробовать снова через 10 секунд
- }
- }
- // Событие подключения клиентов (HTML)
- wss.on('connection', (ws) => {
- console.log('HTML connected to WebSocket');
- ws.send(JSON.stringify({ action: 'connected' })); // Сообщаем клиенту, что соединение установлено
- });
- // Запуск PubSub и WebSocket сервера
- (async () => {
- console.log('Starting server...');
- await connectToPubSub();
- })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement