Advertisement
Guest User

bridge.lua

a guest
Oct 12th, 2015
335
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.54 KB | None | 0 0
  1. local HOST = "bridge.computercraft.ru:1111"
  2. local commandIdent = "+#"
  3. local deviceCommandIdent = "+$"
  4. local internet
  5. local socket, connectedToBridge, connectedToDevice, KEY
  6. local msgBuffer = {}
  7. local BR = {}
  8.  
  9. function BR.split(source, delimiters)
  10.   local elements = {}
  11.   local pattern = '([^'..delimiters..']+)'
  12.   string.gsub(source, pattern, function(value) elements[#elements + 1] =     value;  end);
  13.   return elements
  14. end
  15.  
  16. local function tableToJSON(arr)
  17.   local json = "{"
  18.   local delim = ""
  19.   for k, v in pairs(arr) do
  20.     json = json .. delim .."\"" .. tostring(k) .. "\":\"" .. tostring(v) .. "\""
  21.     delim = ","
  22.   end
  23.   json = json.."}"
  24.   return json
  25. end
  26.  
  27. local function enqueue(array, n)
  28.   n = n or 1
  29.   for i = n, #array do
  30.     table.insert(msgBuffer, array[i])
  31.   end
  32. end
  33.  
  34. function BR.isBridgeConnected() return connectedToBridge end
  35. function BR.isPairConnected() return connectedToDevice end
  36.  
  37. function BR.sendNotification(notif)
  38.   BR.send(deviceCommandIdent .. "31 " .. tableToJSON(notif))
  39. end
  40.  
  41. function BR.sendToast(text, duration)
  42.   duration = duration or 0
  43.   BR.send(deviceCommandIdent .. "30 " .. tostring(duration) .. " " .. text)
  44. end
  45.  
  46. function BR.send(str)
  47.   if not str or str == "" then return false end
  48.   local data = str.."\0"
  49.   local buff
  50.   local i = 0
  51.   while i < 6 do
  52.     buff = socket.write(data)
  53.     if not buff then
  54.       connectedToBridge = false
  55.       return false
  56.     elseif buff > 0 then
  57.       return true
  58.     end
  59.     -- RETRY IF BUFF IS 0
  60.     i = i + 1
  61.   end
  62.  
  63.   return true  
  64. end
  65.  
  66. local function execCommand(cmd)
  67.   local cmdNum = string.sub(cmd, 3, 4)
  68.  
  69.   if     cmdNum == "00" then
  70.     --ping
  71.     BR.send(string.sub(cmd, 1, 2) .. "01") --REPLY TO SENDER
  72.   elseif cmdNum == "01" then
  73.     --pong
  74.   elseif cmdNum == "02" then
  75.     connectedToBridge = false
  76.     --bridge stopped
  77.   elseif cmdNum == "10" then
  78.     connectedToDevice = false
  79.     --no pair
  80.   elseif cmdNum == "20" then
  81.     connectedToDevice = true
  82.     --pair found
  83.   elseif cmdNum == "21" then
  84.     connectedToDevice = false
  85.   end
  86. end
  87.  
  88. local function isCommand(str)
  89.   if string.sub(str, 1, 1) == "+" then
  90.     return true
  91.   end
  92.   return false
  93. end
  94.  
  95. function BR.receive()
  96.   local buff
  97.   if connectedToBridge then
  98.     buff = socket.read()
  99.     if buff == nil then --CONNECTION LOST
  100.       connectedToBridge = false
  101.       connectedToDevice = false
  102.       return nil, false
  103.     elseif #msgBuffer > 0 then --IF BUFFER HAS DATA
  104.       if buff ~= "" then --IF MESSAGE IS NOT EMPTY
  105.         enqueue(BR.split(buff, "\0"))
  106.       end
  107.  
  108.       buff = table.remove(msgBuffer, 1) --GET FIRST MESSAGE FROM BUFFER
  109.     elseif buff == "" then
  110.       return buff, connectedToDevice
  111.     end
  112.  
  113.     local m = BR.split(buff, "\0")
  114.     if #m > 1 then
  115.       enqueue(m, 2)
  116.       buff = m[1]
  117.     end
  118.  
  119.     while true do
  120.       if isCommand(buff) then
  121.         execCommand(buff)
  122.         --return "", connectedToDevice
  123.         if(#msgBuffer > 0) then
  124.           buff = table.remove(msgBuffer, 1)
  125.         else
  126.           return "", connectedToDevice
  127.         end
  128.       else
  129.         buff = BR.split(buff, "\0")[1] --CUT \0  
  130.         return string.sub(buff, 2, #buff), connectedToDevice
  131.       end
  132.     end
  133.   end    
  134.   return nil, false
  135. end
  136.  
  137. function BR.init(key)
  138.   if not key or key == "" then return false end
  139.   KEY = key
  140.   internet = require("component").internet
  141.   socket = internet.connect(HOST)
  142.   if not socket then return false end
  143.   local i = 0
  144.   while not socket.finishConnect() do
  145.     if i >= 5 then
  146.       return false
  147.     end
  148.     i = i + 1
  149.     os.sleep(0.1)
  150.   end
  151.  
  152.   BR.send("KOC-"..key)
  153.   connectedToDevice = false
  154.   connectedToBridge = true
  155.   return true
  156. end
  157.  
  158. return BR
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement