129 lines
4.0 KiB
JavaScript
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 }) {}
|
|
}); |