Skip to content

Commit f8b7c0c

Browse files
author
Björn Ritzl
committed
Added direct message handling capability to broadcast
1 parent 19ff2ab commit f8b7c0c

File tree

1 file changed

+73
-13
lines changed

1 file changed

+73
-13
lines changed

ludobits/m/broadcast.lua

+73-13
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,43 @@
11
--- Module to simplify sending a message to multiple receivers
2-
local listener = require "ludobits.m.listener"
2+
--
3+
-- @usage
4+
--
5+
-- -- script_a.script
6+
--
7+
-- local broadcast = require "ludobits.m.listener"
8+
--
9+
-- function init(self)
10+
-- broadcast.register("foo")
11+
-- broadcast.register("bar", function(message, sender)
12+
-- -- handle message
13+
-- end)
14+
-- end
15+
--
16+
-- function final(self)
17+
-- broadcast.unregister("foo")
18+
-- broadcast.unregister("bar")
19+
-- end
20+
--
21+
-- function on_message(self, message_id, message, sender)
22+
-- if broadcast.on_message(message_id, message, sender) then
23+
-- -- message was handled
24+
-- return
25+
-- end
26+
-- if message_id == hash("foo") then
27+
-- -- handle message "foo"
28+
-- end
29+
-- end
30+
--
31+
--
32+
-- -- script_b.script
33+
--
34+
-- local broadcast = require "ludobits.m.listener"
35+
--
36+
-- function update(self, dt)
37+
-- if some condition then
38+
-- broadcast.send("foo")
39+
-- end
40+
-- end
341

442
local M = {}
543

@@ -17,34 +55,56 @@ function M.send(message_id, message)
1755
local key = ensure_hash(message_id)
1856
if receivers[key] then
1957
message = message or {}
20-
receivers[key].trigger(message_id, message)
58+
for url,_ in pairs(receivers[key]) do
59+
msg.post(url, message_id, message)
60+
end
2161
end
2262
end
2363

2464
--- Register the current script as a receiver for a specific message
2565
-- @param message_id
26-
-- @param url_or_fn Optional URL or function to register. Defaults to the
27-
-- current script url
28-
function M.register(message_id, url_or_fn)
66+
-- @param on_message_handler Optional message handler function to call
67+
-- when a message is received. The function will receive the message
68+
-- and sender as it's arguments. You must call @{on_message} for this
69+
-- to work
70+
function M.register(message_id, on_message_handler)
2971
assert(message_id)
30-
url_or_fn = url_or_fn or msg.url()
3172
local key = ensure_hash(message_id)
32-
receivers[key] = receivers[key] or listener.create()
33-
receivers[key].add(url_or_fn)
73+
receivers[key] = receivers[key] or {}
74+
receivers[key][msg.url()] = on_message_handler or true
3475
end
3576

3677
--- Unregister the current script from receiving a previously registered message
3778
-- @param message_id
38-
-- @param url_or_fn Optional URL or function to unregister. Defaults to the current
39-
-- script url
40-
function M.unregister(message_id, url_or_fn)
79+
function M.unregister(message_id)
4180
assert(message_id)
42-
url_or_fn = url_or_fn or msg.url()
4381
local key = ensure_hash(message_id)
4482
if receivers[key] then
45-
receivers[key].remove(url_or_fn)
83+
receivers[key][msg.url()] = nil
4684
end
4785
end
4886

87+
--- Forward received messages in scripts where the broadcast module is used and where
88+
-- registered messages have also provide a message handler function. If no message
89+
-- handler functions are used then there is no need to call this function.
90+
-- @param message_id
91+
-- @param message
92+
-- @param sender
93+
function M.on_message(message_id, message, sender)
94+
local message_receivers = receivers[message_id]
95+
if not message_receivers then
96+
return false
97+
end
98+
local message_receiver = message_receivers[msg.url()]
99+
if not message_receiver then
100+
return false
101+
end
102+
if message_receiver == true then
103+
return false
104+
end
105+
message_receiver(message, sender)
106+
return true
107+
end
108+
49109

50110
return M

0 commit comments

Comments
 (0)