110 lines
2.8 KiB
Lua
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
|
|
)
|