Guest User

Untitled

a guest
Dec 14th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 8.83 KB | None | 0 0
  1. LOGDEBUG_NETWORKMESSAGE = true
  2.  
  3. -- Data size
  4. local U8  = 256^1
  5. local U16 = 256^2
  6. local U32 = 256^4
  7. local U64 = 256^8
  8.  
  9. NetworkMessageTypes = {
  10.     Boolean = 1,
  11.     U8 = 2,
  12.     U16 = 3,
  13.     U32 = 4,
  14.     U64 = 5,
  15.     NumberString = 6,
  16.     String = 7,
  17.     Table = 8
  18. }
  19.  
  20. if NetworkMessage == nil then
  21.  
  22.     NetworkMessage = {}
  23.    
  24.     function NetworkMessage.create(pdata, psize)
  25.         local obj = {data = pdata, size = psize, pos = 1}
  26.         if obj.data == nil then obj.data = {} end
  27.         if obj.size == nil then obj.size = 0 end
  28.  
  29.         setmetatable(obj, { __index = NetworkMessage })
  30.         return obj
  31.     end
  32.    
  33.     function NetworkMessage:reset()
  34.         self.data = {}
  35.         self.size = 0
  36.         self.pos = 1
  37.     end
  38.  
  39.     function NetworkMessage:getBuffer()
  40.         local str = ''
  41.         for i=1,self.size do str = str .. string.char(self.data[i]) end
  42.         return str
  43.     end
  44.  
  45.     function NetworkMessage:getSize()
  46.         return self.size
  47.     end
  48.    
  49.     function NetworkMessage:finished()
  50.         if self.pos < self.size then
  51.             return false
  52.         end
  53.         return true
  54.     end
  55.    
  56.     function NetworkMessage:logDebug(data)
  57.         if LOGDEBUG_NETWORKMESSAGE == true then
  58.             print(debug.traceback(data))
  59.         end
  60.     end
  61.  
  62.     function NetworkMessage:addU8(value)
  63.         if value >= U8 then
  64.             self:logDebug("Value is greater than " .. U8 .. ".")
  65.             return false
  66.         end
  67.        
  68.         for i=0,0,-1 do
  69.             local power = U8^i
  70.             self.data[self.pos + i] = math.floor(value / power)
  71.             value = value - math.floor(value / power)*power
  72.         end
  73.        
  74.         self.size = self.size + 1
  75.         self.pos = self.pos + 1
  76.         return true
  77.     end
  78.  
  79.     function NetworkMessage:addU16(value)
  80.         if value >= U16 then
  81.             self:logDebug("Value is greater than " .. U16 .. ".")
  82.             return false
  83.         end
  84.        
  85.         for i=1,0,-1 do
  86.             local power = U8^i
  87.             self.data[self.pos + i] = math.floor(value / power)
  88.             value = value - math.floor(value / power)*power
  89.         end
  90.        
  91.         self.size = self.size + 2
  92.         self.pos = self.pos + 2
  93.         return true
  94.     end
  95.    
  96.     function NetworkMessage:addU32(value)
  97.         if value >= U32 then
  98.             self:logDebug("Value is greater than " .. U32 .. ".")
  99.             return false
  100.         end
  101.        
  102.         for i=3,0,-1 do
  103.             local power = U8^i
  104.             self.data[self.pos + i] = math.floor(value / power)
  105.             value = value - math.floor(value / power)*power
  106.         end
  107.         self.size = self.size + 4
  108.         self.pos = self.pos + 4
  109.         return true
  110.     end
  111.  
  112.     function NetworkMessage:addU64(value)
  113.         if value >= U64 then
  114.             self:logDebug("Value is greater than " .. U64 .. ".")
  115.             return false
  116.         end
  117.        
  118.         for i=7,0,-1 do
  119.             local power = U8^i
  120.             self.data[self.pos + i] = math.floor(value / power)
  121.             value = value - math.floor(value / power)*power
  122.         end
  123.         self.size = self.size + 8
  124.         self.pos = self.pos + 8
  125.         return true
  126.     end
  127.    
  128.     function NetworkMessage:addString(value)
  129.         if not self:addU16(string.len(value)) then
  130.             self:logDebug("String length is bigger than " .. U16 .. ".")
  131.             return false
  132.         end
  133.        
  134.         local strLen = string.len(value)
  135.         for i=1,strLen do
  136.             self.data[self.pos + i-1] = string.byte(value, i)
  137.         end
  138.         self.pos = self.pos + strLen
  139.         self.size = self.size + strLen
  140.         return true
  141.     end
  142.  
  143.     function NetworkMessage:addData(data)
  144.         if type(data) == 'boolean' then
  145.             self:addU8(NetworkMessageTypes.Boolean)
  146.             self:addU8(booleantonumber(data))
  147.         elseif type(data) == 'number' then
  148.             if math.isu8(data) then
  149.                 self:addU8(NetworkMessageTypes.U8)
  150.                 self:addU8(data)
  151.             elseif math.isu16(data) then
  152.                 self:addU8(NetworkMessageTypes.U16)
  153.                 self:addU16(data)
  154.             elseif math.isu32(data) then
  155.                 self:addU8(NetworkMessageTypes.U32)
  156.                 self:addU32(data)
  157.             elseif math.isu64(data) then
  158.                 self:addU8(NetworkMessageTypes.U64)
  159.                 self:addU64(data)
  160.             else -- negative or non integer numbers
  161.                 self:addU8(NetworkMessageTypes.NumberString)
  162.                 self:addString(tostring(data))
  163.             end
  164.         elseif type(data) == 'string' then
  165.             self:addU8(NetworkMessageTypes.String)
  166.             self:addString(data)
  167.         elseif type(data) == 'table' then
  168.             self:addU8(NetworkMessageTypes.Table)
  169.             self:addTable(data)
  170.         else
  171.             self:logDebug('Invalid data type '  .. type(data))
  172.         end
  173.     end
  174.  
  175.     function NetworkMessage:addTable(data)
  176.         local size = 0
  177.  
  178.         -- reserve for size
  179.         local sizePos = self.pos
  180.         self:addU16(size)
  181.         local sizeSize = self.pos - sizePos
  182.  
  183.         -- add values
  184.         for key,value in pairs(data) do
  185.             self:addData(key)
  186.             self:addData(value)
  187.             size = size + 1
  188.         end
  189.  
  190.         -- write size
  191.         local currentPos = self.pos
  192.         self.pos = sizePos
  193.         self:addU16(size)
  194.  
  195.         -- fix msg size and go back to end
  196.         self.size = self.size - sizeSize
  197.         self.pos = currentPos
  198.     end
  199.  
  200.     function NetworkMessage:addColor(r, g, b, a)
  201.         self:addU8(r)
  202.         self:addU8(g)
  203.         self:addU8(b)
  204.         self:addU8(a)
  205.     end
  206.    
  207.     function NetworkMessage:getU8(peek)
  208.         if not self:canRead(1) then return false end
  209.         local ret = 0
  210.         for i=0,0 do ret = ret + (self.data[self.pos + i] * (U8^i)) end
  211.         if peek == nil then self.pos = self.pos + 1 end
  212.         return ret
  213.     end
  214.    
  215.     function NetworkMessage:getU16(peek)
  216.         if not self:canRead(2) then return false end
  217.         local ret = 0
  218.         for i=0,1 do ret = ret + (self.data[self.pos + i] * (U8^i)) end
  219.         if peek == nil then self.pos = self.pos + 2 end
  220.         return ret
  221.     end
  222.    
  223.     function NetworkMessage:getU32(peek)
  224.         if not self:canRead(4) then return false end
  225.         local ret = 0
  226.         for i=0,3 do ret = ret + (self.data[self.pos + i] * (U8^i)) end
  227.         if peek == nil then self.pos = self.pos + 4 end
  228.         return ret
  229.     end
  230.  
  231.     function NetworkMessage:getU64(peek)
  232.         if not self:canRead(4) then return false end
  233.         local ret = 0
  234.         for i=0,7 do ret = ret + (self.data[self.pos + i] * (U8^i)) end
  235.         if peek == nil then self.pos = self.pos + 8 end
  236.         return ret
  237.     end
  238.    
  239.     function NetworkMessage:getString()
  240.         local size = self:getU16()
  241.         if not size then
  242.             return false
  243.         end
  244.         if not self:canRead(size) then return false end
  245.        
  246.         local ret = ""
  247.         for i = 0, size-1 do
  248.             ret = ret .. string.char(self.data[self.pos + i])
  249.         end
  250.         self.pos = self.pos + size
  251.         return ret
  252.     end
  253.  
  254.     function NetworkMessage:getData()
  255.         local dataType = self:getU8()
  256.         if dataType == NetworkMessageTypes.Boolean then
  257.             return numbertoboolean(self:getU8())
  258.         elseif dataType == NetworkMessageTypes.U8 then
  259.             return self:getU8()
  260.         elseif dataType == NetworkMessageTypes.U16 then
  261.             return self:getU16()
  262.         elseif dataType == NetworkMessageTypes.U32 then
  263.             return self:getU32()
  264.         elseif dataType == NetworkMessageTypes.U64 then
  265.             return self:getU64()
  266.         elseif dataType == NetworkMessageTypes.NumberString then
  267.             return tonumber(self:getString())
  268.         elseif dataType == NetworkMessageTypes.String then
  269.             return self:getString()
  270.         elseif dataType == NetworkMessageTypes.Table then
  271.             return self:getTable()
  272.         else
  273.             self:logDebug('Unknown data type ' .. dataType)
  274.         end
  275.         return nil
  276.     end
  277.  
  278.     function NetworkMessage:getTable()
  279.         local ret = {}
  280.         local size = self:getU16()
  281.         for i=1,size do
  282.             local index = self:getData()
  283.             local value = self:getData()
  284.             ret[index] = value
  285.         end
  286.         return ret
  287.     end
  288.  
  289.     function NetworkMessage:getColor()
  290.         local r = self:getU8()
  291.         local g = self:getU8()
  292.         local b = self:getU8()
  293.         local a = self:getU8()
  294.         return r,g,b,a
  295.     end
  296.  
  297.     function NetworkMessage:canRead(size)
  298.         if self.pos+size > self.size then
  299.             self:logDebug("Message has reached end.")
  300.             return false
  301.         end
  302.         return true
  303.     end
  304. end
Add Comment
Please, Sign In to add comment