diff --git a/apps/Ale32bit/beam.spk b/apps/Ale32bit/beam.spk new file mode 100644 index 0000000..cd34520 --- /dev/null +++ b/apps/Ale32bit/beam.spk @@ -0,0 +1,795 @@ +-- +-- sPhone Application Package +-- Built with SPK builder 1 +-- +{ + files = "{\ + [ \"beam.lua\" ] = \"--[[\\\ + \\\ + Beam by Ale32bit\\\ + base64 by MultMine\\\ + \\\ + Beam Engine Build 3\\\ + \\\ +]]--\\\ +\\\ +local base64 = \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\\\"\\\ +.. \\\"abcdefghijklmnopqrstuvwxyz0123456789+/\\\"\\\ +\\\ +local function toBits(n)\\\ + local t = {}\\\ + for i = 8, 1, -1 do\\\ + table.insert(t, bit.brshift(bit.band(n, 2^(i-1)), i - 1))\\\ + end\\\ + return t\\\ +end\\\ +\\\ +local function encodeBlock(blk)\\\ + local b64 = \\\"\\\"\\\ + local b64_bits = {}\\\ + for i = 1, 3 do\\\ + local c = string.byte(blk:sub(i, i)) or 0\\\ + for j = 8, 1, -1 do\\\ + table.insert(b64_bits, bit.brshift(bit.band(c, 2^(j-1)), j - 1))\\\ + end\\\ + end\\\ + local byteCount = #blk + 1\\\ + for i = 1, byteCount do\\\ + local n = 0\\\ + for j = 1, 6 do\\\ + n = n + (2 ^ (6 - j)) * b64_bits[(i - 1) * 6 + j]\\\ + end\\\ + b64 = b64 .. base64:sub(n + 1, n + 1)\\\ + end\\\ + return b64 .. string.rep(\\\"=\\\", 4 - byteCount)\\\ +end\\\ +\\\ +local function decodeBlock(b64)\\\ + local msg = \\\"\\\"\\\ + local msg_bits = {}\\\ + for i = 1, 4 do\\\ + local c = b64:sub(i, i):byte()\\\ + if c >= 0x30 and c <= 0x39 then\\\ + local t = toBits(c + 4)\\\ + for j = 3, 8 do\\\ + table.insert(msg_bits, t[j])\\\ + end\\\ + elseif c == string.byte(\\\"+\\\") then\\\ + for j = 1, 5 do\\\ + table.insert(msg_bits, 1)\\\ + end\\\ + table.insert(msg_bits, 0)\\\ + elseif c == string.byte(\\\"/\\\") then\\\ + for j = 1, 6 do\\\ + table.insert(msg_bits, 1)\\\ + end\\\ + elseif c >= 65 and c <= string.byte(\\\"Z\\\") then\\\ + local t = toBits(c - 65)\\\ + for j = 3, 8 do\\\ + table.insert(msg_bits, t[j])\\\ + end\\\ + elseif c >= 97 and c <= string.byte(\\\"z\\\") then\\\ + local t = toBits(c - 71)\\\ + for j = 3, 8 do\\\ + table.insert(msg_bits, t[j])\\\ + end\\\ + end\\\ + end\\\ + for i = 1, #msg_bits / 8 do\\\ + local n = 0\\\ + for j = 1, 8 do\\\ + n = n + (2 ^ (8 - j)) * msg_bits[(i - 1) * 8 + j]\\\ + end\\\ + msg = msg .. string.char(n)\\\ + end\\\ + return msg\\\ +end\\\ +\\\ +local function encode(msg)\\\ + local b64 = \\\"\\\"\\\ + for i = 1, math.ceil(#msg / 3) do\\\ + b64 = b64 .. encodeBlock(msg:sub((i - 1) * 3 + 1, i * 3))\\\ + end\\\ + return b64\\\ +end\\\ +\\\ +local function decode(b64)\\\ + local msg = \\\"\\\"\\\ + for i = 1, #b64 / 4 do\\\ + msg = msg .. decodeBlock(b64:sub((i - 1) * 4 + 1, i * 4))\\\ + end\\\ + return msg\\\ +end\\\ +\\\ +local version = 2.2\\\ +local beamEngineBuild = 3\\\ +local channel = 1\\\ +local maxDistance = 30000000\\\ +local status = true\\\ +local config = \\\".beam-config\\\"\\\ +local usedIDs = {}\\\ +\\\ +\\\ +w,h = term.getSize()\\\ +\\\ +local function center(text)\\\ + local _,y = term.getCursorPos()\\\ + if pocket then\\\ + term.setCursorPos(math.ceil(w/2)-math.ceil(#text/2)+1,y)\\\ + else\\\ + term.setCursorPos(math.ceil(w/2)-math.ceil(#text/2),y)\\\ + end\\\ + term.write(text)\\\ +end\\\ +\\\ +local function redraw()\\\ + term.setBackgroundColor(colors.white)\\\ + term.clear()\\\ + paintutils.drawLine(1,1,w,1,colors.blue)\\\ + term.setCursorPos(1,1)\\\ + term.setTextColor(colors.white)\\\ + term.setBackgroundColor(colors.blue)\\\ + term.write(\\\"Beam ID: \\\"..os.getComputerID())\\\ + term.setCursorPos(w,1)\\\ + term.setBackgroundColor(colors.red)\\\ + term.write(\\\"X\\\")\\\ +\\\ + paintutils.drawFilledBox(2,4,w-1,6,colors.blue)\\\ + term.setCursorPos(1,5)\\\ + term.setBackgroundColor(colors.blue)\\\ + term.setTextColor(colors.white)\\\ + center(\\\"Send File\\\")\\\ +\\\ + paintutils.drawFilledBox(2,8,w-1,10,colors.gray)\\\ + term.setCursorPos(1,9)\\\ + term.setBackgroundColor(colors.gray)\\\ + term.setTextColor(colors.white)\\\ + center(\\\"Settings\\\")\\\ +\\\ +\\\ + term.setCursorPos(1,2)\\\ + term.setTextColor(colors.black)\\\ + term.setBackgroundColor(colors.white)\\\ + term.setCursorPos(1,h-3)\\\ + if status then\\\ + term.write(\\\"Status: Listening\\\")\\\ + else\\\ + term.write(\\\"Status: Standby\\\")\\\ + end\\\ + term.setCursorPos(1,h-2)\\\ + term.write(\\\"Channel: \\\"..channel)\\\ + term.setCursorPos(1,h-1)\\\ + term.write(\\\"Max Distance: \\\"..maxDistance)\\\ + term.setCursorPos(1,h)\\\ + term.write(\\\"Version: \\\"..version)\\\ + term.setCursorBlink(false)\\\ +end\\\ +local modem = peripheral.find(\\\"modem\\\")\\\ +\\\ +if not modem then\\\ + term.setBackgroundColor(colors.black)\\\ + term.setTextColor(colors.white)\\\ + term.clear()\\\ + term.setCursorPos(1,1)\\\ + printError(\\\"Modem not found\\\")\\\ + return\\\ +end\\\ +\\\ +modem.open(channel)\\\ +\\\ +while true do\\\ + redraw()\\\ + local ev = {os.pullEvent()}\\\ + if ev[1] == \\\"mouse_click\\\" then\\\ + local x,y = ev[3],ev[4]\\\ + if x == w and y == 1 then\\\ + modem.close(channel)\\\ + term.setBackgroundColor(colors.black)\\\ + term.setTextColor(colors.white)\\\ + term.clear()\\\ + term.setCursorPos(1,1)\\\ + print(\\\"Thanks for using Beam by Ale32bit\\\")\\\ + break\\\ + elseif (x >= 2 and y >= 4) and (x <= w-1 and y <= 6) then\\\ + local function redrawSend()\\\ + paintutils.drawFilledBox(1,2,w,h,colors.white)\\\ + term.setTextColor(colors.black)\\\ + term.setCursorPos(1,3)\\\ + center(\\\"Send file\\\")\\\ + term.setCursorPos(2,5)\\\ + write(\\\"Receiver ID: \\\")\\\ + term.setCursorPos(2,7)\\\ + write(\\\"File: \\\")\\\ + term.setCursorPos(15,5)\\\ + term.setCursorBlink(true)\\\ + end\\\ + while true do\\\ + redrawSend()\\\ + local e,_,x,y = os.pullEvent()\\\ + if e == \\\"mouse_click\\\" and x == w and y == 1 then\\\ + break\\\ + elseif e == \\\"key\\\" then\\\ + term.setCursorPos(15,5)\\\ + local receiver = read()\\\ + if tonumber(receiver) then\\\ + term.setCursorPos(8,7)\\\ + local file = read()\\\ + if file ~= \\\"\\\" and fs.exists(file) then\\\ + local f = fs.open(file,\\\"r\\\")\\\ + local con = f.readAll()\\\ + f.close()\\\ + -- Beam Engine\\\ + local randomID = math.random(0,65535)\\\ + usedIDs[randomID] = true\\\ + modem.transmit(channel,os.getComputerID(),{\\\ + content = encode(con),\\\ + version = beamEngineBuild,\\\ + receiver = encode(receiver),\\\ + id = randomID,\\\ + })\\\ + \\\ + term.setCursorPos(1,9)\\\ + center(\\\"File sent to \\\"..receiver)\\\ + break\\\ + else\\\ + term.setCursorPos(2,9)\\\ + term.setTextColor(colors.red)\\\ + term.write(\\\"The file does not exist\\\")\\\ + sleep(2)\\\ + end\\\ + else\\\ + term.setCursorPos(2,9)\\\ + term.setTextColor(colors.red)\\\ + term.write(\\\"Receiver must be number\\\")\\\ + sleep(2)\\\ + end\\\ + end\\\ + end\\\ + elseif (x >= 2 and y >= 8) and (x <= w-1 and y <= 10) then\\\ + local function redrawSett()\\\ + paintutils.drawFilledBox(1,2,w,h,colors.white)\\\ + term.setTextColor(colors.black)\\\ + term.setCursorPos(1,3)\\\ + center(\\\"Settings\\\")\\\ + term.setCursorPos(1,5)\\\ + if status then\\\ + center(\\\"Disable receiver\\\")\\\ + else\\\ + center(\\\"Enable receiver\\\")\\\ + end\\\ + term.setCursorPos(1,6)\\\ + center(\\\"Set channel\\\")\\\ + term.setCursorPos(1,7)\\\ + center(\\\"Set max distance\\\")\\\ + end\\\ + while true do\\\ + redrawSett()\\\ + local _,_,x,y = os.pullEvent(\\\"mouse_click\\\")\\\ + if x == w and y == 1 then\\\ + break\\\ + elseif y == 5 then\\\ + if status then\\\ + modem.close(channel)\\\ + status = false\\\ + else\\\ + modem.open(channel)\\\ + status = true\\\ + end\\\ + elseif y == 6 then\\\ + while true do\\\ + paintutils.drawFilledBox(1,2,w,h,colors.white)\\\ + term.setTextColor(colors.black)\\\ + term.setCursorPos(1,3)\\\ + center(\\\"Set channel\\\")\\\ + term.setCursorPos(2,4)\\\ + write(\\\"(0-65535) \\\")\\\ + local cch = read()\\\ + if tonumber(cch) or (cch >= 0 and cch <= 65535) then\\\ + modem.close(channel)\\\ + channel = tonumber(cch)\\\ + modem.open(channel)\\\ + break\\\ + else\\\ + term.setCursorPos(1,6)\\\ + term.setTextColor(colors.red)\\\ + center(\\\"Channel must be number\\\")\\\ + term.setCursorPos(1,7)\\\ + center(\\\"and in 0-65535\\\")\\\ + sleep(2)\\\ + end\\\ + end\\\ + elseif y == 7 then\\\ + while true do\\\ + paintutils.drawFilledBox(1,2,w,h,colors.white)\\\ + term.setTextColor(colors.black)\\\ + term.setCursorPos(1,3)\\\ + center(\\\"Set max distance\\\")\\\ + term.setCursorPos(2,4)\\\ + local diss = read()\\\ + if tonumber(diss) then\\\ + maxDistance = tonumber(diss)\\\ + break\\\ + else\\\ + term.setCursorPos(1,6)\\\ + term.setTextColor(colors.red)\\\ + center(\\\"Channel must be number\\\")\\\ + sleep(2)\\\ + end\\\ + end\\\ + end\\\ + end\\\ + end\\\ + elseif ev[1] == \\\"modem_message\\\" then\\\ + ch = ev[3]\\\ + rch = ev[4]\\\ + content = ev[5]\\\ + distance = ev[6]\\\ + if ch == channel and distance <= maxDistance and (content.content and content.version and content.receiver) then\\\ + if content.version == beamEngineBuild and tonumber(decode(content.receiver)) == os.getComputerID() and not usedIDs[randomID] then\\\ + paintutils.drawFilledBox(1,2,w,h,colors.white)\\\ + term.setTextColor(colors.black)\\\ + term.setCursorPos(1,3)\\\ + center(\\\"File received from \\\"..rch)\\\ + term.setCursorPos(1,4)\\\ + center(\\\"Download file?\\\")\\\ + paintutils.drawFilledBox(2,6,8,8,colors.lime)\\\ + term.setCursorPos(4,7)\\\ + term.setTextColor(colors.white)\\\ + term.write(\\\"Yes\\\")\\\ + paintutils.drawFilledBox(w-8,6,w-2,8,colors.red)\\\ + term.setCursorPos(w-6,7)\\\ + term.setTextColor(colors.white)\\\ + term.write(\\\"No\\\")\\\ + while true do\\\ + local _,_,x,y = os.pullEvent(\\\"mouse_click\\\")\\\ + \\\ + if y == 1 and x == w then\\\ + break\\\ + elseif (x >= 2 and y >= 6) and (x <= 8 and y <= 8) then\\\ + paintutils.drawFilledBox(1,2,w,h,colors.white)\\\ + term.setCursorPos(1,3)\\\ + term.setTextColor(colors.black)\\\ + center(\\\"Save file as\\\")\\\ + term.setCursorPos(2,4)\\\ + term.setCursorBlink(true)\\\ + while true do\\\ + local e, p, x, y = os.pullEvent()\\\ + if e == \\\"mouse_click\\\" and x == w and y == 1 then\\\ + break\\\ + elseif e == \\\"key\\\" then\\\ + local name = read()\\\ + local f = fs.open(name, \\\"w\\\")\\\ + f.write(decode(content.content))\\\ + f.close()\\\ + term.setCursorPos(1,6)\\\ + center(\\\"File saved!\\\")\\\ + term.setCursorPos(1,8)\\\ + center(\\\"Press any key\\\")\\\ + os.pullEvent(\\\"key\\\")\\\ + break\\\ + end\\\ + end\\\ + break\\\ + elseif (x >= w-8 and y >= 6) and (x <= w-2 and y <= 8) then\\\ + break\\\ + end\\\ + end\\\ + else\\\ + if content.version ~= beamEngineBuild then\\\ + paintutils.drawFilledBox(1,2,w,h,colors.white)\\\ + term.setTextColor(colors.black)\\\ + term.setCursorPos(1,3)\\\ + center(\\\"Can't get file from \\\"..rch)\\\ + term.setCursorPos(1,4)\\\ + if content.version < beamEngineBuild then\\\ + center(\\\"Sender Beam is obsolete\\\")\\\ + elseif content.version > beamEngineBuild then\\\ + center(\\\"Your Beam is obsolete\\\")\\\ + end\\\ + term.setCursorPos(1,6)\\\ + center(\\\"Press any key\\\")\\\ + os.pullEvent(\\\"key\\\")\\\ + end\\\ + end\\\ + end\\\ + end\\\ +end\\\ +--[[\\\ + \\\ + Beam by Ale32bit\\\ + \\\ +]]--\\\ +\\\ +-- base64 API by MultMine\\\ +local base64 = \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\\\"\\\ +.. \\\"abcdefghijklmnopqrstuvwxyz0123456789+/\\\"\\\ +\\\ +local function toBits(n)\\\ + local t = {}\\\ + for i = 8, 1, -1 do\\\ + table.insert(t, bit.brshift(bit.band(n, 2^(i-1)), i - 1))\\\ + end\\\ + return t\\\ +end\\\ +\\\ +local function encodeBlock(blk)\\\ + local b64 = \\\"\\\"\\\ + local b64_bits = {}\\\ + for i = 1, 3 do\\\ + local c = string.byte(blk:sub(i, i)) or 0\\\ + for j = 8, 1, -1 do\\\ + table.insert(b64_bits, bit.brshift(bit.band(c, 2^(j-1)), j - 1))\\\ + end\\\ + end\\\ + local byteCount = #blk + 1\\\ + for i = 1, byteCount do\\\ + local n = 0\\\ + for j = 1, 6 do\\\ + n = n + (2 ^ (6 - j)) * b64_bits[(i - 1) * 6 + j]\\\ + end\\\ + b64 = b64 .. base64:sub(n + 1, n + 1)\\\ + end\\\ + return b64 .. string.rep(\\\"=\\\", 4 - byteCount)\\\ +end\\\ +\\\ +local function decodeBlock(b64)\\\ + local msg = \\\"\\\"\\\ + local msg_bits = {}\\\ + for i = 1, 4 do\\\ + local c = b64:sub(i, i):byte()\\\ + if c >= 0x30 and c <= 0x39 then\\\ + local t = toBits(c + 4)\\\ + for j = 3, 8 do\\\ + table.insert(msg_bits, t[j])\\\ + end\\\ + elseif c == string.byte(\\\"+\\\") then\\\ + for j = 1, 5 do\\\ + table.insert(msg_bits, 1)\\\ + end\\\ + table.insert(msg_bits, 0)\\\ + elseif c == string.byte(\\\"/\\\") then\\\ + for j = 1, 6 do\\\ + table.insert(msg_bits, 1)\\\ + end\\\ + elseif c >= 65 and c <= string.byte(\\\"Z\\\") then\\\ + local t = toBits(c - 65)\\\ + for j = 3, 8 do\\\ + table.insert(msg_bits, t[j])\\\ + end\\\ + elseif c >= 97 and c <= string.byte(\\\"z\\\") then\\\ + local t = toBits(c - 71)\\\ + for j = 3, 8 do\\\ + table.insert(msg_bits, t[j])\\\ + end\\\ + end\\\ + end\\\ + for i = 1, #msg_bits / 8 do\\\ + local n = 0\\\ + for j = 1, 8 do\\\ + n = n + (2 ^ (8 - j)) * msg_bits[(i - 1) * 8 + j]\\\ + end\\\ + msg = msg .. string.char(n)\\\ + end\\\ + return msg\\\ +end\\\ +\\\ +local function encode(msg)\\\ + local b64 = \\\"\\\"\\\ + for i = 1, math.ceil(#msg / 3) do\\\ + b64 = b64 .. encodeBlock(msg:sub((i - 1) * 3 + 1, i * 3))\\\ + end\\\ + return b64\\\ +end\\\ +\\\ +local function decode(b64)\\\ + local msg = \\\"\\\"\\\ + for i = 1, #b64 / 4 do\\\ + msg = msg .. decodeBlock(b64:sub((i - 1) * 4 + 1, i * 4))\\\ + end\\\ + return msg\\\ +end\\\ +\\\ +local version = 2.2\\\ +local beamEngineBuild = 3\\\ +local channel = 1\\\ +local maxDistance = 30000000\\\ +local status = true\\\ +local config = \\\".beam-config\\\"\\\ +local usedIDs = {}\\\ +\\\ +\\\ +w,h = term.getSize()\\\ +\\\ +local function center(text)\\\ + local _,y = term.getCursorPos()\\\ + if pocket then\\\ + term.setCursorPos(math.ceil(w/2)-math.ceil(#text/2)+1,y)\\\ + else\\\ + term.setCursorPos(math.ceil(w/2)-math.ceil(#text/2),y)\\\ + end\\\ + term.write(text)\\\ +end\\\ +\\\ +local function redraw()\\\ + term.setBackgroundColor(colors.white)\\\ + term.clear()\\\ + paintutils.drawLine(1,1,w,1,colors.blue)\\\ + term.setCursorPos(1,1)\\\ + term.setTextColor(colors.white)\\\ + term.setBackgroundColor(colors.blue)\\\ + term.write(\\\"Beam ID: \\\"..os.getComputerID())\\\ + term.setCursorPos(w,1)\\\ + term.setBackgroundColor(colors.red)\\\ + term.write(\\\"X\\\")\\\ +\\\ + paintutils.drawFilledBox(2,4,w-1,6,colors.blue)\\\ + term.setCursorPos(1,5)\\\ + term.setBackgroundColor(colors.blue)\\\ + term.setTextColor(colors.white)\\\ + center(\\\"Send File\\\")\\\ +\\\ + paintutils.drawFilledBox(2,8,w-1,10,colors.gray)\\\ + term.setCursorPos(1,9)\\\ + term.setBackgroundColor(colors.gray)\\\ + term.setTextColor(colors.white)\\\ + center(\\\"Settings\\\")\\\ +\\\ +\\\ + term.setCursorPos(1,2)\\\ + term.setTextColor(colors.black)\\\ + term.setBackgroundColor(colors.white)\\\ + term.setCursorPos(1,h-3)\\\ + if status then\\\ + term.write(\\\"Status: Listening\\\")\\\ + else\\\ + term.write(\\\"Status: Standby\\\")\\\ + end\\\ + term.setCursorPos(1,h-2)\\\ + term.write(\\\"Channel: \\\"..channel)\\\ + term.setCursorPos(1,h-1)\\\ + term.write(\\\"Max Distance: \\\"..maxDistance)\\\ + term.setCursorPos(1,h)\\\ + term.write(\\\"Version: \\\"..version)\\\ + term.setCursorBlink(false)\\\ +end\\\ +local modem = peripheral.find(\\\"modem\\\")\\\ +\\\ +if not modem then\\\ + term.setBackgroundColor(colors.black)\\\ + term.setTextColor(colors.white)\\\ + term.clear()\\\ + term.setCursorPos(1,1)\\\ + printError(\\\"Modem not found\\\")\\\ + return\\\ +end\\\ +\\\ +modem.open(channel)\\\ +\\\ +while true do\\\ + redraw()\\\ + local ev = {os.pullEvent()}\\\ + if ev[1] == \\\"mouse_click\\\" then\\\ + local x,y = ev[3],ev[4]\\\ + if x == w and y == 1 then\\\ + modem.close(channel)\\\ + term.setBackgroundColor(colors.black)\\\ + term.setTextColor(colors.white)\\\ + term.clear()\\\ + term.setCursorPos(1,1)\\\ + print(\\\"Thanks for using Beam by Ale32bit\\\")\\\ + break\\\ + elseif (x >= 2 and y >= 4) and (x <= w-1 and y <= 6) then\\\ + local function redrawSend()\\\ + paintutils.drawFilledBox(1,2,w,h,colors.white)\\\ + term.setTextColor(colors.black)\\\ + term.setCursorPos(1,3)\\\ + center(\\\"Send file\\\")\\\ + term.setCursorPos(2,5)\\\ + write(\\\"Receiver ID: \\\")\\\ + term.setCursorPos(2,7)\\\ + write(\\\"File: \\\")\\\ + term.setCursorPos(15,5)\\\ + term.setCursorBlink(true)\\\ + end\\\ + while true do\\\ + redrawSend()\\\ + local e,_,x,y = os.pullEvent()\\\ + if e == \\\"mouse_click\\\" and x == w and y == 1 then\\\ + break\\\ + elseif e == \\\"key\\\" then\\\ + term.setCursorPos(15,5)\\\ + local receiver = read()\\\ + if tonumber(receiver) then\\\ + term.setCursorPos(8,7)\\\ + local file = read()\\\ + if file ~= \\\"\\\" and fs.exists(file) then\\\ + local f = fs.open(file,\\\"r\\\")\\\ + local con = f.readAll()\\\ + f.close()\\\ + -- Beam Engine\\\ + local randomID = math.random(0,65535)\\\ + usedIDs[randomID] = true\\\ + modem.transmit(channel,os.getComputerID(),{\\\ + content = encode(con),\\\ + version = beamEngineBuild,\\\ + receiver = encode(receiver),\\\ + id = randomID,\\\ + })\\\ + \\\ + term.setCursorPos(1,9)\\\ + center(\\\"File sent to \\\"..receiver)\\\ + break\\\ + else\\\ + term.setCursorPos(2,9)\\\ + term.setTextColor(colors.red)\\\ + term.write(\\\"The file does not exist\\\")\\\ + sleep(2)\\\ + end\\\ + else\\\ + term.setCursorPos(2,9)\\\ + term.setTextColor(colors.red)\\\ + term.write(\\\"Receiver must be number\\\")\\\ + sleep(2)\\\ + end\\\ + end\\\ + end\\\ + elseif (x >= 2 and y >= 8) and (x <= w-1 and y <= 10) then\\\ + local function redrawSett()\\\ + paintutils.drawFilledBox(1,2,w,h,colors.white)\\\ + term.setTextColor(colors.black)\\\ + term.setCursorPos(1,3)\\\ + center(\\\"Settings\\\")\\\ + term.setCursorPos(1,5)\\\ + if status then\\\ + center(\\\"Disable receiver\\\")\\\ + else\\\ + center(\\\"Enable receiver\\\")\\\ + end\\\ + term.setCursorPos(1,6)\\\ + center(\\\"Set channel\\\")\\\ + term.setCursorPos(1,7)\\\ + center(\\\"Set max distance\\\")\\\ + end\\\ + while true do\\\ + redrawSett()\\\ + local _,_,x,y = os.pullEvent(\\\"mouse_click\\\")\\\ + if x == w and y == 1 then\\\ + break\\\ + elseif y == 5 then\\\ + if status then\\\ + modem.close(channel)\\\ + status = false\\\ + else\\\ + modem.open(channel)\\\ + status = true\\\ + end\\\ + elseif y == 6 then\\\ + while true do\\\ + paintutils.drawFilledBox(1,2,w,h,colors.white)\\\ + term.setTextColor(colors.black)\\\ + term.setCursorPos(1,3)\\\ + center(\\\"Set channel\\\")\\\ + term.setCursorPos(2,4)\\\ + write(\\\"(0-65535) \\\")\\\ + local cch = read()\\\ + if tonumber(cch) or (cch >= 0 and cch <= 65535) then\\\ + modem.close(channel)\\\ + channel = tonumber(cch)\\\ + modem.open(channel)\\\ + break\\\ + else\\\ + term.setCursorPos(1,6)\\\ + term.setTextColor(colors.red)\\\ + center(\\\"Channel must be number\\\")\\\ + term.setCursorPos(1,7)\\\ + center(\\\"and in 0-65535\\\")\\\ + sleep(2)\\\ + end\\\ + end\\\ + elseif y == 7 then\\\ + while true do\\\ + paintutils.drawFilledBox(1,2,w,h,colors.white)\\\ + term.setTextColor(colors.black)\\\ + term.setCursorPos(1,3)\\\ + center(\\\"Set max distance\\\")\\\ + term.setCursorPos(2,4)\\\ + local diss = read()\\\ + if tonumber(diss) then\\\ + maxDistance = tonumber(diss)\\\ + break\\\ + else\\\ + term.setCursorPos(1,6)\\\ + term.setTextColor(colors.red)\\\ + center(\\\"Channel must be number\\\")\\\ + sleep(2)\\\ + end\\\ + end\\\ + end\\\ + end\\\ + end\\\ + elseif ev[1] == \\\"modem_message\\\" then\\\ + ch = ev[3]\\\ + rch = ev[4]\\\ + content = ev[5]\\\ + distance = ev[6]\\\ + if ch == channel and distance <= maxDistance and (content.content and content.version and content.receiver) then\\\ + if content.version == beamEngineBuild and tonumber(decode(content.receiver)) == os.getComputerID() and not usedIDs[randomID] then\\\ + paintutils.drawFilledBox(1,2,w,h,colors.white)\\\ + term.setTextColor(colors.black)\\\ + term.setCursorPos(1,3)\\\ + center(\\\"File received from \\\"..rch)\\\ + term.setCursorPos(1,4)\\\ + center(\\\"Download file?\\\")\\\ + paintutils.drawFilledBox(2,6,8,8,colors.lime)\\\ + term.setCursorPos(4,7)\\\ + term.setTextColor(colors.white)\\\ + term.write(\\\"Yes\\\")\\\ + paintutils.drawFilledBox(w-8,6,w-2,8,colors.red)\\\ + term.setCursorPos(w-6,7)\\\ + term.setTextColor(colors.white)\\\ + term.write(\\\"No\\\")\\\ + while true do\\\ + local _,_,x,y = os.pullEvent(\\\"mouse_click\\\")\\\ + \\\ + if y == 1 and x == w then\\\ + break\\\ + elseif (x >= 2 and y >= 6) and (x <= 8 and y <= 8) then\\\ + paintutils.drawFilledBox(1,2,w,h,colors.white)\\\ + term.setCursorPos(1,3)\\\ + term.setTextColor(colors.black)\\\ + center(\\\"Save file as\\\")\\\ + term.setCursorPos(2,4)\\\ + term.setCursorBlink(true)\\\ + while true do\\\ + local e, p, x, y = os.pullEvent()\\\ + if e == \\\"mouse_click\\\" and x == w and y == 1 then\\\ + break\\\ + elseif e == \\\"key\\\" then\\\ + local name = read()\\\ + local f = fs.open(name, \\\"w\\\")\\\ + f.write(decode(content.content))\\\ + f.close()\\\ + term.setCursorPos(1,6)\\\ + center(\\\"File saved!\\\")\\\ + term.setCursorPos(1,8)\\\ + center(\\\"Press any key\\\")\\\ + os.pullEvent(\\\"key\\\")\\\ + break\\\ + end\\\ + end\\\ + break\\\ + elseif (x >= w-8 and y >= 6) and (x <= w-2 and y <= 8) then\\\ + break\\\ + end\\\ + end\\\ + else\\\ + if content.version ~= beamEngineBuild then\\\ + paintutils.drawFilledBox(1,2,w,h,colors.white)\\\ + term.setTextColor(colors.black)\\\ + term.setCursorPos(1,3)\\\ + center(\\\"Can't get file from \\\"..rch)\\\ + term.setCursorPos(1,4)\\\ + if content.version < beamEngineBuild then\\\ + center(\\\"Sender Beam is obsolete\\\")\\\ + elseif content.version > beamEngineBuild then\\\ + center(\\\"Your Beam is obsolete\\\")\\\ + end\\\ + term.setCursorPos(1,6)\\\ + center(\\\"Press any key\\\")\\\ + os.pullEvent(\\\"key\\\")\\\ + end\\\ + end\\\ + end\\\ + end\\\ +end\\\ +\",\ +}", + config = "{\ + type = \"networking\",\ + author = \"Ale32bit\",\ + name = \"Beam\",\ + id = \"ale32bit.beam\",\ + version = 2.2,\ + main = \"beam.lua\",\ +}", +}