diff --git a/TradeSkillMaster_AuctionDB/Modules/ChannelSync.lua b/TradeSkillMaster_AuctionDB/Modules/ChannelSync.lua index 76604bf..6cfa6a8 100644 --- a/TradeSkillMaster_AuctionDB/Modules/ChannelSync.lua +++ b/TradeSkillMaster_AuctionDB/Modules/ChannelSync.lua @@ -104,24 +104,21 @@ local function DecodePayload(encoded) return payload end -function ChannelSync:BroadcastScanData(scanType) +function ChannelSync:BroadcastScanData(scanType, items) if scanType ~= "Full" and scanType ~= "GetAll" and scanType ~= "Group" and scanType ~= "Search" then return end if TSM.processingData then TSMAPI:CreateTimeDelay("auctionDBChannelSyncBroadcast", 0.5, function() - ChannelSync:BroadcastScanData(scanType) + ChannelSync:BroadcastScanData(scanType, items) end) return end EnsureChannel() if not private.channelName or not private.channelId then return end - TSM:Serialize() - local payload = { - scanTime = TSM.db.realm.lastCompleteScan, - scanData = TSM.db.realm.scanData, - } + local payload = ChannelSync:BuildPayload(scanType, items) + if not payload then return end local encoded = EncodePayload(payload) if not encoded then return end @@ -141,26 +138,93 @@ function ChannelSync:BroadcastScanData(scanType) end end +function ChannelSync:BuildPayload(scanType, items) + local itemIDs = {} + if items then + if #items > 0 then + for _, itemString in ipairs(items) do + local itemID = TSMAPI:GetItemID(itemString) + if itemID then + itemIDs[itemID] = true + end + end + else + for itemString in pairs(items) do + local itemID = TSMAPI:GetItemID(itemString) + if itemID then + itemIDs[itemID] = true + end + end + end + else + local scanTime = TSM.db.realm.lastCompleteScan + for itemID in pairs(TSM.data) do + TSM:DecodeItemData(itemID) + if TSM.data[itemID].lastScan == scanTime then + itemIDs[itemID] = true + end + end + end + + local payloadItems = {} + for itemID in pairs(itemIDs) do + local data = TSM.data[itemID] + if data then + TSM:EncodeItemData(itemID) + if data.encoded then + payloadItems[itemID] = data.encoded + end + end + end + if not next(payloadItems) then return end + + return { + v = 1, + scanType = scanType, + scanTime = TSM.db.realm.lastCompleteScan, + items = payloadItems, + } +end + +local function DecodeIncomingItem(itemID, encoded) + local tmp = {} + tmp[itemID] = {encoded = encoded} + TSM:DecodeItemData(itemID, tmp) + return tmp[itemID] +end + local function MergeIncomingData(payload, sender) - if type(payload) ~= "table" or type(payload.scanData) ~= "string" then return end + if type(payload) ~= "table" then return end local incoming = {} - TSM:Deserialize(payload.scanData, incoming, true) + if payload.items then + incoming = payload.items + elseif type(payload.scanData) == "string" then + TSM:Deserialize(payload.scanData, incoming, true) + else + return + end local updated = 0 local lastItemID for itemID, data in pairs(incoming) do - local existing = TSM.data[itemID] - if existing then - TSM:DecodeItemData(itemID) - if data.lastScan and (not existing.lastScan or data.lastScan > existing.lastScan) then - TSM.data[itemID] = data + local incomingData = data + if payload.items then + incomingData = DecodeIncomingItem(itemID, data) + end + if incomingData then + local existing = TSM.data[itemID] + if existing then + TSM:DecodeItemData(itemID) + if incomingData.lastScan and (not existing.lastScan or incomingData.lastScan > existing.lastScan) then + TSM.data[itemID] = incomingData + updated = updated + 1 + lastItemID = itemID + end + else + TSM.data[itemID] = incomingData updated = updated + 1 lastItemID = itemID end - else - TSM.data[itemID] = data - updated = updated + 1 - lastItemID = itemID end end diff --git a/TradeSkillMaster_AuctionDB/Modules/Scanning.lua b/TradeSkillMaster_AuctionDB/Modules/Scanning.lua index 353a86b..ae60f55 100644 --- a/TradeSkillMaster_AuctionDB/Modules/Scanning.lua +++ b/TradeSkillMaster_AuctionDB/Modules/Scanning.lua @@ -580,7 +580,7 @@ function Scan:ProcessScanData(scanData) -- Process the collected auction data. TSM.Data:ProcessData(data, Scan.groupItems, verifyNewAlgorithm) if TSM.ChannelSync then - TSM.ChannelSync:BroadcastScanData(Scan.isScanning) + TSM.ChannelSync:BroadcastScanData(Scan.isScanning, Scan.groupItems) end end diff --git a/TradeSkillMaster_AuctionDB/Modules/data.lua b/TradeSkillMaster_AuctionDB/Modules/data.lua index 2430ea3..36b9656 100644 --- a/TradeSkillMaster_AuctionDB/Modules/data.lua +++ b/TradeSkillMaster_AuctionDB/Modules/data.lua @@ -171,7 +171,7 @@ function Data:ProcessExternalScanData(scanData, groupItems, scanTime) if not next(data) then return end Data:ProcessData(data, groupSet, nil, scanTime or time(), true) if TSM.ChannelSync then - TSM.ChannelSync:BroadcastScanData("Search") + TSM.ChannelSync:BroadcastScanData("Search", groupSet) end end