Bastion aims to serve as a highly performant, simplisitic, and expandable World of Warcraft data visualization framework.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Bastion/src/EventManager/EventManager.lua

128 lines
3.4 KiB

---@type Tinkr, Bastion
local Tinkr, Bastion = ...
-- Create an EventManager class
---@class EventManager
---@field frame Frame
---@field events table<string, { [number]: fun(...) }>
---@field eventHandlers table<string, { [number]: fun(...) }>
---@field wowEventHandlers table<string, { [number]: fun(...) }>
---@field selfCLEUHandlers table<string, { [number]: fun(...) }>
local EventManager = {
events = {},
eventHandlers = {},
wowEventHandlers = {},
frame = nil,
}
EventManager.__index = EventManager
-- Constructor
---@return EventManager
function EventManager:New()
local self = setmetatable({}, EventManager)
self.events = {}
self.eventHandlers = {}
self.wowEventHandlers = {}
self.selfCLEUHandlers = {}
-- Frame for wow events
self.frame = CreateFrame("Frame")
self.frame:SetScript("OnEvent", function(f, event, ...)
if self.wowEventHandlers[event] then
for _, callback in ipairs(self.wowEventHandlers[event]) do
callback(...)
end
end
end)
self:RegisterWoWEvent("COMBAT_LOG_EVENT_UNFILTERED", function(event)
self:CLEUHandler(event, CombatLogGetCurrentEventInfo())
end)
return self
end
-- Register an event
---@param event string
---@param handler fun(...)
---@return nil
function EventManager:RegisterEvent(event, handler)
if not self.events[event] then
self.events[event] = {}
end
table.insert(self.events[event], handler)
end
-- Register a wow event
---@param event string | string[]
---@param handler fun(...)
---@return nil
function EventManager:RegisterWoWEvent(event, handler)
if type(event) == "table" then
for _, e in ipairs(event) do
if not self.wowEventHandlers[e] then
self.wowEventHandlers[e] = {}
self.frame:RegisterEvent(e)
end
table.insert(self.wowEventHandlers[e], handler)
end
else
if not self.wowEventHandlers[event] then
self.wowEventHandlers[event] = {}
self.frame:RegisterEvent(event)
end
table.insert(self.wowEventHandlers[event], handler)
end
end
-- Trigger an event
---@param event string
---@param ... any
---@return nil
function EventManager:TriggerEvent(event, ...)
if self.events[event] then
for _, handler in pairs(self.events[event]) do
handler(...)
end
end
end
---@param subevent string | string[]
---@param handler fun(...)
function EventManager:RegisterSelfCLEUEvent(subevent, handler)
if type(subevent) == "table" then
for _, e in ipairs(subevent) do
if not self.selfCLEUHandlers[e] then
self.selfCLEUHandlers[e] = {}
end
table.insert(self.selfCLEUHandlers[e], handler)
end
else
if not self.selfCLEUHandlers[subevent] then
self.selfCLEUHandlers[subevent] = {}
end
table.insert(self.selfCLEUHandlers[subevent], handler)
end
end
---@param event "COMBAT_LOG_EVENT_UNFILTERED"
---@param timestamp number
---@param subevent string
---@param ... any
function EventManager:CLEUHandler(event, timestamp, subevent, ...)
if self.selfCLEUHandlers[subevent] then
if select(2, ...) == UnitGUID("player") then
for _, handler in pairs(self.selfCLEUHandlers[subevent]) do
handler(timestamp, subevent, ...)
end
end
end
end
return EventManager