Quantcast

GetItemInfo now throws an error if it's not ready.

Salvatore Lopiparo [07-25-16 - 03:21]
GetItemInfo now throws an error if it's not ready.
Filename
code.lua
database.lua
diff --git a/code.lua b/code.lua
index 80b32ea..07baebc 100644
--- a/code.lua
+++ b/code.lua
@@ -288,6 +288,14 @@ CanIMogIt.cachedTooltipText = nil;
 -----------------------------


+function CanIMogIt:GetItemInfo(itemLink)
+	-- Calls GetItemInfo, but raises an error if it fails.
+	local result = {GetItemInfo(itemLink)}
+	if not result[1] then error("Waiting on GetItemInfo") end
+	return unpack(result)
+end
+
+
 function CanIMogIt:GetAppearances()
 	-- Gets a table of all the appearances known to a character.
 	C_TransmogCollection.ClearSearch()
@@ -311,24 +319,24 @@ end


 function CanIMogIt:IsItemArmor(itemLink)
-	return GetItemClassInfo(4) == select(6, GetItemInfo(itemLink))
+	return GetItemClassInfo(4) == select(6, CanIMogIt:GetItemInfo(itemLink))
 end


 function CanIMogIt:IsArmorSubClass(subClass, itemLink)
-	return select(1, GetItemSubClassInfo(4, subClass)) == select(7, GetItemInfo(itemLink))
+	return select(1, GetItemSubClassInfo(4, subClass)) == select(7, CanIMogIt:GetItemInfo(itemLink))
 end


 function CanIMogIt:IsArmorSubClassIdentical(itemLinkA, itemLinkB)
-	return select(7, GetItemInfo(itemLinkA)) == select(7, GetItemInfo(itemLinkB))
+	return select(7, CanIMogIt:GetItemInfo(itemLinkA)) == select(7, CanIMogIt:GetItemInfo(itemLinkB))
 end


 function CanIMogIt:IsArmorAppropriateForPlayer(itemLink)
 	local playerArmorTypeID = CanIMogIt:GetPlayerArmorTypeName()
 	if armorTypeSlots[CanIMogIt:GetSlotName(itemLink)] and not CanIMogIt:IsArmorSubClass(COSMETIC, itemLink) then
-		return playerArmorTypeID == select(7, GetItemInfo(itemLink))
+		return playerArmorTypeID == select(7, CanIMogIt:GetItemInfo(itemLink))
 	else
 		return true
 	end
@@ -336,7 +344,7 @@ end


 function CanIMogIt:GetSlotName(itemLink)
-	return select(9, GetItemInfo(itemLink))
+	return select(9, CanIMogIt:GetItemInfo(itemLink))
 end


@@ -365,7 +373,7 @@ end


 function CanIMogIt:CharacterIsTooLowLevelForItem(itemLink)
-	local minLevel = select(5, GetItemInfo(itemLink))
+	local minLevel = select(5, CanIMogIt:GetItemInfo(itemLink))
 	return UnitLevel("player") < minLevel
 end

@@ -457,7 +465,7 @@ end

 function CanIMogIt:GetQuality(itemID)
 	-- Returns the quality of the item.
-	return select(3, GetItemInfo(itemID))
+	return select(3, CanIMogIt:GetItemInfo(itemID))
 end


@@ -503,7 +511,7 @@ end


 function CanIMogIt:GetItemLink(itemID)
-	return select(2, GetItemInfo(itemID))
+	return select(2, CanIMogIt:GetItemInfo(itemID))
 end


@@ -573,14 +581,17 @@ local function addToTooltip(tooltip, itemLink)
 	-- if CanIMogIt.cachedItemLink ~= itemLink then
 	-- 	print("itemLink changed! " .. itemLink)
 	-- end
-	local itemInfo = GetItemInfo(itemLink)
+	local itemInfo = CanIMogIt:GetItemInfo(itemLink)
 	if not itemInfo then
 		CanIMogIt.cachedItemLink = nil
 		CanIMogIt.cachedTooltipText = nil
 		return
 	end
+
+	local ok;
 	if CanIMogItOptions["debug"] then
-		printDebug(CanIMogIt.tooltip, itemLink)
+		ok = pcall(printDebug, CanIMogIt.tooltip, itemLink)
+		if not ok then return end
 	end

 	local text;
@@ -588,7 +599,8 @@ local function addToTooltip(tooltip, itemLink)
 	if itemLink == CanIMogIt.cachedItemLink then
 		text = CanIMogIt.cachedTooltipText
 	else
-		text = CanIMogIt:GetTooltipText(itemLink)
+		ok, text = pcall(CanIMogIt.GetTooltipText, CanIMogIt, itemLink)
+		if not ok then return end
 		-- Save the cached item and text, so it's faster next time.
 		CanIMogIt.cachedItemLink = itemLink
 		CanIMogIt.cachedTooltipText = text
diff --git a/database.lua b/database.lua
index 0a8bfd8..1cf3fb1 100644
--- a/database.lua
+++ b/database.lua
@@ -19,6 +19,13 @@ CanIMogIt.sourceIDQueue = {}
 local getItemInfoReceivedCount = 0


+local function tablelength(T)
+    local count = 0
+    for _ in pairs(T) do count = count + 1 end
+    return count
+end
+
+
 function Database:AddItem(itemLink, appearanceID)
     --[[
         Adds the given itemLink to the database. Returns whether it was added or not.
@@ -162,31 +169,7 @@ function Database:UpdateItem(itemLink, hasTransmogFromItem)
 end


-function CanIMogIt.frame:PlayerLogin(event, ...)
-    if event == "PLAYER_LOGIN" then
-        -- add all known appearanceID's to the database
-        Database:UpdateAppearances()
-    end
-end
-
-
-function CanIMogIt.frame:TransmogCollectionUpdated(event, ...)
-    if event == "TRANSMOG_COLLECTION_UPDATED" then
-        -- add the equipment slot that was changed to the database
-        Database:UpdateAppearances()
-    end
-end
-
-
-local function tablelength(T)
-    local count = 0
-    for _ in pairs(T) do count = count + 1 end
-    return count
-end
-
-
-function CanIMogIt.frame:GetItemInfoReceived(event, ...)
-    if event ~= "GET_ITEM_INFO_RECEIVED" then return end
+function Database:GetItemInfoReceived()
     if next(CanIMogIt.sourceIDQueue) == nil then return end
     -- Update the database with any items that were still cooking.
     getItemInfoReceivedCount = getItemInfoReceivedCount + 1
@@ -206,3 +189,25 @@ function CanIMogIt.frame:GetItemInfoReceived(event, ...)
         end
     end
 end
+
+
+function CanIMogIt.frame:PlayerLogin(event, ...)
+    if event == "PLAYER_LOGIN" then
+        -- add all known appearanceID's to the database
+        Database:UpdateAppearances()
+    end
+end
+
+
+function CanIMogIt.frame:TransmogCollectionUpdated(event, ...)
+    if event == "TRANSMOG_COLLECTION_UPDATED" then
+        -- add the equipment slot that was changed to the database
+        Database:UpdateAppearances()
+    end
+end
+
+
+function CanIMogIt.frame:GetItemInfoReceived(event, ...)
+    if event ~= "GET_ITEM_INFO_RECEIVED" then return end
+    Database:GetItemInfoReceived()
+end