Create beam.spk
This commit is contained in:
parent
e4f4eb42de
commit
d3f6734645
1 changed files with 795 additions and 0 deletions
795
apps/Ale32bit/beam.spk
Normal file
795
apps/Ale32bit/beam.spk
Normal file
|
@ -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\",\
|
||||
}",
|
||||
}
|
Loading…
Reference in a new issue