129 lines
4.0 KiB
JavaScript

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) => `<svg width="144" height="144" xmlns="http://www.w3.org/2000/svg">
<text x="72" y="120" font-family="Arial" font-weight="bold" font-size="36" fill="white" text-anchor="middle"
stroke="black" stroke-width="2" paint-order="stroke">
${text}
</text>
</svg>`;
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 }) {}
});