-
Notifications
You must be signed in to change notification settings - Fork 3
/
modules.lua
218 lines (181 loc) · 5.51 KB
/
modules.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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
local addonName, PermoksAccountManager = ...
PermoksAccountManager.isBC = WOW_PROJECT_ID == WOW_PROJECT_WRATH_CLASSIC
local ModuleMixin = {}
function ModuleMixin:Init(moduleName, payload)
self.name = moduleName
self.events = payload.events
self.share = payload.share
self.update = payload.update
self.payload = payload
self.forceLabelUpdate = {}
self.labelFunctions = {}
self.labelArgs = {}
end
---Adds a custom label type
---@param customType string
---@param callback function
---@param alwaysForceUpdate boolean
---@param ... string
function ModuleMixin:AddCustomLabelType(customType, callback, alwaysForceUpdate, ...)
-- additional varargs can be any table present in altData
if self.labelFunctions[customType] then
PermoksAccountManager:Print(string.format('[%s] - Custom Type [%s] already exists.', self.name, customType))
return
end
self.forceLabelUpdate[customType] = alwaysForceUpdate
self.labelFunctions[customType] = {callback = callback, args = {...}}
self.labelArgs[customType] = {}
end
function ModuleMixin:GenerateLabelArgs(altData, labelType, update)
if not labelType or not altData then
return
end
local labelArgKey = altData.guid or altData.name
if self.labelArgs[labelType][labelArgKey] and not self.forceLabelUpdate[labelType] and not update then
return self.labelArgs[labelType][labelArgKey]
end
local args = {}
for _, key in ipairs(self.labelFunctions[labelType].args) do
if altData[key] then
tinsert(args, altData[key])
end
end
self.labelArgs[labelType][labelArgKey] = args
return args
end
local modules = {}
local enums = {}
local events = {}
local functions = {}
local modulesEventFrame = CreateFrame('Frame')
local currentCharInfo
local function SetEventScript(charInfo)
if not charInfo then
return
end
if not currentCharInfo then
currentCharInfo = charInfo
end
modulesEventFrame:SetScript(
'OnEvent',
function(self, event, ...)
if functions[event] then
--if not charInfo then PermoksAccountManager:Debug("CharInfo is not loaded yet") return end
functions[event](charInfo, ...)
end
end
)
end
local function AddLabelRows(module, rows)
if not rows then
return
end
for row_identifier, row in pairs(rows) do
if row.version == false or row.version == WOW_PROJECT_ID then
PermoksAccountManager.labelRows[row_identifier] = row
if enums[row_identifier] then
PermoksAccountManager:Print('Please use another identifier for', module.name, row_identifier, '. Module', enums[row_identifier].name, 'already uses it.')
else
enums[row_identifier] = module
end
end
end
end
local function RegisterModuleEvent(event)
if functions[event] then
return
end
functions[event] = function(charInfo, ...)
for func, shareKey in pairs(events[event]) do
func(charInfo, ...)
if shareKey then
PermoksAccountManager:SendCharacterUpdate(shareKey)
end
end
end
pcall(
function()
modulesEventFrame:RegisterEvent(event)
end
)
end
local function AddEvents(moduleEvents, share)
if not moduleEvents then
return
end
for event, v in pairs(moduleEvents) do
events[event] = events[event] or {}
if type(v) == 'table' then
for _, func in pairs(v) do
events[event][func] = share and share[func] or false
end
else
events[event][v] = share and share[v] or false
end
RegisterModuleEvent(event)
end
end
local function CreateNewModule(moduleName, payload)
local module = CreateAndInitFromMixin(ModuleMixin, moduleName, payload)
return module
end
function PermoksAccountManager:AddModule(moduleName, payload, load)
if type(payload) ~= 'table' then
self:Print(moduleName, ' - Payload is not a table')
return
end
if modules[moduleName] then
self:Print('Module', moduleName, 'already exists.')
return
end
local module = CreateNewModule(moduleName, payload)
modules[moduleName] = module
AddLabelRows(module, payload.labels)
if load then
self:LoadModule(module)
end
return module
end
function PermoksAccountManager:GetPAMModule(moduleName)
if modules[moduleName] then
return modules[moduleName], currentCharInfo
end
end
function PermoksAccountManager:LoadAllModules(charInfo)
for moduleName, module in pairs(modules) do
self:LoadModule(moduleName, module)
end
SetEventScript(charInfo)
end
function PermoksAccountManager:LoadModule(moduleName, module)
if not modules[moduleName] then
return
end
AddEvents(module.events, module.share)
if self.charInfo then
module.update(self.charInfo)
end
end
function PermoksAccountManager:GetModuleForRow(row_identifier)
return enums[row_identifier]
end
function PermoksAccountManager:IterateAccModules()
local m = {}
for k in pairs(modules) do
tinsert(m, k)
end
local index = 0
return function()
index = index + 1
if m[index] then
return m[index], modules[m[index]]
end
end
end
function PermoksAccountManager:PrintRegisteredEvents()
local e = {}
for event in pairs(events) do
tinsert(e, event)
end
self:Print(table.concat(e, ', '))
end