Quantcast

Improvements to the inspect module

Peter Eliasson [01-18-15 - 13:01]
Improvements to the inspect module

- Unset cached inspect data for players when they change spec.
- Increased the time before invalidating cached entries, as the timeout is now only for item level changes (since spec changes are now hopefully registered when they happen)
- Waiting untill OnEnable before setting the player GUID, should fix #2.
Filename
src/inspect.lua
diff --git a/src/inspect.lua b/src/inspect.lua
index dce5075..91df3b1 100644
--- a/src/inspect.lua
+++ b/src/inspect.lua
@@ -10,19 +10,24 @@ local addon = addonTable[1];
 local inspect = addon:NewModule("inspect", "AceEvent-3.0", "AceTimer-3.0")
 addon.inspect = inspect;

--- Constants
-local INSPECT_CACHE_TIMEOUT = 900;
+-- How many seconds before a cached inspect is considered invalid.
+local INSPECT_CACHE_TIMEOUT = 60*60;
+
 local INVENTORY_SLOT_NAMES = {
 	"HeadSlot","NeckSlot","ShoulderSlot","BackSlot","ChestSlot","WristSlot",
 	"HandsSlot","WaistSlot","LegsSlot","FeetSlot","Finger0Slot","Finger1Slot",
 	"Trinket0Slot","Trinket1Slot","MainHandSlot","SecondaryHandSlot"
 }
+
 local NOOP = function() end

-local playerGUID = UnitGUID("player");
-local inspectCache = {};
+-- UnitGUID("player") seems to not always be available here,
+-- so PLAYER_GUID is set in OnEnable.
+local PLAYER_GUID = nil;


+local inspectCache = {};
+

 local function isInPVEInstance()
 	local isInstance, instanceType = IsInInstance();
@@ -88,6 +93,10 @@ local function hasPlayerInspectCache(playerId, ignoreExpired)
 	end
 end

+local function unsetPlayerInspectCache(playerId)
+	inspectCache[playerId] = nil;
+end
+
 local function setPlayerInspectCache(playerId, specName, itemLevel)
 	inspectCache[playerId] = {};
 	inspectCache[playerId].time = GetTime();
@@ -126,7 +135,7 @@ function inspect:QueueInspect(player, callback)
 end

 function inspect:SetCachedInspectDataForPlayer(player)
-	if player.id == playerGUID then
+	if player.id == PLAYER_GUID then
 		player.specName = getTalentSpec("player")
 		player.itemLevel = getItemLevel("player");
 		return true
@@ -205,7 +214,7 @@ function inspect:PreInspectGroup()
 		if playerName and addon:IsInMyGuild(playerName) then

 			local playerId = UnitGUID(playerName)
-			if playerId and playerId ~= playerGUID and not hasPlayerInspectCache(playerId) then
+			if playerId and playerId ~= PLAYER_GUID and not hasPlayerInspectCache(playerId) then
 				local player = {name=playerName, id=playerId}
 				self:QueueInspect(player, NOOP);
 			end
@@ -252,7 +261,16 @@ function inspect:ZONE_CHANGED_NEW_AREA(evt)
 	end
 end

+function inspect:PLAYER_SPECIALIZATION_CHANGED(evt, unitId)
+	if unitId ~= "player" then
+		local playerId = UnitGUID(unitId);
+		unsetPlayerInspectCache(playerId);
+	end
+end
+
 function inspect:OnEnable()
+	PLAYER_GUID = UnitGUID("player");
+
 	inspect.inspectQueue = {};
 	inspect.notifyInspectTimer = nil;
 	inspect.currentInspectPlayerId = nil;
@@ -260,12 +278,14 @@ function inspect:OnEnable()
 	self:RegisterEvent("INSPECT_READY");
 	self:RegisterEvent("GROUP_ROSTER_UPDATE");
 	self:RegisterEvent("ZONE_CHANGED_NEW_AREA");
+	self:RegisterEvent("PLAYER_SPECIALIZATION_CHANGED");
 end

 function inspect:OnDisable()
 	self:UnregisterEvent("INSPECT_READY");
 	self:UnregisterEvent("GROUP_ROSTER_UPDATE");
 	self:UnregisterEvent("ZONE_CHANGED_NEW_AREA");
+	self:UnregisterEvent("PLAYER_SPECIALIZATION_CHANGED");

 	self:StopNotifyInspectTimer();