Grauly

CC_IEC-OS client v4

May 8th, 2021 (edited)
691
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. local IECNET = true
  2. -- end of config
  3. local args = {...}
  4.  
  5. --IECNET setup
  6. local gpsEnabled = false
  7. local net = "IECNET"
  8. local host = 0
  9. function iecnetSetup()
  10.     if (IECNET) then
  11.         if (peripheral.isPresent("back")) then
  12.             if (peripheral.getType("back") == "modem") then
  13.                 --peripheral is present, starting IECNET
  14.                 rednet.open("back")
  15.                 host = rednet.lookup(net,"IEC-Host")
  16.                 if (host == nil) then
  17.                     term.write(net.." does not have a Host or Host is Offline, broadcasts will go unheard.")
  18.                     IECNET = false
  19.                 end
  20.                 x,y,z = gps.locate()
  21.                 if (x == nil) then
  22.                     term.write("GPS not available, will not send Location Data")
  23.                 else
  24.                     gpsEnabled = true;
  25.                 end
  26.                 rednet.broadcast("Online",net)
  27.             else
  28.                 term.write("IECNET was enabled, but no modem was found.")
  29.                 IECNET = false
  30.             end
  31.         else
  32.             term.write("IECNET was enabled, but no modem was found.")
  33.             IECNET = false
  34.         end
  35.     end
  36. end
  37.  
  38. function getLocation()
  39.     x,y,z = gps.locate()
  40.     if (x == nil) then
  41.         gpsEnabled = false
  42.         return nil
  43.     else
  44.         if (not gpsEnabled) then
  45.             gpsEnabled = true
  46.         end
  47.         x = math.floor(x+0.5)
  48.         y = math.floor(y+0.5)
  49.         z = math.floor(z+0.5)
  50.         return tostring(x).." "..tostring(y).." "..tostring(z)
  51.     end
  52. end
  53.  
  54. function nextLine()
  55.     x,y = term.getCursorPos()
  56.     term.setCursorPos(1,y+1)
  57. end
  58.  
  59. function head()
  60.     term.setCursorPos(1,1)
  61.     x,y = term.getSize()
  62.     term.write("+")
  63.     for i=1,(x-13)/2,1 do
  64.         term.write("-")
  65.     end
  66.     term.write("[")
  67.     term.setTextColor(colors.yellow)
  68.     term.write("IEC-OS.aic")
  69.     term.setTextColor(colors.white)
  70.     term.write("]")
  71.     for i=1,(x-13)/2,1 do
  72.         term.write("-")
  73.     end
  74.     term.write("+")
  75. end
  76.  
  77. function foot()
  78.     x,y = term.getSize()
  79.     term.setCursorPos(1,y)
  80.     term.write("+")
  81.     for i=1,1,1 do
  82.         term.write("-")
  83.     end
  84.     term.write("[")
  85.     term.setTextColor(colors.yellow)
  86.     term.write("Home")
  87.     term.setTextColor(colors.white)
  88.     term.write("]")
  89.     if (IECNET) then
  90.         for i=1,x-(8+11),1 do
  91.             term.write("-")
  92.         end
  93.         term.write("[")
  94.         term.setTextColor(colors.green)
  95.         term.write("Online")
  96.         term.setTextColor(colors.white)
  97.         term.write("]--+")
  98.     else
  99.         for i=1,x-(8+11),1 do
  100.             term.write("-")
  101.         end
  102.         term.write("[")
  103.         term.setTextColor(colors.red)
  104.         term.write("Offline")
  105.         term.setTextColor(colors.white)
  106.         term.write("]-+")
  107.     end
  108. end
  109.  
  110. function functionals()
  111.     term.clear()
  112.     head()
  113.     foot()
  114.     term.setCursorPos(1,2)
  115. end
  116.  
  117. function startAnimation()
  118.     --TODO
  119. end
  120.  
  121. function divider()
  122.     x,y = term.getSize()
  123.     term.write("+")
  124.     for i=1,(x-2),1 do
  125.         term.write("-")
  126.     end
  127.     term.write("+")
  128.     nextLine()
  129. end
  130.  
  131. function screenHead(label)
  132.     x,y = term.getSize()
  133.     term.write("+-["..label.."]")
  134.     length = 4+ string.len(label)+1
  135.     for i=1,(x-length),1 do
  136.         term.write("-")
  137.     end
  138.     term.write("+")
  139.     nextLine()
  140. end
  141.  
  142. local buttons = {}
  143. --creates and registers a button
  144. function button(label,text)
  145.     screenHead(label)
  146.     x,y = term.getSize()
  147.     term.write("|")
  148.     term.write(text)
  149.     length = 2+ string.len(text)
  150.     for i=1, (x-length),1 do
  151.         term.write(" ")
  152.     end
  153.     term.write("|")
  154.     x,y = term.getCursorPos()
  155.     buttons[y] = label
  156.     nextLine()
  157. end
  158.  
  159. function clearButtons()
  160.     buttons = {}
  161. end
  162.  
  163. function printPercentFilled(startLine,percent)
  164.     term.setCursorPos(4,startLine)
  165.     term.write("Filled to: ")
  166.     if (percent > 30) then
  167.         term.setTextColor(colors.green)
  168.     elseif (percent > 15) then
  169.         term.setTextColor(colors.yellow)
  170.     elseif (percent > 7) then
  171.         term.setTextColor(colors.orange)
  172.     else
  173.         term.setTextColor(colors.red)
  174.     end
  175.     term.setCursorPos(4,startLine+1)
  176.     term.write(percent)
  177.     term.setTextColor(colors.white)
  178.     term.write("%")
  179.     term.setCursorPos(4,startLine+2)
  180. end
  181.  
  182. function printIO(startLine,bankIO,unit)
  183.     term.setCursorPos(4,startLine)
  184.     term.write("I/O:")
  185.     if (bankIO > 0) then
  186.         term.setTextColor(colors.green)
  187.     elseif (bankIO < 0) then
  188.         term.setTextColor(colors.red)
  189.     else
  190.         term.setTextColor(colors.blue)
  191.     end
  192.     term.setCursorPos(4,startLine+1)
  193.     term.write(bankIO)
  194.     term.setTextColor(colors.white)
  195.     term.write(" "..unit)
  196.     term.setCursorPos(4,startLine+3)
  197. end
  198.  
  199. function printETA(startLine,sign,eta,percentFilled)
  200.     term.setCursorPos(4,startLine)
  201.     if (sign == "+") then
  202.         term.write("Full in:")
  203.         term.setTextColor(colors.white)
  204.     elseif (sign == "-") then
  205.         term.write("Empty in:")
  206.         term.setTextColor(colors.red)
  207.     else
  208.         term.write("Full in:")
  209.         term.setCursorPos(4,startLine+1)
  210.         if (percentFilled == 100) then
  211.             eta = "Overfilling!"
  212.         else
  213.             eta = "No I/O"
  214.         return
  215.         end
  216.     end
  217.     term.setCursorPos(4,startLine+1)
  218.     term.write(eta)
  219.     term.setTextColor(colors.white)
  220.     term.setCursorPos(4,startLine+2)
  221. end
  222.  
  223. function printMainBar(startLine,filledPercent)
  224.     x = 2
  225.     term.setCursorPos(x,startLine)
  226.     filledPercent = math.ceil(filledPercent/10)
  227.     for i=1,10-filledPercent,1 do
  228.         x,y = term.getCursorPos()
  229.         term.write("|")
  230.         term.setCursorPos(x,y+1)
  231.     end
  232.     for i=1,filledPercent,1 do
  233.         x,y = term.getCursorPos()
  234.         term.write("#")
  235.         term.setCursorPos(x,y+1)
  236.     end
  237. end
  238.  
  239. function capacitorReadouts(startLine,toPrint)
  240.     if ( toPrint["online"] == true) then
  241.         term.setCursorPos(4,startLine)
  242.         printPercentFilled(startLine,toPrint["fillstat"])
  243.         nextLine()
  244.         x,y = term.getCursorPos()
  245.         printIO(y,toPrint["bankIO"],toPrint["unit"])
  246.         nextLine()
  247.         x,y = term.getCursorPos()
  248.         printETA(y,toPrint["sign"],toPrint["eta"],toPrint["fillstat"])
  249.         printMainBar(startLine,toPrint["fillstat"])
  250.     else
  251.         term.setTextColor(colors.red)
  252.         term.write("Capacitor Offline")
  253.         term.setTextColor(colors.white)
  254.         x,y = term.getCursorPos()
  255.         term.setCursorPos(1,y+10)
  256.     end
  257. end
  258.  
  259. local SCREEN = "Home"
  260. local page = 1 --pagenumber for Energynet screen
  261. local pagenum = 0 --number of pages for Energynet screen
  262. local currentlyLoggedIn = false
  263.  
  264. function screenChange(newScreen)
  265.     clearButtons()
  266.     if (newScreen == "Turtles") then
  267.         functionals()
  268.         screenHead(SCREEN)
  269.     elseif (newScreen == nil) then
  270.         functionals()
  271.         screenHead("Nil Screen")
  272.     end
  273. end
  274.  
  275. local turretControlButtons = {}
  276. function printTurretControl(label,states)
  277.     local inactiveColor = colors.gray
  278.     local activeColor = colors.green
  279.     x,y = term.getSize()
  280.     term.write("|"..label)
  281.     for i=1,x-2-string.len(label)-3-3,1 do
  282.         term.write(" ")
  283.     end
  284.     term.write("|")
  285.     term.setBackgroundColor(inactiveColor)
  286.     if (states["n"] == true) then
  287.         term.setBackgroundColor(activeColor)
  288.     end
  289.     term.write(" ")
  290.     term.setBackgroundColor(colors.black)
  291.     term.write("|")
  292.     term.setBackgroundColor(inactiveColor)
  293.     if (states["m"] == true) then
  294.         term.setBackgroundColor(activeColor)
  295.     end
  296.     term.write(" ")
  297.     term.setBackgroundColor(colors.black)
  298.     term.write("|")
  299.     term.setBackgroundColor(inactiveColor)
  300.     if (states["p"] == true) then
  301.         term.setBackgroundColor(activeColor)
  302.     end
  303.     term.write(" ")
  304.     term.setBackgroundColor(colors.black)
  305.     term.write("|")
  306.     x,y = term.getCursorPos()
  307.     turretControlButtons[y] = label
  308.     nextLine()
  309. end
  310.  
  311. local lastTurretnetState = {}
  312. --touch handeling
  313. function touchHandeling(buttonPressed,x,y)
  314.     xMax,yMax = term.getSize()
  315.     if ((y == yMax) and (x > 2) and (x < 8)) then
  316.         --Home button was pressed
  317.         SCREEN = "Home"
  318.         return
  319.     end
  320.     if (SCREEN == "Home" or SCREEN == "Turtles") then
  321.         if (x > 1 and x < xMax) then
  322.             change = buttons[y]
  323.             if (not (change == nil)) then
  324.                 SCREEN = change
  325.                 screenChange(change)
  326.             end
  327.         end
  328.     elseif (SCREEN == "Energy") then
  329.         if ((y == yMax-2) or (y == yMax-3)) then
  330.             if (x == 1) then
  331.                 if (not (page == 1)) then
  332.                     page = page -1
  333.                 end
  334.             elseif (x == xMax) then
  335.                 if (not (page == pagenum)) then
  336.                     page = page +1
  337.                 end
  338.             end
  339.         end
  340.     elseif (SCREEN == "Turtle CMD") then
  341.         if (x > 1 and x < xMax) then
  342.             cmnd = buttons[y]
  343.             if (not (cmnd == nil)) then
  344.                 term.write("Command: "..cmnd)
  345.                 if (cmnd == "Harvest") then
  346.                     rednet.broadcast("Turtlenet Harvest",net)
  347.                 elseif (cmnd == "Reboot") then
  348.                     rednet.broadcast("Turtlenet Reboot",net)
  349.                 end
  350.             end
  351.         end
  352.     elseif (SCREEN == "Turretnet") then
  353.         if (y == yMax-1) then
  354.             if (x > xMax-11 and x < xMax-4) then
  355.                 rednet.send(host,"Turretnet reboot",net)
  356.             end
  357.         end
  358.         if (not (turretControlButtons[y] == nil)) then
  359.             --"+n+m+p+"
  360.             returnMessage = {}
  361.             returnMessage["format"] = "Securitynet"
  362.             message = {}
  363.             message["action"] = "control"
  364.             message["label"] = turretControlButtons[y]
  365.             if (x == xMax-1) then
  366.                 --player
  367.                 message["p"] = not lastTurretnetState[turretControlButtons[y]]["p"]
  368.             elseif (x == xMax-3) then
  369.                 --mobs
  370.                 message["m"] = not lastTurretnetState[turretControlButtons[y]]["m"]
  371.             elseif (x == xMax-5) then
  372.                 --neutrals
  373.                 message["n"] = not lastTurretnetState[turretControlButtons[y]]["n"]
  374.             end
  375.             returnMessage["message"] = message
  376.             rednet.send(host,returnMessage,net)
  377.         end
  378.     end
  379. end
  380.  
  381. function printSideChangeButtons(c1,c2)
  382.     xO,yO = term.getCursorPos()
  383.     x,y = term.getSize()
  384.     term.setTextColor(c1)
  385.     term.setCursorPos(1,y-3)
  386.     term.write("/")
  387.     term.setCursorPos(1,y-2)
  388.     term.write("\\")
  389.     term.setTextColor(c2)
  390.     term.setCursorPos(x,y-3)
  391.     term.write("\\")
  392.     term.setCursorPos(x,y-2)
  393.     term.write("/")
  394.     term.setCursorPos(xO,yO)
  395.     term.setTextColor(colors.white)
  396. end
  397.  
  398. function sideChangeButtons()
  399.     if (pagenum == 1 or pagenum == 0) then
  400.         printSideChangeButtons(colors.gray,colors.gray)
  401.     elseif (pagenum == 2) then
  402.         if (page == 1) then
  403.             printSideChangeButtons(colors.gray,colors.yellow)
  404.         else
  405.             printSideChangeButtons(colors.yellow,colors.gray)
  406.         end
  407.     else
  408.         if((not (page == 1)) and (not (page == pagenum))) then
  409.             printSideChangeButtons(colors.yellow,colors.yellow)
  410.         else
  411.             if (page == 1) then
  412.                 printSideChangeButtons(colors.gray,colors.yellow)
  413.             else
  414.                 printSideChangeButtons(colors.yellow,colors.gray)
  415.             end
  416.         end
  417.     end
  418. end
  419.  
  420. function turretnetRebootButton()
  421.     x,y = term.getSize()
  422.     term.setCursorPos(1,y-1)
  423.     term.write("+")
  424.     for i=1,x-4-2-6,1 do
  425.         term.write("-")
  426.     end
  427.     term.write("[")
  428.     term.setTextColor(colors.red)
  429.     term.write("Reboot")
  430.     term.setTextColor(colors.white)
  431.     term.write("]--+")
  432. end
  433.  
  434. --rednet handeling
  435. local ticksSinceLastPing = 0
  436. function rednetHandeling(sender,message,prot)
  437.     if (message == "pong" and prot == net) then --online checker
  438.         ticksSinceLastPing = 0
  439.         host = sender
  440.         return
  441.     elseif (message == "Logout" and prot == net and sender == host) then
  442.         SCREEN = "Home"
  443.         currentlyLoggedIn = false
  444.     end
  445.     if (SCREEN == "Home" or SCREEN == "Turtles" or SCREEN == "Turtle CMD" or SCREEN == "Security") then
  446.        
  447.     elseif (SCREEN == "Turtle Mon") then
  448.         if (type(message) == "table" and prot == net) then --what has been sent is a table
  449.             functionals()
  450.             screenHead(SCREEN)
  451.             if (message["format"] == "turtle") then
  452.                 message = message["message"]
  453.                 for i,line in pairs(message) do
  454.                     screenHead("Turtle: "..i)
  455.                     if (string.find(line,"\n") == nil) then
  456.                         term.write(line)
  457.                         nextLine()
  458.                     else
  459.                         for s in string.gmatch(line,"[^\r\n]+") do
  460.                             term.write(s)
  461.                             nextLine()
  462.                         end
  463.                     end
  464.                 end
  465.             end
  466.             divider()
  467.         end
  468.     elseif (SCREEN == "Energy") then
  469.         if (type(message) == "table" and prot == net) then --what has been sent is a table
  470.             functionals()
  471.             screenHead(SCREEN)
  472.             if (message["format"] == "energy") then
  473.                 message = message["message"]
  474.                 if (not (message == {})) then
  475.                     pages = {} -- list of pages, page numer is saved in higher scope
  476.                     pagenum = 0
  477.                     for k,v in pairs(message) do
  478.                         table.insert(pages,k)
  479.                         pagenum = pagenum +1
  480.                     end
  481.                     toPrint = message[pages[page]]
  482.                     if (not (toPrint == nil)) then
  483.                         if (not (toPrint["label"] == nil)) then
  484.                             screenHead(toPrint["label"])
  485.                             x,y = term.getCursorPos()
  486.                             capacitorReadouts(y,toPrint)
  487.                             x,y = term.getCursorPos()
  488.                             term.setCursorPos(1,y)
  489.                             divider()
  490.                         end
  491.                     end
  492.                     sideChangeButtons()
  493.                 else
  494.                     term.write("No Data.")
  495.                 end
  496.             end
  497.         end
  498.     elseif (SCREEN == "Please Wait") then
  499.         if(type(message) == "table" and prot == net) then
  500.             if(message["format"] == "Securitynet-Login") then
  501.                 if(message["message"] == "Denied") then
  502.                     functionals()
  503.                     screenHead(SCREEN)
  504.                     term.setTextColor(colors.red)
  505.                     term.write("Access Denied")
  506.                     term.setTextColor(colors.white)
  507.                     SCREEN = "Home"
  508.                 elseif(message["message"] == "Success") then
  509.                     functionals()
  510.                     screenHead(SCREEN)
  511.                     term.setTextColor(colors.green)
  512.                     term.write("Access Granted")
  513.                     term.setTextColor(colors.white)
  514.                     SCREEN = "Turretnet"
  515.                     currentlyLoggedIn = true
  516.                 end
  517.             end
  518.         end
  519.     elseif (SCREEN == "Turretnet") then
  520.         if(type(message) == "table" and prot == net) then
  521.             x,y = term.getSize()
  522.             functionals()
  523.             screenHead(SCREEN)
  524.             term.write("+")
  525.             for i=1,x-9,1 do
  526.                 term.write("-")
  527.             end
  528.             term.write("+n+m+p+")
  529.             nextLine()
  530.             if(message["format"] == "Securitynet-Data") then
  531.                 message = message["message"]
  532.                 lastTurretnetState = message
  533.                 turretControlButtons = {}
  534.                 for k,v in pairs(message) do
  535.                     printTurretControl(k,v)
  536.                 end
  537.             end
  538.             divider()
  539.             turretnetRebootButton()
  540.         end
  541.     else
  542.         functionals()
  543.         screenHead("No SCREEN")
  544.     end
  545. end
  546.  
  547. function routine()
  548.     functionals()
  549.     if (SCREEN == "Home") then
  550.         button("Turtles","View Turtle Options")
  551.         button("Energy","View Capacitor Status")
  552.         button("Security","Log on to IECNET")
  553.         divider()
  554.     elseif (SCREEN == "Turtles") then
  555.         screenHead(SCREEN)
  556.         button("Turtle Mon","View Turtle Status")
  557.         button("Turtle CMD","Turtle Commands")
  558.         divider()
  559.     elseif (SCREEN == "Turtle Mon") then
  560.         rednet.broadcast("Turtlenet querry",net)
  561.     elseif (SCREEN == "Turtle CMD") then
  562.         screenHead(SCREEN)
  563.         button("Harvest","Start Harvest")
  564.         button("Reboot","Reboot eligible Turtles")
  565.         divider()
  566.     elseif (SCREEN == "Energy") then
  567.         rednet.broadcast("Energynet querry",net)
  568.     elseif (SCREEN == "Security") then
  569.         screenHead(SCREEN)
  570.         if (currentlyLoggedIn) then
  571.             SCREEN = "Turretnet"
  572.             return
  573.         end
  574.         term.write("User:")
  575.         nextLine()
  576.         term.setTextColor(colors.yellow)
  577.         term.write("> ")
  578.         term.setTextColor(colors.white)
  579.         user = read()
  580.         term.write("Password:")
  581.         nextLine()
  582.         term.setTextColor(colors.yellow)
  583.         term.write("> ")
  584.         term.setTextColor(colors.white)
  585.         pass = read()
  586.         host = rednet.lookup(net)
  587.         if (host == nil) then
  588.             functionals()
  589.             screenHead(SCREEN)
  590.             term.setTextColor(colors.red)
  591.             term.write("IECNET Unreachable.")
  592.         else
  593.             passMessage = {}
  594.             passMessage["format"] = "Securitynet"
  595.             message = {}
  596.             message["action"] = "login"
  597.             message["user"] = user
  598.             message["pass"] = pass
  599.             passMessage["message"] = message
  600.             rednet.send(host,passMessage,net)
  601.         end
  602.         SCREEN = "Please Wait"
  603.     elseif (SCREEN == "Turretnet") then
  604.         rednet.send(host,"Turretnet querry",net)
  605.     else
  606.         functionals()
  607.         screenHead("No SCREEN")
  608.     end
  609.     if (ticksSinceLastPing > 5) then
  610.         IECNET = false
  611.     else
  612.         IECNET = true
  613.     end
  614.     rednet.broadcast("ping",net) --ping the network to see if it is online
  615. end
  616.  
  617. --actual code
  618.  
  619. iecnetSetup()
  620. functionals()
  621.  
  622. local timer = os.startTimer(1)
  623.  
  624. while true do
  625.     event,a1,a2,a3 = os.pullEvent()
  626.     if (event == "timer" and a1 == timer) then
  627.         ticksSinceLastPing = ticksSinceLastPing +1
  628.         routine()
  629.         timer = os.startTimer(1)
  630.     elseif (event == "mouse_click") then
  631.         touchHandeling(a1,a2,a3)
  632.     elseif (event == "rednet_message") then
  633.         rednetHandeling(a1,a2,a3)
  634.     end
  635. end
RAW Paste Data