lua/pcm-norma-client.lua
2025-07-09 12:56:25 +00:00

110 lines
2.8 KiB
Lua

local connectionURL = "wss://0a71-2a03-ec00-b14a-55a-39f7-fdb9-1340-2e18.ngrok-free.app"
local function splitByChunk(text, chunkSize)
local s = {}
for i=1, #text, chunkSize do
s[#s+1] = text:sub(i,i+chunkSize - 1)
end
return s
end
function string.starts(String,Start)
return string.sub(String,1,string.len(Start))==Start
end
local dfpwm = require("cc.audio.dfpwm")
local ws, err = http.websocket(connectionURL)
local speakers = {peripheral.find("speaker")}
local monitor = peripheral.find("monitor")
if monitor then
monitor.clear()
monitor.setCursorPos(1, 1)
monitor.write("yourfriend's music")
monitor.setCursorPos(1, 3)
monitor.write("currently playing:")
monitor.setCursorPos(1, 4)
monitor.write("nothing")
end
function restart()
print("connection with ", connectionURL, " closed!")
print("restarting in 1s")
os.sleep(1)
ws, err = http.websocket(connectionURL)
if not ws then
printError(err)
restart()
end
end
if not ws then
restart()
printError(err)
end
parallel.waitForAll(
function()
while true do
local _, url = os.pullEvent("websocket_closed")
if url == connectionURL then
restart()
end
end
end,
function()
while true do
local _, url, resp, isBinary = os.pullEvent("websocket_message")
if url == connectionURL then
if not string.starts(resp, "{") then
local bytes = {("b"):rep(#resp):unpack(resp)}
bytes[#bytes]=nil
local functions = {}
for k,v in pairs(speakers) do
table.insert(functions, function ()
while not v.playAudio(bytes, 3) do
os.pullEvent("speaker_audio_empty")
end
end)
end
parallel.waitForAll(table.unpack(functions))
else
local json = textutils.unserialiseJSON(resp)
if json.type == "update" then
local file = io.open(shell.getRunningProgram(), "w")
if not file then return end
file:write(json.file)
end
if json.type == "playing" then
if monitor then
local width, height = monitor.getSize()
for k=4,height do
monitor.setCursorPos(1, k)
monitor.write(string.rep(" ", width))
end
for k, v in pairs(splitByChunk(json.data, width)) do
monitor.setCursorPos(1, k+3)
monitor.write(v)
end
else
print("Playing: ")
print(json.data)
end
end
if json.type == "reboot" then
os.reboot()
end
if json.type == "shutdown" then
os.shutdown()
end
end
end
end
end
)