126 lines
3.4 KiB
Lua
126 lines
3.4 KiB
Lua
local Bridge = _G.HMGT_Bridge
|
|
if not Bridge then return end
|
|
|
|
local PREFIX = "BliZziIT"
|
|
local HEADER = "B1"
|
|
local SOURCE = "BliZzi_Interrupts"
|
|
|
|
local Adapter = {
|
|
key = SOURCE,
|
|
}
|
|
|
|
local frame = CreateFrame("Frame")
|
|
|
|
local function IsSecret(value)
|
|
return type(issecretvalue) == "function" and issecretvalue(value)
|
|
end
|
|
|
|
local function ParseMessage(message)
|
|
if IsSecret(message) then
|
|
return nil
|
|
end
|
|
|
|
local text = tostring(message or "")
|
|
if text == "" then
|
|
return nil
|
|
end
|
|
|
|
local parts = { strsplit(";", text) }
|
|
if parts[1] ~= HEADER then
|
|
return nil
|
|
end
|
|
|
|
return parts
|
|
end
|
|
|
|
local function NormalizeSender(sender)
|
|
if IsSecret(sender) then
|
|
return nil
|
|
end
|
|
|
|
local text = tostring(sender or "")
|
|
if text == "" then
|
|
return nil
|
|
end
|
|
if Ambiguate then
|
|
text = Ambiguate(text, "short")
|
|
end
|
|
return Bridge:NormalizePlayerName(text)
|
|
end
|
|
|
|
function Adapter:HandleHello(parts, senderName)
|
|
local class = tostring(parts[3] or "")
|
|
local spellId = tonumber(parts[4])
|
|
local cooldown = tonumber(parts[5])
|
|
if class == "" or not spellId or spellId <= 0 then
|
|
Bridge:RememberResult("known", false, "invalid_hello", tostring(senderName or ""))
|
|
return
|
|
end
|
|
Bridge:Count("hello")
|
|
Bridge:ApplyKnownSpell(SOURCE, senderName, spellId, class, cooldown)
|
|
end
|
|
|
|
function Adapter:HandleHelloSync(parts, senderName)
|
|
local class = tostring(parts[3] or "")
|
|
local specId = tonumber(parts[5])
|
|
if class == "" or not specId or specId <= 0 then
|
|
Bridge:RememberResult("spec", false, "invalid_hello_sync", tostring(senderName or ""))
|
|
return
|
|
end
|
|
Bridge:Count("helloSync")
|
|
Bridge:ApplySpecInfo(SOURCE, senderName, class, specId)
|
|
end
|
|
|
|
function Adapter:HandleKick(parts, senderName)
|
|
local spellId = tonumber(parts[3])
|
|
local cooldown = tonumber(parts[4])
|
|
if not spellId or spellId <= 0 or not cooldown or cooldown <= 0 then
|
|
Bridge:RememberResult("cooldown", false, "invalid_kick", tostring(senderName or ""))
|
|
return
|
|
end
|
|
Bridge:Count("kick")
|
|
Bridge:ApplyCooldown(SOURCE, senderName, spellId, cooldown)
|
|
end
|
|
|
|
function Adapter:OnAddonMessage(prefix, message, channel, sender)
|
|
if prefix ~= PREFIX then
|
|
return
|
|
end
|
|
Bridge:Count("received")
|
|
|
|
local senderName = NormalizeSender(sender)
|
|
if not senderName or senderName == Bridge:NormalizePlayerName(UnitName("player")) then
|
|
Bridge:RememberResult("message", false, "ignored_sender", tostring(sender or ""))
|
|
return
|
|
end
|
|
|
|
local parts = ParseMessage(message)
|
|
if not parts then
|
|
Bridge:RememberResult("message", false, "invalid_message", tostring(senderName or ""))
|
|
return
|
|
end
|
|
|
|
local command = tostring(parts[2] or "")
|
|
if command == "HELLO" then
|
|
self:HandleHello(parts, senderName)
|
|
elseif command == "HELLOSYNC" then
|
|
self:HandleHelloSync(parts, senderName)
|
|
elseif command == "KICK" then
|
|
self:HandleKick(parts, senderName)
|
|
end
|
|
end
|
|
|
|
function Adapter:Register()
|
|
if C_ChatInfo and type(C_ChatInfo.RegisterAddonMessagePrefix) == "function" then
|
|
pcall(C_ChatInfo.RegisterAddonMessagePrefix, PREFIX)
|
|
end
|
|
frame:RegisterEvent("CHAT_MSG_ADDON")
|
|
frame:RegisterEvent("CHAT_MSG_ADDON_LOGGED")
|
|
frame:SetScript("OnEvent", function(_, _, ...)
|
|
Adapter:OnAddonMessage(...)
|
|
end)
|
|
end
|
|
|
|
Bridge:RegisterAdapter(Adapter)
|
|
Adapter:Register()
|