Advertisement
Pirnogion

NetAPI

Oct 21st, 2014
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.28 KB | None | 0 0
  1. local CHECKTIMER = 10
  2. local TIMEOUT    = 6
  3. local MAXERROR   = 2
  4.  
  5. local function CompareID(id1, id2, message1, message2)
  6.  if (id1 ~= id2) then return message1
  7.  else return message2 end
  8. end
  9.  
  10. local function CompareIDs(ids, id)
  11.   if (ids == nil or id == nil) then
  12.    return false
  13.   end
  14.  
  15.   for i, v in ipairs(ids) do
  16.    if (v == id) then
  17.     return true
  18.    end
  19.   end
  20.  
  21.   return false
  22. end
  23.  
  24. local function LoadWhiteList()
  25.  if (fs.exists("NetAPI.WhiteList") == false) then
  26.   return false
  27.  end
  28.  
  29.  local file = fs.open("NetAPI.WhiteList", "r")
  30.  
  31.  local _tbl = {}
  32.  local size = f.readline() + 0
  33.  
  34.  for i = 1, size do
  35.   table.insert(_tbl, f.readline() + 0)
  36.  end
  37.  
  38.  file.close()
  39.  
  40.  return _tbl
  41. end
  42.  
  43. local function getWirelessModemSide()
  44.     for n, sSide in ipairs(rs.getSides()) do
  45.         if peripheral.getType(sSide) == "modem" and peripheral.call(sSide, "isWireless") then
  46.             return sSide
  47.         end
  48.     end
  49. end
  50.  
  51. ServerSide =
  52. {
  53.  side = nil,
  54.  checktime = nil,
  55.  isWhiteList = true,
  56.  active = false,
  57.  clients = {},
  58.  whitelist = {},
  59.  
  60.  --Start Server
  61.  StartServer = function(self)
  62.   if isWhiteList then self.whitelist = LoadWhiteList() end
  63.  
  64.   self.side = getWirelessModemSide()
  65.   if not self.side then error("Wireless modem not found.") end
  66.   rednet.open(self.side)
  67.   self.active = true
  68.  
  69.   return true
  70.  end,
  71.  
  72.  --Stop Server
  73.  StopServer = function(self)
  74.   if not self.active then error("The server is not running.") end
  75.   BroadcastMessage("from_server.disconnect")
  76.   self.active = false
  77.   rednet.close(self.side)
  78.  
  79.   return true
  80.  end,
  81.  
  82.  --Handler clients connection
  83.  HandleMessages = function(self)
  84.   local _event, _id, _msg = os.pullEvent()
  85.   if _event == "rednet_message" then
  86.    if _msg == "from_client.connect" then
  87.     if not self.checktime then self.checktime = os.startTimer(CHECKTIMER) end
  88.    
  89.     self.clients[_id] = {true, 0}
  90.     rednet.send(_id, "from_server.connect.processed")
  91.    
  92.     print("Client ", _id, " connected.")
  93.    elseif _msg == "from_client.check" then
  94.     rednet.send(_id, "from_server.check.processed")
  95.    elseif _msg == "from_client.disconnect" then
  96.     self.clients[_id] = nil
  97.     print("Client " .. _id .. " disconnected.")
  98.    end
  99.   elseif _event == "timer" then
  100.    if _id == self.checktime then
  101.     self.checktime = nil
  102.     if self:CheckClients() then self.checktime = os.startTimer(CHECKTIMER) end
  103.    end
  104.   end
  105.  end,
  106.  
  107.  BroadcastClientMessage = function(self, message)
  108.   for id, _ in pairs(self.clients) do
  109.    rednet.send(id, message)
  110.   end
  111.  end,
  112.  
  113.  CheckClient = function(self, id)
  114.   rednet.send(id, "from_server.check")
  115.    
  116.   _id, _msg = rednet.receive(TIMEOUT)
  117.   --print("id: ", id, ", _id: ", _id, ", msg: ", _msg)
  118.   if _id == id then
  119.   print("ok")
  120.    if _msg == "from_client.check.processed" then
  121.     self.clients[_id][1] = true
  122.     self.clients[_id][2] = 0
  123.     return
  124.    end
  125.   end
  126.  
  127.   if self.clients[id][2] >= MAXERROR then
  128.     rednet.send(id, "from_server.disconnect")
  129.     print(id, " disconnect")
  130.     self.clients[id] = nil
  131.     return
  132.   end
  133.  
  134.   self.clients[id][1] = false
  135.   self.clients[id][2] = self.clients[id][2] + 1
  136.   print(self.clients[id][2])
  137.  end,
  138.  
  139.  CheckClients = function(self)
  140.   --Удалить костыль
  141.   --Обновить на черепашке
  142.   return pcall(
  143.    function()
  144.     for id, clientinfo in pairs(self.clients) do
  145.      self:CheckClient(id)
  146.     end
  147.    end
  148.   )
  149.  end
  150. }
  151.  
  152. ClientSide =
  153. {
  154.  checktime = nil,
  155.  side = nil,
  156.  active = false,
  157.  serverID = nil,
  158.  
  159.   --Start Client
  160.  StartClient = function(self)
  161.  
  162.   self.side = getWirelessModemSide()
  163.   if not self.side then error("Wireless modem not found.") end
  164.   rednet.open(self.side)
  165.   self.active = true
  166.  
  167.   return true
  168.  end,
  169.  
  170.  --Stop Client
  171.  StopClient = function(self)
  172.   if not self.active then error("The client is not running.") end
  173.   rednet.send(self.serverID, "from_client.disconnect")
  174.   self.active = false
  175.   rednet.close(self.side)
  176.  
  177.   return true
  178.  end,
  179.  
  180.  HandleMessages = function(self)
  181.   local _event, _id, _msg = os.pullEvent()
  182.  
  183.   if _event == "rednet_message" then
  184.    if _msg == "from_server.check" then
  185.     self.checktime = os.startTimer(CHECKTIMER)
  186.     rednet.send(_id, "from_client.check.processed")
  187.    elseif _msg == "from_server.disconnect" then
  188.     print("Disconnected from server.")
  189.    end
  190.   elseif _event == "timer" then
  191.    if _id == self.checktime then self.checktime = nil self:CheckConnection() self.checktime = os.startTimer(CHECKTIMER) end
  192.   end
  193.  end,
  194.  
  195.  GetServerID = function(self)
  196.   return self.serverID
  197.  end,
  198.  
  199.  CheckConnection = function(self)
  200.   rednet.send(self.serverID, "from_client.check")
  201.  
  202.   _id, _msg = rednet.receive(TIMEOUT)  
  203.   if _id == serverID then
  204.    if _msg == "from_server.check.processed" then
  205.     errors = 0
  206.     return
  207.    end
  208.   end
  209.  
  210.   if self.errors > MAXERROR then
  211.     rednet.send(id, "from_client.disconnect")
  212.     print("Disconnected")
  213.     return
  214.   end
  215.   self.errors = self.errors + 1
  216.  end,
  217.  
  218.  SendServerMessage = function(self, message, id)
  219.   rednet.send(id, message)
  220.  end,
  221.  
  222.  ConnectToServer = function(self, id)
  223.   rednet.send(id, "from_client.connect")
  224.  
  225.   _id, _msg = rednet.receive(TIMEOUT)
  226.    
  227.   if _msg == "from_server.connect.processed" then
  228.    self.serverID = _id
  229.    self.active = true
  230.  
  231.    return true
  232.   end
  233.  
  234.   return false  
  235.  end
  236. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement