Skip to content

Commit

Permalink
Added direct message handling capability to broadcast
Browse files Browse the repository at this point in the history
  • Loading branch information
Björn Ritzl committed Sep 18, 2016
1 parent 19ff2ab commit f8b7c0c
Showing 1 changed file with 73 additions and 13 deletions.
86 changes: 73 additions & 13 deletions ludobits/m/broadcast.lua
Original file line number Diff line number Diff line change
@@ -1,5 +1,43 @@
--- Module to simplify sending a message to multiple receivers
local listener = require "ludobits.m.listener"
--
-- @usage
--
-- -- script_a.script
--
-- local broadcast = require "ludobits.m.listener"
--
-- function init(self)
-- broadcast.register("foo")
-- broadcast.register("bar", function(message, sender)
-- -- handle message
-- end)
-- end
--
-- function final(self)
-- broadcast.unregister("foo")
-- broadcast.unregister("bar")
-- end
--
-- function on_message(self, message_id, message, sender)
-- if broadcast.on_message(message_id, message, sender) then
-- -- message was handled
-- return
-- end
-- if message_id == hash("foo") then
-- -- handle message "foo"
-- end
-- end
--
--
-- -- script_b.script
--
-- local broadcast = require "ludobits.m.listener"
--
-- function update(self, dt)
-- if some condition then
-- broadcast.send("foo")
-- end
-- end

local M = {}

Expand All @@ -17,34 +55,56 @@ function M.send(message_id, message)
local key = ensure_hash(message_id)
if receivers[key] then
message = message or {}
receivers[key].trigger(message_id, message)
for url,_ in pairs(receivers[key]) do
msg.post(url, message_id, message)
end
end
end

--- Register the current script as a receiver for a specific message
-- @param message_id
-- @param url_or_fn Optional URL or function to register. Defaults to the
-- current script url
function M.register(message_id, url_or_fn)
-- @param on_message_handler Optional message handler function to call
-- when a message is received. The function will receive the message
-- and sender as it's arguments. You must call @{on_message} for this
-- to work
function M.register(message_id, on_message_handler)
assert(message_id)
url_or_fn = url_or_fn or msg.url()
local key = ensure_hash(message_id)
receivers[key] = receivers[key] or listener.create()
receivers[key].add(url_or_fn)
receivers[key] = receivers[key] or {}
receivers[key][msg.url()] = on_message_handler or true
end

--- Unregister the current script from receiving a previously registered message
-- @param message_id
-- @param url_or_fn Optional URL or function to unregister. Defaults to the current
-- script url
function M.unregister(message_id, url_or_fn)
function M.unregister(message_id)
assert(message_id)
url_or_fn = url_or_fn or msg.url()
local key = ensure_hash(message_id)
if receivers[key] then
receivers[key].remove(url_or_fn)
receivers[key][msg.url()] = nil
end
end

--- Forward received messages in scripts where the broadcast module is used and where
-- registered messages have also provide a message handler function. If no message
-- handler functions are used then there is no need to call this function.
-- @param message_id
-- @param message
-- @param sender
function M.on_message(message_id, message, sender)
local message_receivers = receivers[message_id]
if not message_receivers then
return false
end
local message_receiver = message_receivers[msg.url()]
if not message_receiver then
return false
end
if message_receiver == true then
return false
end
message_receiver(message, sender)
return true
end


return M

0 comments on commit f8b7c0c

Please sign in to comment.