Advertisement
Larvix

network

Dec 28th, 2023 (edited)
1,183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 7.42 KB | None | 0 0
  1. -- Server-side functions
  2. server = function()
  3.     -- Get network if one already exists
  4.     if fs.exists("network.txt") then
  5.         file = fs.open("network.txt","r")
  6.         clients = file.readAll()
  7.         file.close()
  8.         clients = textutils.unserialise(clients)
  9.     else
  10.         clients = {}
  11.     end
  12.  
  13.     -- Check if message is from member client
  14.     isMember = function(id)
  15.         exists = false
  16.         for i = 1,#clients do
  17.             if clients[i] == id then
  18.                 exists = true
  19.             end
  20.         end
  21.         return exists
  22.     end
  23.  
  24.     -- Provided client isn't a member, add
  25.     addMember = function(id)
  26.         if not isMember(id) then
  27.             rednet.send(id, nil, "hive.add")
  28.             id,conf,cmd = rednet.receive("hive.add",1)
  29.             if conf == true then
  30.                 table.insert(clients, id)
  31.                 print(id.." Added")
  32.             else
  33.                 print(id.." "..conf)
  34.             end
  35.         end
  36.     end
  37.  
  38.     -- Provided client is a member, remove
  39.     rmvMember = function(id)
  40.         if isMember(id) then
  41.             for i = 1,#clients do
  42.                 if clients[i] == id then
  43.                     rednet.send(id,nil,"hive.rmv")
  44.                     id,conf,cmd = rednet.receive("hive.rmv",1)
  45.                     if conf == true then
  46.                         table.remove(clients,i)
  47.                         print(id.." Removed")
  48.                     else print("[Failed]")
  49.                     end
  50.                 end
  51.             end
  52.         end
  53.     end
  54.  
  55.     remoteControl = function(id)
  56.         if isMember(id) then
  57.             rednet.send(id,true,"hive.rc")
  58.             cid,ctype,cprot = rednet.receive("hive.rc",1)
  59.             if not cid then
  60.                 print("[Error] Connection failure")
  61.             elseif ctype == false then
  62.                 print("[Error] Device not compatible")
  63.             else
  64.             rcQueue = nil
  65.             while true do
  66.                 evt,key = os.pullEvent("key")
  67.                 if key == keys.tab then
  68.                     rednet.send(id,false,"hive.rc")
  69.                     break
  70.                 elseif key == keys.up then
  71.                     rcQueue = "forward"
  72.                 elseif key == keys.down then
  73.                     rcQueue = "back"
  74.                 elseif key == keys.left then
  75.                     rcQueue = "left"
  76.                 elseif key == keys.right then
  77.                     rcQueue = "right"
  78.                 elseif key == keys.insert then
  79.                     rcQueue = "place"
  80.                 elseif key == keys.delete then
  81.                     rcQueue = "dig"
  82.                 elseif key == keys.pageUp then
  83.                     rcQueue = "up"
  84.                 elseif key == keys.pageDown then
  85.                     rcQueue = "down"
  86.                 end
  87.                 if rcQueue ~= nil then
  88.                     rednet.send(id,rcQueue,"hive.rc")
  89.                     rcQueue = nil
  90.                 end
  91.             end
  92.             end
  93.         end
  94.     end
  95.  
  96.     -- Display information on first line
  97.     serverInfo = function()
  98.         x,y = term.getCursorPos()
  99.         term.setCursorPos(1,1)
  100.         term.clearLine()
  101.         write("Members: "..#clients)
  102.         if y == 1 then y = 2 end
  103.         term.setCursorPos(x,y)
  104.     end
  105.  
  106.     -- Wait for user to give command
  107.     waitForCmd = function()
  108.         if cmd == nil then
  109.             cmd = read()
  110.         end
  111.         if cmd == "clear" then
  112.             shell.run("clear")
  113.         else
  114.             if cmd:sub(1,3) == "add" then
  115.                 id = cmd:gsub("add ","")
  116.                 id = tonumber(id)
  117.                 addMember(id)
  118.             elseif cmd:sub(1,6) == "remove" then
  119.                 id = cmd:gsub("remove ","")
  120.                 id = tonumber(id)
  121.                 rmvMember(id)
  122.             elseif cmd:sub(1,5) == "ping " then
  123.                 cmd = cmd:gsub("ping ","")
  124.                 if cmd:sub(1,3) == "all" then
  125.                     if #cmd > 4 then
  126.                         ping = cmd:sub(5,#cmd)
  127.                     else
  128.                         ping = "ping"
  129.                     end
  130.                     for i = 1,#clients do
  131.                         rednet.send(tonumber(clients[i]),ping,"hive.msg")
  132.                     end
  133.                 else
  134.                     id = cmd:sub(1,cmd:find(" ")-1)
  135.                     id = tonumber(id)
  136.                     ping = cmd:sub(cmd:find(" ")+1,#cmd)
  137.                     if isMember(id) then
  138.                         if not ping then
  139.                             ping = "ping"
  140.                         end
  141.                         rednet.send(id,ping,"hive.msg")
  142.                     end
  143.                 end
  144.             elseif cmd:sub(1,3) == "rc " then
  145.                 id = cmd:gsub("rc ","")
  146.                 id = tonumber(id)
  147.                 remoteControl(id)
  148.             end
  149.         end
  150.         cmd = nil
  151.     end
  152.  
  153.     -- Main server process
  154.     while true do
  155.         memberCount = #clients
  156.         serverInfo()
  157.         waitForCmd()
  158.         if #clients == 0 and fs.exists("network.txt") then
  159.             fs.delete("network.txt")
  160.         elseif #clients ~= memberCount then
  161.             file = fs.open("network.txt","w")
  162.             file.write(textutils.serialise(clients))
  163.             file.close()
  164.         end
  165.     end
  166. end
  167.  
  168. -- Client-side functions
  169. client = function()
  170.     -- Get server ID if one exists
  171.     if fs.exists("server.txt") then
  172.         file = fs.open("server.txt","r")
  173.         sID = file.readLine()
  174.         file.close()
  175.         sID = tonumber(sID)
  176.     end
  177.  
  178.     -- Display information on first line
  179.     clientInfo = function()
  180.         x,y = term.getCursorPos()
  181.         term.setCursorPos(1,1)
  182.         term.clearLine()
  183.         write("Client#"..os.getComputerID())
  184.         if sID then
  185.             print(" [Connected]")
  186.         else
  187.             print(" [Disconnected]")
  188.         end
  189.         if y < 2 then y = 2 end
  190.         term.setCursorPos(x,y)
  191.     end
  192.  
  193.     -- Wait for message from server
  194.     local listen = function()
  195.         id,data,cmd = rednet.receive()
  196.         if cmd:sub(1,5) == "hive." then
  197.             if cmd == "hive.add" then
  198.                 if not sID then
  199.                     sID = id
  200.                     rednet.send(id,true,cmd)
  201.                     if sID then
  202.                         file = fs.open("server.txt","w")
  203.                         file.write(tostring(sID))
  204.                         file.close()
  205.                     end
  206.                 else
  207.                     rednet.send(id,"Already Has Network",cmd)
  208.                 end
  209.             elseif id == sID then
  210.                 if cmd == "hive.rmv" then
  211.                     rednet.send(id,true,cmd)
  212.                     if fs.exists("server.txt") then
  213.                         fs.delete("server.txt")
  214.                         sID = nil
  215.                         shell.run("clear")
  216.                     end
  217.                 elseif cmd == "hive.msg" then
  218.                     print("Server:"..data)
  219.                 elseif cmd == "hive.rc" and data == true then
  220.                     if not turtle and not peripheral.getType("back") == "neuralInteface" then
  221.                         rednet.send(sID,false,"hive.rc")
  222.                     elseif not fs.exists("//hivemind/movement.lua") then
  223.                         rednet.send(sID,false,"hive.rc")
  224.                     else
  225.                         rednet.send(sID,true,"hive.rc")
  226.                         while true do
  227.                             id,data,cmd = rednet.receive("hive.rc")
  228.                             if id == sID then
  229.                                 if data == false then
  230.                                     break
  231.                                 end
  232.                             end
  233.                         end
  234.                     end
  235.                 end
  236.             end
  237.         end
  238.     end
  239.  
  240.     -- Main client process
  241.     while true do
  242.         clientInfo()
  243.         listen()
  244.     end
  245. end
  246.  
  247. -- Main process
  248. shell.run("clear")
  249. modem = peripheral.find("modem")
  250. args = {...}
  251. if args[1] == "server" then type = "server" else type = "client" end
  252.  
  253. if not modem then
  254.     print("[Error] No Modem Found")
  255. else
  256.     rednet.open(peripheral.getName(modem))
  257.     if type == "server" then
  258.         if args[2] == "rc" then
  259.             cmd = "rc "..args[3]
  260.         end
  261.         server()
  262.     elseif type == "client" then
  263.         client()
  264.     end
  265. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement