Files
wow_dechickenator/Dechickenator.lua
2024-12-21 10:58:25 +01:00

124 lines
4.1 KiB
Lua

local addonname, shared = ...
---@cast addonname string
---@class DechickenatorData
---@field alerts table<string, Alert>
---@alias auraType
---| 'BUFF'
---| 'DEBUFF'
--/dechicken a:Greater Blessing of Kings;B;R;e:spit;m:cuntfucker;c:SAY
--/dechicken a:Greater Blessing of Kings;B;R;e:spit;m:cuntfucker
--/dechicken a:Greater Blessing of Kings;R;e:spit;m:cuntfucker
--/dechicken a:Greater Blessing of Kings;B;R;m:cuntfucker
--/dechicken a:Greater Blessing of Kings;R
---@class Alert
---@field message string?
---@field channel string?
---@field channelData string?
---@field emote string?
---@field spellName string
---@field remove boolean?
--/run Dechickenator_Data = nil
if not Dechickenator_Data then Dechickenator_Data = {} end
if not Dechickenator_Data.alerts then Dechickenator_Data.alerts = {} end
local function init()
local cleuFrame = CreateFrame("Frame")
cleuFrame:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
cleuFrame:SetScript("OnEvent", function(self, event, ...)
local subevent = CLEUParser.GetSubevent(...)
if subevent == "SPELL_AURA_APPLIED" or subevent == "SPELL_AURA_REFRESH" then
local target = CLEUParser.GetDestName(...)
if target ~= UnitName("player") then return end
local spellName = CLEUParser.GetSpellName(...)
if not Dechickenator_Data.alerts[spellName] then return end
local source = CLEUParser.GetSourceName(...)
if Dechickenator_Data.alerts[spellName].message then
local msg = Dechickenator_Data.alerts[spellName].message
if string.find(msg, "%s") then
msg = string.format(msg, tostring(source))
end
local channel = "SAY"
if Dechickenator_Data.alerts[spellName].channel then
channel = Dechickenator_Data.alerts[spellName].channel
end
SendChatMessage(msg, channel)
end
if Dechickenator_Data.alerts[spellName].emote then
DoEmote(Dechickenator_Data.alerts[spellName].emote, source)
end
if Dechickenator_Data.alerts[spellName].remove then
CancelUnitBuff("player", spellName)
end
end
end)
print("Dechickenator loaded!")
end
local loadedFrame = CreateFrame("Frame")
loadedFrame:RegisterEvent("ADDON_LOADED")
loadedFrame:SetScript("OnEvent", function(self, event, addonName)
if addonName == addonname then
init()
end
end)
---@param table table
---@param depth number?
function DumpTable(table, depth)
if depth == nil then
depth = 0
end
if (depth > 200) then
print("Error: Depth > 200 in dumpTable()")
return
end
for k, v in pairs(table) do
if (type(v) == "table") then
print(string.rep(" ", depth) .. k .. ":")
DumpTable(v, depth + 1)
else
print(string.rep(" ", depth) .. k .. ": ", v)
end
end
end
SlashCmdList["DECHICKENATOR_TOGGLE_BLACKLISTED_BUFF"] = function(input)
local fields = { strsplit(";", input) }
---@type Alert
local aura = { spellName = "" }
for _, field in ipairs(fields) do
local data = { strsplit(":", field) }
local key = strtrim(data[1])
key = string.lower(key)
if key == "a" then
aura.spellName = strtrim(data[2])
elseif key == "e" then
aura.emote = strtrim(data[2])
elseif key == "m" then
aura.message = strtrim(data[2])
elseif key == "c" then
aura.channel = strtrim(data[2])
elseif key == "r" then
aura.remove = true
end
end
DumpTable(aura)
if aura.spellName ~= "" then
Dechickenator_Data.alerts[aura.spellName] = aura
end
end
SLASH_DECHICKENATOR_TOGGLE_BLACKLISTED_BUFF1 = "/dechicken"
SlashCmdList["DECHICKENATOR_SET_MESSAGE"] = function(input)
print("Setting message: " .. tostring(input))
Dechickenator_Data.message = input
print(Dechickenator_Data.message)
end
SLASH_DECHICKENATOR_SET_MESSAGE1 = "/dechicken_message"