Guest User

message

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