let websocket = null; let uuid = null; let ctxSettings = new Map(); const ACTION_MAP = { "ru.wildtail.httpkeys.globalmute": { actionId: "globalmute" }, "ru.wildtail.httpkeys.tsmute": { actionId: "tsmute" }, }; let cts = []; // подключение от D6 function connectElgatoStreamDeckSocket(inPort, inUUID, inRegisterEvent, inInfo) { uuid = inUUID; websocket = new WebSocket("ws://127.0.0.1:" + inPort); websocket.onopen = function () { websocket.send(JSON.stringify({ event: inRegisterEvent, uuid: uuid })); }; websocket.onmessage = async function (evt) { const msg = JSON.parse(evt.data); const { event, action, context, payload } = msg; if (event === "willAppear") { cts.push(context) const s = (payload && payload.settings) || { isOn: false }; ctxSettings.set(context, s); // setState(context, s.isOn ? 1 : 0); const cfg = ACTION_MAP[action]; if (!cfg) return; var resp = await postJson("http://127.0.0.1:16888/press", { actionUUID: action, actionId: cfg.actionId, toggleChanged: false, isOn: !s.isOn, }); setState(element, resp?.mode); return; } if (event === "didReceiveSettings") { const s = payload.settings || { isOn: false }; ctxSettings.set(context, s); // setState(context, s.isOn ? 1 : 0); return; } if (event === "keyDown") { handleKeyDown(action, context); return; } }; } // обработка нажатия async function handleKeyDown(action, context) { let s = ctxSettings.get(context) || { isOn: false }; const prevState = s.isOn; s.isOn = !s.isOn; const newState = s.isOn; ctxSettings.set(context, s); websocket.send(JSON.stringify({ event: "setSettings", context: context, payload: s })); // setState(context, newState ? 1 : 0); const cfg = ACTION_MAP[action]; if (!cfg) return; var resp = await postJson("http://127.0.0.1:16888/press", { actionUUID: action, actionId: cfg.actionId, toggleChanged: prevState !== newState, isOn: !newState, cts }); cts.forEach(element => { console.log(element) setState(element, resp?.mode); }); } // смена state function setState(context, stateIndex) { websocket.send(JSON.stringify({ event: "setState", context: context, payload: { state: stateIndex } })); } // HTTP POST async function postJson(url, data) { const res = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(data) }); if (!res.ok) throw new Error("HTTP " + res.status); return await res.json(); }