diff --git a/Database/QuestieDB.lua b/Database/QuestieDB.lua index aead24e..a617ace 100644 --- a/Database/QuestieDB.lua +++ b/Database/QuestieDB.lua @@ -129,6 +129,10 @@ end QuestieDB.private.GetLearnerSpawnTable = GetSpawnTable QuestieDB.private.NormalizeLearnerSpawnEntry = NormalizeLearnerSpawnEntry +QuestieDB.private.missingQuestLog = QuestieDB.private.missingQuestLog or {} +QuestieDB.private.missingNpcLog = QuestieDB.private.missingNpcLog or {} +QuestieDB.private.missingObjectLog = QuestieDB.private.missingObjectLog or {} +QuestieDB.private.missingItemLog = QuestieDB.private.missingItemLog or {} local function _MergeOverride(result, override, rawdata, keyMap) for stringKey, intKey in pairs(keyMap) do @@ -680,7 +684,10 @@ function QuestieDB:GetObject(objectId) end if not rawdata and not override then - Questie:Debug(Questie.DEBUG_CRITICAL, "[QuestieDB:GetObject] data not found for objectID:", objectId) + if not QuestieDB.private.missingObjectLog[objectId] then + QuestieDB.private.missingObjectLog[objectId] = true + Questie:Debug(Questie.DEBUG_INFO, "[QuestieDB:GetObject] data not found for objectID:", objectId) + end return nil end @@ -740,7 +747,10 @@ function QuestieDB:GetItem(itemId) end if not rawdata and not override then - Questie:Debug(Questie.DEBUG_CRITICAL, "[QuestieDB:GetItem] data not found for itemID:", itemId) + if not QuestieDB.private.missingItemLog[itemId] then + QuestieDB.private.missingItemLog[itemId] = true + Questie:Debug(Questie.DEBUG_INFO, "[QuestieDB:GetItem] data not found for itemID:", itemId) + end return nil end @@ -1628,7 +1638,10 @@ function QuestieDB.GetQuest(questId, ...) -- /dump QuestieDB.GetQuest(867) if (not rawdata) then rawdata = overrideData if (not rawdata) then - Questie:Debug(Questie.DEBUG_CRITICAL, "[QuestieDB.GetQuest] rawdata is nil for questID:", questId) + if not QuestieDB.private.missingQuestLog[questId] then + QuestieDB.private.missingQuestLog[questId] = true + Questie:Debug(Questie.DEBUG_INFO, "[QuestieDB.GetQuest] rawdata is nil for questID:", questId) + end if questId == 0 then Questie:Error("[QuestieDB.GetQuest] rawdata is nil for questID:", questId) end @@ -2243,7 +2256,10 @@ function QuestieDB:GetNPC(npcId) end if not rawdata and not override then - Questie:Debug(Questie.DEBUG_CRITICAL, "[QuestieDB:GetNPC] data not found for npcID:", npcId) + if not QuestieDB.private.missingNpcLog[npcId] then + QuestieDB.private.missingNpcLog[npcId] = true + Questie:Debug(Questie.DEBUG_INFO, "[QuestieDB:GetNPC] data not found for npcID:", npcId) + end return nil end diff --git a/Tests/QuestieLearnerDataSourceMode_spec.lua b/Tests/QuestieLearnerDataSourceMode_spec.lua index 00adefb..b44e5ab 100644 --- a/Tests/QuestieLearnerDataSourceMode_spec.lua +++ b/Tests/QuestieLearnerDataSourceMode_spec.lua @@ -242,6 +242,74 @@ describe("QuestieDB quest build guards missing objective tables", function() end) end) +describe("QuestieDB missing quest logs are deduplicated", function() + local originalImport + local originalDebug + local originalQueryQuest + + before_each(function() + dofile("Tests/wow_api_mock.lua") + + local questieLib = { + GetTbcLevel = function() + return 1, 1 + end, + } + local questieCorrections = { + hiddenQuests = {}, + killCreditObjectiveFirst = {}, + } + + originalImport = QuestieLoader.ImportModule + QuestieLoader.ImportModule = function(self, name) + if name == "QuestieLib" then + return questieLib + end + if name == "QuestieCorrections" then + return questieCorrections + end + return originalImport(self, name) + end + + dofile("Database/QuestieDB.lua") + dofile("Database/questDB.lua") + + QuestieDB.private.questCache = {} + QuestieDB.private.missingQuestLog = {} + + originalDebug = Questie.Debug + Questie.Debug = function(self, level, ...) + _G._questie_debug_calls = (_G._questie_debug_calls or 0) + 1 + end + + originalQueryQuest = QuestieDB.QueryQuest + QuestieDB.QueryQuest = function() + return nil + end + end) + + after_each(function() + if originalQueryQuest then + QuestieDB.QueryQuest = originalQueryQuest + end + if originalDebug then + Questie.Debug = originalDebug + end + if originalImport then + QuestieLoader.ImportModule = originalImport + end + _G._questie_debug_calls = nil + end) + + it("logs a missing quest only once per quest id", function() + local questId = 900002 + + assert.is_nil(QuestieDB:GetQuest(questId)) + assert.is_nil(QuestieDB:GetQuest(questId)) + assert.equals(1, _G._questie_debug_calls) + end) +end) + describe("QuestieLearner quest accept resolution", function() local QuestieLearner local originalGetNumQuestLogEntries