Advertisement
DEMOnik_I

server.js

Dec 16th, 2024
9
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.35 KB | None | 0 0
  1. const WebSocket = require('ws');
  2. const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args));
  3.  
  4. const TWITCH_CLIENT_ID = '123'; // Идентификатор
  5. const TWITCH_CLIENT_SECRET = '123'; // Секретный код
  6. const BROADCASTER_ID = '123'; // ID канала
  7.  
  8. let TWITCH_ACCESS_TOKEN = '123'; // Начальный пользовательский токен
  9. let TWITCH_ACCESS_TOKEN_EXPIRES_AT = Date.now() + (4973003 * 1000); // Время истечения токена
  10.  
  11. // Локальный WebSocket сервер для общения с HTML
  12. const wss = new WebSocket.Server({ port: 9090 });
  13. wss.on('close', function close(code, reason) { console.log(`Соединение закрыто. Код: ${code}, Причина: ${reason}`); });
  14.  
  15. // Отправка сообщения всем подключённым клиентам
  16. function broadcastMessage(message) {
  17. wss.clients.forEach(client => {
  18. if (client.readyState === WebSocket.OPEN) {
  19. client.send(JSON.stringify(message));
  20. }
  21. });
  22. }
  23.  
  24. // Обновление токена с использованием refresh_token
  25. async function refreshAccessToken() {
  26. try {
  27. const response = await fetch('https://id.twitch.tv/oauth2/token', {
  28. method: 'POST',
  29. body: new URLSearchParams({
  30. client_id: TWITCH_CLIENT_ID,
  31. client_secret: TWITCH_CLIENT_SECRET,
  32. grant_type: 'client_credentials',
  33. }),
  34. });
  35.  
  36. const data = await response.json();
  37. if (data.access_token) {
  38. console.log('Successfully refreshed access token');
  39. TWITCH_ACCESS_TOKEN = data.access_token;
  40. TWITCH_ACCESS_TOKEN_EXPIRES_AT = Date.now() + (data.expires_in * 1000);
  41. } else {
  42. console.error('Failed to refresh access token:', data);
  43. throw new Error('Could not refresh access token');
  44. }
  45. } catch (error) {
  46. console.error('Error refreshing access token:', error);
  47. throw error;
  48. }
  49. }
  50.  
  51. // Подключение к Twitch PubSub
  52. async function connectToPubSub() {
  53. try {
  54. // Проверяем срок действия токена и обновляем его, если он истёк
  55. if (Date.now() >= TWITCH_ACCESS_TOKEN_EXPIRES_AT) {
  56. console.log('Access token expired. Refreshing...');
  57. await refreshAccessToken();
  58. }
  59.  
  60. const twitchWs = new WebSocket('wss://pubsub-edge.twitch.tv');
  61.  
  62. twitchWs.on('open', () => {
  63. console.log('Connected to Twitch PubSub');
  64. twitchWs.send(JSON.stringify({
  65. type: 'LISTEN',
  66. data: {
  67. topics: [`channel-points-channel-v1.${BROADCASTER_ID}`],
  68. auth_token: TWITCH_ACCESS_TOKEN,
  69. },
  70. }));
  71. });
  72.  
  73. twitchWs.on('message', (message) => {
  74. const messageString = message.toString(); // Преобразуем буфер в строку
  75. console.log('Received PubSub message:', messageString);
  76.  
  77. try {
  78. const parsedMessage = JSON.parse(messageString);
  79.  
  80. if (parsedMessage.type === 'MESSAGE') {
  81. const event = JSON.parse(parsedMessage.data.message);
  82. console.log('Parsed event:', event);
  83.  
  84. // Проверяем, есть ли данные о награде
  85. const redemption = event.data?.redemption;
  86. const rewardCost = redemption?.reward?.cost;
  87.  
  88. if (rewardCost) {
  89. console.log(`Reward redeemed: ${rewardCost} points`);
  90.  
  91. // Если стоимость баллов равна 1489, запускаем видео
  92. if (rewardCost === 1489) {
  93. console.log('Triggering video playback');
  94. broadcastMessage({ action: 'playVideosTARO' });
  95. }
  96. } else {
  97. console.error('Reward or cost data is missing in the event:', event);
  98. }
  99. }
  100. } catch (error) {
  101. console.error('Error parsing PubSub message:', error);
  102. }
  103. });
  104.  
  105. twitchWs.on('error', (error) => {
  106. console.error('Twitch PubSub error:', error);
  107. });
  108.  
  109. twitchWs.on('close', () => {
  110. console.log('Twitch PubSub connection closed, reconnecting...');
  111. setTimeout(connectToPubSub, 10000); // Повторное подключение через 10 секунд
  112. });
  113. } catch (error) {
  114. console.error('Error connecting to PubSub:', error);
  115. setTimeout(connectToPubSub, 10000); // Попробовать снова через 10 секунд
  116. }
  117. }
  118.  
  119. // Событие подключения клиентов (HTML)
  120. wss.on('connection', (ws) => {
  121. console.log('HTML connected to WebSocket');
  122. ws.send(JSON.stringify({ action: 'connected' })); // Сообщаем клиенту, что соединение установлено
  123. });
  124.  
  125. // Запуск PubSub и WebSocket сервера
  126. (async () => {
  127. console.log('Starting server...');
  128. await connectToPubSub();
  129. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement