You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

102 lines
3.2 KiB

--@curseforge-project-slug: liblatency@
local LL = LibStub:NewLibrary("LibLatency", 2)
if not LL then return end -- No upgrade needed
-- Throttle times for separate channels
LL.throttleTable = LL.throttleTable or {
["RAID"] = 0,
["PARTY"] = 0,
["INSTANCE_CHAT"] = 0,
["GUILD"] = 0,
}
LL.throttleSendTable = LL.throttleSendTable or {
["RAID"] = 0,
["PARTY"] = 0,
["INSTANCE_CHAT"] = 0,
["GUILD"] = 0,
}
LL.callbackMap = LL.callbackMap or {}
LL.frame = LL.frame or CreateFrame("Frame")
local throttleTable = LL.throttleTable
local throttleSendTable = LL.throttleSendTable
local callbackMap = LL.callbackMap
local frame = LL.frame
local next, type, error, tonumber, format, match = next, type, error, tonumber, string.format, string.match
local Ambiguate, GetTime, GetNetStats, IsInGroup, IsInRaid = Ambiguate, GetTime, GetNetStats, IsInGroup, IsInRaid
local SendAddonMessage = C_ChatInfo.SendAddonMessage
local pName = UnitName("player")
C_ChatInfo.RegisterAddonMessagePrefix("Lag")
frame:SetScript("OnEvent", function(_, _, prefix, msg, channel, sender)
if prefix == "Lag" and throttleTable[channel] then
if msg == "R" then
local t = GetTime()
if t - throttleTable[channel] > 4 then
throttleTable[channel] = t
local _, _, latencyHome, latencyWorld = GetNetStats()
SendAddonMessage("Lag", format("%d,%d", latencyHome or 0, latencyWorld or 0), channel)
end
return
end
local latencyHome, latencyWorld = match(msg, "^(%d+),(%d+)$")
latencyHome = tonumber(latencyHome)
latencyWorld = tonumber(latencyWorld)
if latencyHome and latencyWorld then
for _,func in next, callbackMap do
func(latencyHome, latencyWorld, Ambiguate(sender, "none"), channel)
end
end
end
end)
frame:RegisterEvent("CHAT_MSG_ADDON")
-- For automatic group handling, don't pass a channel. The order is INSTANCE_CHAT > RAID > GROUP.
-- GUILD is not covered by auto handling.
function LL:RequestLatency(channel)
if channel and not throttleSendTable[channel] then
error("LibLatency: Incorrect channel type for :RequestLatency.")
else
if not channel and IsInGroup() then
channel = IsInGroup(2) and "INSTANCE_CHAT" or IsInRaid() and "RAID" or "PARTY"
end
local _, _, latencyHome, latencyWorld = GetNetStats()
for _,func in next, callbackMap do
func(latencyHome, latencyWorld, pName, channel) -- This allows us to show our own latency when not grouped
end
if channel then
local t = GetTime()
if t - throttleSendTable[channel] > 4 then
throttleSendTable[channel] = t
SendAddonMessage("Lag", "R", channel)
end
end
end
end
function LL:Register(addon, func)
if not addon or addon == LL then
error("LibLatency: You must pass your own addon name or object to :Register.")
end
local t = type(func)
if t == "string" then
callbackMap[addon] = function(...) addon[func](addon, ...) end
elseif t == "function" then
callbackMap[addon] = func
else
error("LibLatency: Incorrect function type for :Register.")
end
end
function LL:Unregister(addon)
if not addon or addon == LL then
error("LibLatency: You must pass your own addon name or object to :Unregister.")
end
callbackMap[addon] = nil
end