From efff9329fafa6826c8a10eb9195add814750cacc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lien=20Sell=C3=A6g?= Date: Sun, 8 Feb 2026 02:15:57 +0100 Subject: [PATCH] Add AuctionDB channel sync options and controls. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 💘 Generated with Crush Assisted-by: GPT-5.2-Codex via Crush --- TradeSkillMaster_AuctionDB/Locale/enUS.lua | 11 +++ .../Modules/ChannelSync.lua | 67 +++++++++++++------ TradeSkillMaster_AuctionDB/Modules/config.lua | 62 +++++++++++++++++ .../TradeSkillMaster_AuctionDB.lua | 4 ++ 4 files changed, 125 insertions(+), 19 deletions(-) diff --git a/TradeSkillMaster_AuctionDB/Locale/enUS.lua b/TradeSkillMaster_AuctionDB/Locale/enUS.lua index 0287988..5c95b55 100644 --- a/TradeSkillMaster_AuctionDB/Locale/enUS.lua +++ b/TradeSkillMaster_AuctionDB/Locale/enUS.lua @@ -23,12 +23,20 @@ L["AuctionDB - Market Value"] = true L["AuctionDB - Minimum Buyout"] = true L["Descending"] = true L["Display lowest buyout value seen in the last scan in tooltip."] = true +L["Channel Sync"] = true +L["Channel sync name"] = true L["Display market value in tooltip."] = true +L["Enable channel sync"] = true L["Done Scanning"] = true L["Download the FREE TSM desktop application which will automatically update your TSM_AuctionDB prices using Blizzard's online APIs (and does MUCH more). Visit %s for more info and never scan the AH again! This is the best way to update your AuctionDB prices."] = true +L["Enable channel sync debug messages"] = true L["Enable display of AuctionDB data in tooltip."] = true +L["The channel name used to share AuctionDB data."] = true L["Hide poor quality items"] = true L["If checked, AuctionDB will add a tab to the AH to allow for in-game scans. If you are using the TSM app exclusively for your scans, you may want to hide it by unchecking this option. This option requires a reload to take effect."] = true +L["If checked, AuctionDB will print channel sync debug messages to chat."] = true +L["If checked, AuctionDB will sync scan data over the configured channel."] = true +L["If checked, AuctionDB will only receive channel sync data and will not broadcast scan data."] = true L["If checked, poor quality items won't be shown in the search results."] = true L["If checked, the lowest buyout value seen in the last scan of the item will be displayed."] = true L["If checked, the market value of the item will be displayed"] = true @@ -66,6 +74,9 @@ L["Refreshes the current search results."] = true L["Removed %s from AuctionDB."] = true L["Reset Data"] = true L["Resets AuctionDB's scan data"] = true +L["Reset"] = true +L["Resets the channel name to the default."] = true +L["Receive-only mode"] = true L["Resume"] = true L["Resuming Scan..."] = true L["Result Order:"] = true diff --git a/TradeSkillMaster_AuctionDB/Modules/ChannelSync.lua b/TradeSkillMaster_AuctionDB/Modules/ChannelSync.lua index 98af052..af624e0 100644 --- a/TradeSkillMaster_AuctionDB/Modules/ChannelSync.lua +++ b/TradeSkillMaster_AuctionDB/Modules/ChannelSync.lua @@ -12,7 +12,14 @@ local TSM = select(2, ...) local ChannelSync = TSM:NewModule("ChannelSync", "AceEvent-3.0") local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_AuctionDB") -local CHANNEL_NAME = "TSM_AuctionDB" +local DEFAULT_CHANNEL_NAME = "TSM_AuctionDB" + +local function GetChannelConfigName() + if TSM.db and TSM.db.profile and TSM.db.profile.channelSyncName and TSM.db.profile.channelSyncName ~= "" then + return TSM.db.profile.channelSyncName + end + return DEFAULT_CHANNEL_NAME +end local COMM_PREFIX = "TSMADB1" local CHUNK_SIZE = 220 local BUNDLE_TIMEOUT = 45 @@ -36,7 +43,6 @@ local strbyte = string.byte local libS = LibStub:GetLibrary("AceSerializer-3.0") local libD = LibStub("LibDeflate", true) local warnedNoDeflate -local debugEnabled = true local function GetAddonVersion() local version = GetAddOnMetadata("TradeSkillMaster_AuctionDB", "X-Curse-Packaged-Version") @@ -59,7 +65,7 @@ private.addonVersion = GetAddonVersion() private.addonVersionKey = VersionKey(private.addonVersion) local function DebugPrint(msg) - if debugEnabled then + if TSM.db and TSM.db.profile and TSM.db.profile.channelSyncDebug then TSM:Print("ChannelSync: " .. msg) end end @@ -82,13 +88,24 @@ local function HashString(str) end local function EnsureChannel() - local channelId = GetChannelName(CHANNEL_NAME) + if private.channelId and private.channelName and private.channelName ~= GetChannelConfigName() then + LeaveChannelByName(private.channelName) + private.channelId = nil + private.channelName = nil + end + if not TSM.db or not TSM.db.profile or not TSM.db.profile.channelSyncEnabled then + private.channelId = nil + private.channelName = nil + return + end + local channelName = GetChannelConfigName() + local channelId = GetChannelName(channelName) if channelId == 0 then - JoinChannelByName(CHANNEL_NAME) - channelId = GetChannelName(CHANNEL_NAME) + JoinChannelByName(channelName) + channelId = GetChannelName(channelName) end private.channelId = channelId > 0 and channelId or nil - private.channelName = private.channelId and CHANNEL_NAME or nil + private.channelName = private.channelId and channelName or nil end local function GetChannelDisplayName(channelName, channelString, channelNumber, channelBaseName) @@ -111,8 +128,9 @@ local function GetChannelDisplayName(channelName, channelString, channelNumber, end local function ChatFilter(_, _, msg, _, channelString, _, channelNumber, channelName, channelBaseName) + local channelNameKey = GetChannelConfigName() local displayName = GetChannelDisplayName(channelName, channelString, channelNumber, channelBaseName) - if displayName ~= CHANNEL_NAME then return end + if displayName ~= channelNameKey then return end if strsub(msg, 1, #COMM_PREFIX) == COMM_PREFIX then return true end @@ -136,6 +154,10 @@ function ChannelSync:OnChannelNotice() EnsureChannel() end +function ChannelSync:ReloadConfig() + EnsureChannel() +end + local function EncodePayload(payload) if not CanEncode() then return end local serialized = libS:Serialize(payload) @@ -192,6 +214,8 @@ function ChannelSync:BroadcastScanData(scanType, items) return end EnsureChannel() + if not TSM.db or not TSM.db.profile or not TSM.db.profile.channelSyncEnabled then return end + if TSM.db.profile.channelSyncReceiveOnly then return end if not private.channelName or not private.channelId then return end local itemIDs = ChannelSync:CollectItemIDs(items) @@ -199,10 +223,10 @@ function ChannelSync:BroadcastScanData(scanType, items) local function QueueEncoded(encoded) local hash = HashString(encoded) - if hash == private.lastBroadcastHash then return end - private.lastBroadcastHash = hash - local total = ceil(#encoded / CHUNK_SIZE) - if total > MAX_TOTAL_CHUNKS then return false end + if hash == private.lastBroadcastHash then return end + private.lastBroadcastHash = hash + local total = ceil(#encoded / CHUNK_SIZE) + if total > MAX_TOTAL_CHUNKS then return false end tinsert(private.sendQueue, {hash = hash, encoded = encoded, total = total}) if not private.isSending then private.isSending = true @@ -228,7 +252,9 @@ function ChannelSync:BroadcastScanData(scanType, items) return end if total > MAX_TOTAL_CHUNKS then - TSM:Print("AuctionDB channel sync payload too large; skipping batch.") + if TSM.db and TSM.db.profile and TSM.db.profile.channelSyncDebug then + TSM:Print("AuctionDB channel sync payload too large; skipping batch.") + end return end QueueEncoded(encoded) @@ -349,18 +375,21 @@ local function MergeIncomingData(payload, sender) if updated == 0 and sender then DebugPrint("No items updated from " .. sender .. ".") elseif updated > 0 and sender then - if updated == 1 and lastItemID then - local link = select(2, GetItemInfo(lastItemID)) or ("item:" .. tostring(lastItemID)) - TSM:Printf("AuctionDB updated %s from %s.", link, sender) - else - TSM:Printf("AuctionDB updated %d items from %s.", updated, sender) + if TSM.db and TSM.db.profile and TSM.db.profile.channelSyncDebug then + if updated == 1 and lastItemID then + local link = select(2, GetItemInfo(lastItemID)) or ("item:" .. tostring(lastItemID)) + TSM:Printf("AuctionDB updated %s from %s.", link, sender) + else + TSM:Printf("AuctionDB updated %d items from %s.", updated, sender) + end end end end function ChannelSync:OnChannelMessage(_, msg, source, _, channelString, _, channelNumber, channelName, channelBaseName) + local channelNameKey = GetChannelConfigName() local displayName = GetChannelDisplayName(channelName, channelString, channelNumber, channelBaseName) - if displayName ~= CHANNEL_NAME then + if displayName ~= channelNameKey then if strsub(msg or "", 1, #COMM_PREFIX) == COMM_PREFIX then DebugPrint("Prefix received; displayName=" .. tostring(displayName) .. " channelNumber=" .. tostring(channelNumber) .. " channelString=" .. tostring(channelString) .. " channelName=" .. tostring(channelName) .. " channelBaseName=" .. tostring(channelBaseName)) end diff --git a/TradeSkillMaster_AuctionDB/Modules/config.lua b/TradeSkillMaster_AuctionDB/Modules/config.lua index 80907b8..2dbe952 100644 --- a/TradeSkillMaster_AuctionDB/Modules/config.lua +++ b/TradeSkillMaster_AuctionDB/Modules/config.lua @@ -392,6 +392,68 @@ function Config:LoadOptions(container) }, }, }, + { + type = "InlineGroup", + title = L["Channel Sync"], + layout = "Flow", + children = { + { + type = "CheckBox", + label = L["Enable channel sync"], + settingInfo = { TSM.db.profile, "channelSyncEnabled" }, + relativeWidth = 1, + callback = function() TSM.ChannelSync:ReloadConfig() container:ReloadTab() end, + tooltip = L["If checked, AuctionDB will sync scan data over the configured channel."], + }, + { + type = "EditBox", + label = L["Channel sync name"], + settingInfo = { TSM.db.profile, "channelSyncName" }, + relativeWidth = 0.5, + disabled = not TSM.db.profile.channelSyncEnabled, + callback = function(_, _, value) + value = strtrim(value or "") + if value == "" then + TSM.db.profile.channelSyncName = "TSM_AuctionDB" + else + TSM.db.profile.channelSyncName = value + end + TSM.ChannelSync:ReloadConfig() + container:ReloadTab() + end, + tooltip = L["The channel name used to share AuctionDB data."], + }, + { + type = "Button", + text = L["Reset"], + relativeWidth = 0.2, + disabled = not TSM.db.profile.channelSyncEnabled, + callback = function() + TSM.db.profile.channelSyncName = "TSM_AuctionDB" + TSM.ChannelSync:ReloadConfig() + container:ReloadTab() + end, + tooltip = L["Resets the channel name to the default."], + }, + { + type = "CheckBox", + label = L["Receive-only mode"], + settingInfo = { TSM.db.profile, "channelSyncReceiveOnly" }, + relativeWidth = 1, + disabled = not TSM.db.profile.channelSyncEnabled, + callback = function() TSM.ChannelSync:ReloadConfig() end, + tooltip = L["If checked, AuctionDB will only receive channel sync data and will not broadcast scan data."], + }, + { + type = "CheckBox", + label = L["Enable channel sync debug messages"], + settingInfo = { TSM.db.profile, "channelSyncDebug" }, + relativeWidth = 1, + disabled = not TSM.db.profile.channelSyncEnabled, + tooltip = L["If checked, AuctionDB will print channel sync debug messages to chat."], + }, + }, + }, { type = "InlineGroup", title = L["Search Options"], diff --git a/TradeSkillMaster_AuctionDB/TradeSkillMaster_AuctionDB.lua b/TradeSkillMaster_AuctionDB/TradeSkillMaster_AuctionDB.lua index 85dd00f..c702983 100644 --- a/TradeSkillMaster_AuctionDB/TradeSkillMaster_AuctionDB.lua +++ b/TradeSkillMaster_AuctionDB/TradeSkillMaster_AuctionDB.lua @@ -36,6 +36,10 @@ local savedDBDefaults = { marketValueTooltip = true, minBuyoutTooltip = true, showAHTab = true, + channelSyncEnabled = true, + channelSyncName = "TSM_AuctionDB", + channelSyncReceiveOnly = false, + channelSyncDebug = false, }, }