local addonname, shared = ... ---@cast addonname string ---@class DechickenatorData ---@field alerts table ---@alias auraType ---| 'BUFF' ---| 'DEBUFF' --/dechicken a:Lifebloom;B;R;e:spit;m:cuntfucker;c:YELL --/dechicken a:Lifebloom;B;R;e:spit;m:cuntfucker --/dechicken a:Lifebloom;R;e:spit;m:cuntfucker --/dechicken a:Lifebloom;B;R;m:cuntfucker --/dechicken a:Lifebloom;B;R ---@class Alert ---@field message string? ---@field channel string? ---@field emote string? ---@field spellName string ---@field auraType 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 == "b" then aura.auraType = "BUFF" elseif key == "d" then aura.auraType = "DEBUFF" 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"