forked from Ostoic/RaidBrowser
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathevent.lua
56 lines (46 loc) · 1.35 KB
/
event.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
local registry = {}
local frame = CreateFrame('Frame')
local function printf(...) print(format(...)) end
local function script_error(type, err)
local name, line, msg = err:match('%[string (".-")%]:(%d+): (.*)')
printf('%s error%s:\n %s', type, name and format(' in %s at line %d', name, line, msg) or '', err)
end
local function UnregisterOrphanedEvent(event)
if not next(registry[event]) then
registry[event] = nil
frame:UnregisterEvent(event)
end
end
local function OnEvent(...)
local _, event = ...
for listener, val in pairs(registry[event]) do
-- try-catch
local success, rv = pcall(listener[1], listener[2], select(2, ...))
if rv then
if not success then script_error('event callback', rv) end
end
end
UnregisterOrphanedEvent(event)
end
frame:SetScript('OnEvent', OnEvent)
-- INTERFACE
---@param event string
---@param callback function
---@param userparam any|nil
---@return table
function RaidBrowser.add_event_listener(event, callback, userparam)
assert(callback, 'invalid callback')
if not registry[event] then
registry[event] = {}
frame:RegisterEvent(event)
end
local listener = { callback, userparam }
registry[event][listener] = true
return listener
end
---@param event string
---@param listener table
function RaidBrowser.remove_event_listener(event, listener)
registry[event][listener] = nil
UnregisterOrphanedEvent(event)
end