local addonname, shared = ... ---@cast addonname string ---@class shared ---@field timer number? shared = { timer = nil } ---@class DechickenatorData ---@field alerts table ---@alias auraType ---| 'BUFF' ---| 'DEBUFF' --/dechicken a:Greater Blessing of Kings;R;e:spit;m:cuntfucker %s;c:SAY --/dechicken a:Greater Blessing of Kings;R;e:spit;m:cuntfucker --/dechicken a:Greater Blessing of Kings;R;e:spit;m:cuntfucker --/dechicken a:Greater Blessing of Kings;R;m:cuntfucker --/dechicken a:Turkey Feathers;R;e:laugh ---@class Alert ---@field message string? ---@field channel string? ---@field channelData string? ---@field emote string? ---@field spellName string ---@field remove boolean? --/run Dechickenator_Data = {alerts={}} if not Dechickenator_Data then Dechickenator_Data = {} end if not Dechickenator_Data.alerts then Dechickenator_Data.alerts = {} end local function init() local function RemoveBuff(buff) if UnitAffectingCombat("player") then return end CancelUnitBuff("player", buff) end local function RemoveBuffs() if UnitAffectingCombat("player") then return end for buff, enabled in pairs(Dechickenator_Data.alerts) do if enabled then RemoveBuff(buff) end end end if not shared.timer then shared.timer = C_Timer.NewTicker(1, function() RemoveBuffs() end) end 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 RemoveBuff(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"