Guest User

Untitled

a guest
Apr 18th, 2015
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.19 KB | None | 0 0
  1. rednet.open("left")
  2.  
  3. local connected = {}
  4. local keepAliveTimer = os.startTimer(1)
  5.  
  6. local configFile = fs.open("server.cfg", "r")
  7. local config = textutils.unserialise(configFile.readAll())
  8. configFile.close()
  9.  
  10. local map = paintutils.loadImage(config.mapFile)
  11.  
  12. local function serverLoop(eventData)
  13.     local e, p1, p2, p3, p4, p5 = unpack(eventData)
  14.     if e == "rednet_message" then
  15.         local id, tbl = p1, p2
  16.         if tbl.type ~= "connect" and connected[id] == nil then
  17.             print("Rejected unconnected message from " .. id)
  18.             return true
  19.         end
  20.        
  21.         if tbl.type == "connect" then
  22.             connected[id] = {
  23.                 keepAliveResponded = true,
  24.                 suspicious = false
  25.             }
  26.            
  27.             print("Connection from " .. id)
  28.            
  29.             rednet.send(id, {
  30.                 type = "accepted"
  31.             })
  32.         elseif tbl.type == "disconnect" then
  33.             print(id .. " has disconnected.")
  34.             connected[id] = nil
  35.         elseif tbl.type == "keepalive" then
  36.             connected[id].keepAliveResponded = true
  37.         elseif tbl.type == "suspicious_computer" then
  38.             if connected[tbl.id] == nil then
  39.                 print(id .. " marked unknown computer suspicious.")
  40.                 print("Cheating attempt?")
  41.             else
  42.                 print(id .. " marked " .. tbl.id .. " suspicious.")
  43.                 connected[tbl.id].suspicious = true
  44.             end
  45.         elseif tbl.type == "map" then
  46.             rednet.send(id, {
  47.                 type = "map",
  48.                 data = map
  49.             })
  50.         end
  51.     elseif e == "timer" and p1 == keepAliveTimer then
  52.         local toDelete = {}
  53.        
  54.         for k,v in pairs(connected) do
  55.             if not v.keepAliveResponded then
  56.                 table.insert(toDelete, k)
  57.                 print(k .. " timed out.")
  58.                 rednet.send(k, { type = "disconnect", reason = "You timed out." }) -- just to make sure
  59.             end
  60.            
  61.             rednet.send(k, {
  62.                 type = "keepalive"
  63.             })
  64.            
  65.             v.keepAliveResponded = false
  66.         end
  67.        
  68.         for _,v in pairs(toDelete) do
  69.             connected[v] = nil
  70.         end
  71.        
  72.         keepAliveTimer = os.startTimer(1)
  73.     elseif e == "terminate" then
  74.         for k,v in pairs(connected) do
  75.             rednet.send(k, {
  76.                 type = "disconnect",
  77.                 reason = "Server shutting down"
  78.             })
  79.         end
  80.        
  81.         return false
  82.     end
  83.    
  84.     return true
  85. end
  86.  
  87. print("Hosting server on ID " .. os.getComputerID())
  88.  
  89. while true do
  90.     local eventData = { os.pullEventRaw() }
  91.     if not serverLoop(eventData) then break end
  92. end
Advertisement
Add Comment
Please, Sign In to add comment