const { Plugins, Actions, log, EventEmitter } = require('./utils/plugin'); const { execSync } = require('child_process'); const WebSocket = require('ws'); const fs = require('fs'); const path = require('path'); const plugin = new Plugins('demo'); // 로그 파일 경로 설정 const logFilePath = path.join(__dirname, 'streamdeck_plugin.log'); // 로그 함수 - 기존 log 시스템과 함께 사용 function writeLog(message) { const timestamp = new Date().toISOString(); const logMessage = `[${timestamp}] ${message}`; // 기존 log 시스템 사용 log.info(logMessage); // 파일에도 기록 try { fs.appendFileSync(logFilePath, logMessage + '\n'); } catch (err) { log.error('로그 파일 쓰기 실패:', err.message); } } const counters = {}; let unityWebSocket = null; let reconnectTimer = null; // 유니티 WebSocket 서버 연결 함수 function connectToUnity() { if (unityWebSocket) { unityWebSocket.close(); } unityWebSocket = new WebSocket('ws://localhost:10701/'); unityWebSocket.on('open', function() { writeLog('유니티 WebSocket 서버에 연결됨'); }); unityWebSocket.on('message', function(data) { writeLog('유니티로부터 메시지 수신: ' + data.toString()); }); unityWebSocket.on('error', function(err) { writeLog('유니티 WebSocket 연결 오류: ' + err.message); scheduleReconnect(); }); unityWebSocket.on('close', function() { writeLog('유니티 WebSocket 연결 종료'); scheduleReconnect(); }); } // 재연결 스케줄링 function scheduleReconnect() { if (reconnectTimer) { clearTimeout(reconnectTimer); } reconnectTimer = setTimeout(() => { writeLog('유니티 WebSocket 서버 재연결 시도...'); connectToUnity(); }, 3000); } // 유니티로 메시지 전송 function sendToUnity(message) { if (unityWebSocket && unityWebSocket.readyState === WebSocket.OPEN) { unityWebSocket.send(message); writeLog('유니티 WebSocket 서버로 메시지 전송: ' + message); return true; } else { writeLog('유니티 WebSocket 서버 연결이 없거나 열려있지 않음'); return false; } } plugin.didReceiveGlobalSettings = ({ payload: { settings } }) => { log.info('didReceiveGlobalSettings', settings); writeLog('플러그인 설정 수신됨'); // 플러그인 시작 시 유니티 WebSocket 서버 연결 connectToUnity(); }; const createSvg = (text) => ` ${text} `; const timers = {}; plugin.demo = new Actions({ default: { }, async _willAppear({ context, payload }) { // 버튼이 처음 나타날 때 카운터 초기화 및 이미지 표시 counters[context] = 0; const svg = createSvg(counters[context]); plugin.setImage(context, `data:image/svg+xml;charset=utf8,${svg}`); writeLog(`버튼 나타남, context: ${context}`); }, _willDisappear({ context }) { delete counters[context]; writeLog(`버튼 사라짐, context: ${context}`); }, _propertyInspectorDidAppear({ context }) { }, sendToPlugin({ payload, context }) { }, keyUp({ context, payload }) { // 카운터 증가 if (counters[context] === undefined) counters[context] = 0; counters[context]++; const svg = createSvg(counters[context]); plugin.setImage(context, `data:image/svg+xml;charset=utf8,${svg}`); writeLog(`버튼 클릭됨, context: ${context}, count: ${counters[context]}`); // 유니티 WebSocket 서버로 메시지 전송 sendToUnity('Hello Unity from StreamDeck!'); }, dialDown({ context, payload }) {}, dialRotate({ context, payload }) {} });