MattiasBuelens

MCNet message

Jun 8th, 2012
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --[[
  2.  
  3.     Minecraft Intranet
  4.     Messages and addresses
  5.  
  6. --]]
  7.  
  8. mcnet = mcnet or {}
  9. local message = mcnet.message or {}
  10. mcnet.message = message
  11. local address = mcnet.address or {}
  12. mcnet.address = address
  13.  
  14. --[[
  15.  
  16.     Message
  17.  
  18. --]]
  19.  
  20. local Message = common.newClass{
  21.     from = nil,
  22.     to = nil,
  23.     type = "",
  24.     data = nil
  25. }
  26.  
  27. function message.new(o)
  28.     return Message:new(o)
  29. end
  30.  
  31. function message.pack(msg)
  32.     assert(type(msg) == "table", "invalid message object")
  33.     msg = common.clone(msg)
  34.  
  35.     if (type(msg.from) == "table") then
  36.         msg.from = address.format(msg.from)
  37.     end
  38.  
  39.     if (type(msg.to) == "table") then
  40.         msg.to = address.format(msg.to)
  41.     end
  42.  
  43.     return msg
  44. end
  45.  
  46. function Message:pack()
  47.     return message.pack(self)
  48. end
  49.  
  50. function message.serialize(msg)
  51.     return common.serialize(message.pack(msg))
  52. end
  53.  
  54. function Message:serialize()
  55.     return message.serialize(self)
  56. end
  57.  
  58. function message.unpack(msg)
  59.     if (type(msg) ~= "table") then
  60.         -- Invalid message
  61.         return nil
  62.     end
  63.  
  64.     msg = common.clone(msg)
  65.  
  66.     if (msg.from ~= nil) then
  67.         msg.from = address.parse(msg.from)
  68.     end    
  69.  
  70.     if (msg.to ~= nil) then
  71.         msg.to = address.parse(msg.to)
  72.     end
  73.  
  74.     return message.new(msg)
  75. end
  76.  
  77. function message.unserialize(msg)
  78.     if type(msg) == "string" then
  79.         msg = textutils.unserialize(msg)
  80.     end
  81.  
  82.     return message.unpack(msg)
  83. end
  84.  
  85. function message.send(receiverId, msg, bWaitUntilPortOpen)
  86.     if type(msg) ~= "string" then
  87.         msg = message.serialize(msg)
  88.     end
  89.  
  90.     return rednet.send(receiverId, msg, bWaitUntilPortOpen)
  91. end
  92.  
  93. function message.broadcast(msg, bWaitUntilPortOpen)
  94.     return message.send(nil, msg, bWaitUntilPortOpen)
  95. end
  96.  
  97. --[[
  98.  
  99.     Address
  100.  
  101. --]]
  102.  
  103. local Address = common.newClass{
  104.     localPart = "",
  105.     domainPart = ""
  106. }
  107.  
  108. function address.new(o)
  109.     return Address:new(o)
  110. end
  111.  
  112. function address.parse(addr)
  113.     assert(type(addr) == "string", "invalid address string")
  114.  
  115.     local i, j, localPart, domainPart = string.find(addr, "^([^@]+)@(.+)$")
  116.  
  117.     if(i ~= nil) then
  118.         return address.new{
  119.             localPart = localPart,
  120.             domainPart = domainPart
  121.         }
  122.     end
  123.  
  124.     return address.new()
  125. end
  126.  
  127. function address.format(addr)
  128.     assert(type(addr) == "table", "invalid address object")
  129.     return address.new(addr):format(self)
  130. end
  131.  
  132. function Address:format()
  133.     return string.format("%s@%s", self.localPart, self.domainPart)
  134. end
Advertisement
Add Comment
Please, Sign In to add comment