let webSocket; let authKey; let lastCall; const reactRoot = document.getElementById("react-root"); if (reactRoot) { reactRoot.innerHTML = "

You shouldn't see this window, update your skin.

"; } Byond.subscribeTo("estop", function () { if (webSocket) { webSocket.close(); } else { Byond.sendMessage("disconnected"); } }); Byond.subscribeTo("connect", function (data) { if (webSocket) { webSocket.close(); } webSocket = new WebSocket(`ws://localhost:${data.port}`); webSocket.sendJson = (data) => { webSocket.send(JSON.stringify(data)); }; authKey = JSON.parse(window.hubStorage.getItem("virgo-shocker-authkey")); webSocket.onopen = (ev) => { Byond.sendMessage("connected"); }; webSocket.onerror = (ev) => { Byond.sendMessage("error", ev); }; webSocket.onclose = (ev) => { Byond.sendMessage("disconnected"); }; webSocket.onmessage = (ev) => { Byond.sendMessage("incomingMessage", { data: ev.data, lastCall }); }; }); Byond.subscribeTo("enumerateShockers", function () { if (!webSocket) { return; } lastCall = "get_devices"; webSocket.sendJson({ cmd: "get_devices", auth_key: authKey, }); }); // data: { // "intensity": 10, // 1 - 100 - int // "duration": 1, // 0.1 - 15 - float // "shocker_ids": [], // [] - List of shocker ids // "warning": false, // true, false - will send a vibrate with the same intensity and duration // }, Byond.subscribeTo("shock", function (data) { if (!webSocket) { return; } lastCall = "operate"; webSocket.sendJson({ cmd: "operate", value: { intensity: data.intensity, // 1 - 100 - int duration: data.duration, // 0.1 - 15 - float shocker_option: "all", // all, random action: "shock", // shock, vibrate, beep, end shocker_ids: data.shocker_ids, // [] - List of shocker ids device_ids: [], // [] - list of pishock client ids, if one of these is provided it will activate all shockers associated with it warning: data.warning, // true, false - will send a vibrate with the same intensity and duration held: false, // true, false - for continuous commands }, auth_key: authKey, }); });