-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMacroManager.lua
More file actions
100 lines (83 loc) · 2.83 KB
/
Copy pathMacroManager.lua
File metadata and controls
100 lines (83 loc) · 2.83 KB
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
-- MacroManager.lua
local _, ns = ...
local MacroManager = ns.MacroManager
local Commands = ns.Commands
-- WoW API
local CreateMacro = CreateMacro
local EditMacro = EditMacro
local GetMacroInfo = GetMacroInfo
local GetSpellName = C_Spell.GetSpellName
local GetItemInfo = C_Item.GetItemInfo
local UnitClass = UnitClass
-- local variables
NUM_CHARACTER_MACROS = 18
FIRST_CHARACTER_MACRO_INDEX = 121
function MacroManager:ReplaceSpellIDs(macroBody)
local expandedMacroBody = macroBody:gsub("%%spell:(%d+)%%", function(spellID)
local spellName = GetSpellName(tonumber(spellID))
return spellName or "UnknownSpell"
end)
expandedMacroBody = expandedMacroBody:gsub("%%item:(%d+)%%", function(itemID)
local itemName = GetItemInfo(tonumber(itemID))
return itemName or "UnknownItem"
end)
return expandedMacroBody
end
function MacroManager:EnsureMacroExists(macro)
if InCombatLockdown() then
ns.Log:Error(ns.L["ERR_IN_COMBAT"] or "Cannot manage macros in combat.")
return
end
local localizedBody = self:ReplaceSpellIDs(macro.body)
local macroIndex = self:FindCharacterMacro(macro.name)
if macroIndex == 0 then
CreateMacro(macro.name, macro.icon, localizedBody, true)
ns.Log:Debug(ns.L["MACRO_CREATED"]:format(macro.name))
else
EditMacro(macroIndex, macro.name, macro.icon, localizedBody)
ns.Log:Debug(ns.L["MACRO_UPDATED"]:format(macro.name))
end
end
function MacroManager:FindCharacterMacro(macroName)
for i = 1, NUM_CHARACTER_MACROS do
local macroIndex = i + FIRST_CHARACTER_MACRO_INDEX - 1
local name = GetMacroInfo(macroIndex)
if name == macroName then
return macroIndex
end
end
return 0
end
function MacroManager:GetTemplates(playerClass)
local templates = ns.MacroTemplates or {}
return templates[playerClass] or nil
end
MacroManager.subcommands = {
["init"] = function()
local _, playerClass = UnitClass("player")
ns.Log:Message(ns.L["CLASS_DETECTED"]:format(playerClass))
local macroGenerator = MacroManager:GetTemplates(playerClass)
if macroGenerator then
local queue = ns.TaskQueue:New(5)
local macros = macroGenerator()
for _, macro in ipairs(macros) do
queue:AddTask(function()
MacroManager:EnsureMacroExists(macro)
end)
end
queue:Run()
else
ns.Log:Warning(ns.L["NO_MACROS_DEFINED"]:format(playerClass))
end
end
}
Commands["macro"] = function(subcommand)
local func = MacroManager.subcommands[subcommand]
if type(func) ~= "function" then
return
end
local success, err = pcall(func)
if not success then
ns.Log:Debug("Command execution error: " .. err)
end
end