From 7d22e2f73061ee1d88cf9f5edccc259a2fd9a8c0 Mon Sep 17 00:00:00 2001 From: Daniel Yates Date: Tue, 7 May 2024 11:38:41 +0100 Subject: [PATCH] Route all messages through ChatThrottleLib (#50) * Route all messages through ChatThrottleLib This removes all internal management of internal transmission queues, leaving Chomp as a wrapper that really just provides "smart" routing with the worst implementation of message serialization known to mankind. The upstream CTL library has at this point merged in all the support required for sending logged messages. Battle.net message support is still pending but queued up. One thing that we still provide for now is an increase to CTL's ancient, outdated, and totally crappy default transmission rates. Hopefully we can just get newer happy values upstreamed at some point, but that might be a bit of an ask in the face of all the other major changes made to appease Blizzard's new per-prefix throttles. --- .luacheckrc | 39 ++---- CTLCompat.lua | 105 ---------------- Chomp.xml | 1 - Internal.lua | 236 ++---------------------------------- Public.lua | 322 ++++++-------------------------------------------- 5 files changed, 61 insertions(+), 642 deletions(-) delete mode 100644 CTLCompat.lua diff --git a/.luacheckrc b/.luacheckrc index babd499..d0aa59c 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -15,7 +15,9 @@ std = "lua51" globals = { "__chomp_internal", "AddOn_Chomp", - "ChatThrottleLib", + "ChatThrottleLib.MSG_OVERHEAD", + "ChatThrottleLib.BURST", + "ChatThrottleLib.MAX_CPS", } read_globals = { @@ -26,53 +28,39 @@ read_globals = { "LibStub.GetLibrary", "LibStub.NewLibrary", + -- ChatThrottleLib + "ChatThrottleLib.BNSendGameData", + "ChatThrottleLib.Enqueue", + "ChatThrottleLib.SendAddonMessage", + "ChatThrottleLib.SendAddonMessageLogged", + "ChatThrottleLib.SendChatMessage", + -- Global APIs "Ambiguate", "bit.band", "bit.bor", "BNET_CLIENT_WOW", "BNFeaturesEnabledAndConnected", - "BNGetFriendGameAccountInfo", - "BNGetGameAccountInfo", - "BNGetNumFriendGameAccounts", "BNGetNumFriends", "BNSendGameData", - "BNSendWhisper", "C_BattleNet.GetFriendGameAccountInfo", "C_BattleNet.GetFriendNumGameAccounts", "C_BattleNet.GetGameAccountInfoByID", - "C_ChatInfo", - "C_Club", - "C_ReportSystem.CanReportPlayer", - "C_ReportSystem.OpenReportPlayerDialog", - "C_Timer.After", - "C_Timer.NewTicker", - "CallErrorHandler", + "C_ChatInfo.IsAddonMessagePrefixRegistered", + "C_ChatInfo.RegisterAddonMessagePrefix", "ChatFrame_AddMessageEventFilter", - "CopyValuesAsKeys", "CreateFrame", - "CreateFromMixins", - "DoublyLinkedListMixin", - "Enum.SendAddonMessageResult", "ERR_CHAT_PLAYER_NOT_FOUND_S", "FULL_PLAYER_NAME", "GetAutoCompleteRealms", "GetNetStats", - "GetPlayerInfoByGUID", "GetRealmName", "GetTime", "hooksecurefunc", - "InCombatLockdown", - "IsInGroup", - "IsInRaid", "IsLoggedIn", "LE_PARTY_CATEGORY_HOME", - "LE_PARTY_CATEGORY_INSTANCE", "LE_REALM_RELATION_COALESCED", - "Mixin", - "PLAYER_REPORT_TYPE_LANGUAGE", - "PlayerLocationMixin", - "SendChatMessage", + "securecallfunction", "strcmputf8i", "string.join", "string.split", @@ -85,7 +73,6 @@ read_globals = { "UnitName", "UnitRealmRelationship", "UNKNOWNOBJECT", - "wipe", "WOW_PROJECT_ID", "WOW_PROJECT_MAINLINE", } diff --git a/CTLCompat.lua b/CTLCompat.lua deleted file mode 100644 index 404ed31..0000000 --- a/CTLCompat.lua +++ /dev/null @@ -1,105 +0,0 @@ ---[[ - © Justin Snelgrove - - Permission to use, copy, modify, and distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - -- - - Portions of this file are copied directly from ChatThrottleLib (v23) by - mikk, which was released into the public domain. -]] - -local Chomp = LibStub:GetLibrary("Chomp", true) -local Internal = Chomp and Chomp.Internal or nil - -if not Chomp or not Internal or not Internal.LOADING then - return -end - --- The following code provides a compatibility layer for addons using --- ChatThrottleLib. It won't load (and Chomp will feed messages into CTL) if --- there's a newer version of CTL loaded than this layer is compatible with, or --- if a newer version is loaded after Chomp. This can cause some weird things --- to happen if someone decides to LoadOnDemand a newer copy of ChatThrottleLib, --- but that will hopefully be vanishingly rare. - -local CTL_VERSION = 24 - -local PRIORITY_FROM_CTL = { BULK = "LOW", NORMAL = "MEDIUM", ALERT = "HIGH" } - -if ChatThrottleLib and not ChatThrottleLib.isChomp and ChatThrottleLib.version > CTL_VERSION then - Internal.ChatThrottleLib = true - return -end - -if type(ChatThrottleLib) ~= "table" then - ChatThrottleLib = {} -else - setmetatable(ChatThrottleLib, nil) -end -ChatThrottleLib.version = nil -- Handled in metatable. -ChatThrottleLib.isChomp = true - -function ChatThrottleLib:SendAddonMessage(priorityName, prefix, text, kind, target, queueName, callback, callbackArg) - if not priorityName or not prefix or not text or not kind or not PRIORITY_FROM_CTL[priorityName] then - error("Usage: ChatThrottleLib:SendAddonMessage(\"{BULK||NORMAL||ALERT}\", \"prefix\", \"text\", \"chattype\"[, \"target\"])", 2) - elseif callback and type(callback) ~= "function" then - error("ChatThrottleLib:SendAddonMessage(): callback: expected function, got " .. type(callback), 2) - elseif #text > 255 then - error("ChatThrottleLib:SendAddonMessage(): message length cannot exceed 255 bytes", 2) - end - if kind == "CHANNEL" then - target = tonumber(target) - end - Chomp.SendAddonMessage(prefix, text, kind, target, PRIORITY_FROM_CTL[priorityName], queueName or ("%s%s%s"):format(prefix, kind, (tostring(target) or "")), callback, callbackArg) -end - -function ChatThrottleLib:SendChatMessage(priorityName, prefix, text, kind, language, target, queueName, callback, callbackArg) - if not priorityName or not prefix or not text or not PRIORITY_FROM_CTL[priorityName] then - error("Usage: ChatThrottleLib:SendChatMessage(\"{BULK||NORMAL||ALERT}\", \"prefix\", \"text\"[, \"chattype\"[, \"language\"[, \"destination\"]]]", 2) - elseif callback and type(callback) ~= "function" then - error("ChatThrottleLib:SendChatMessage(): callback: expected function, got " .. type(callback), 2) - elseif #text > 255 then - error("ChatThrottleLib:SendChatMessage(): message length cannot exceed 255 bytes", 2) - end - if kind == "CHANNEL" then - target = tonumber(target) - end - Chomp.SendChatMessage(text, kind, language, target, PRIORITY_FROM_CTL[priorityName], queueName or ("%s%s%s"):format(prefix, (kind or "SAY"), (tostring(target) or "")), callback, callbackArg) -end - -function ChatThrottleLib.Hook_SendAddonMessage() -end -ChatThrottleLib.Hook_SendChatMessage = ChatThrottleLib.Hook_SendAddonMessage - --- This metatable catches changes to the CTL version, in case of a newer --- version of CTL replacing this compatibility layer. -setmetatable(ChatThrottleLib, { - __index = function(self, key) - if key == "version" then - return CTL_VERSION - elseif key == "securelyHooked" then - return true - end - end, - __newindex = function(self, key, value) - if key == "version" then - self.isChomp = nil - Internal.ChatThrottleLib = true - setmetatable(self, nil) - end - rawset(self, key, value) - end, -}) - -Internal.ChatThrottleLib = nil diff --git a/Chomp.xml b/Chomp.xml index e6a964b..2e65c03 100644 --- a/Chomp.xml +++ b/Chomp.xml @@ -2,7 +2,6 @@ -