diff ObjectiveTracker/Achievements.lua @ 34:9856ebc63fa4

- half solution to Update being fired multiple times during load - change securefunc handlers to dispense a reason code; catch that reason code in the enclosure passed to hooksecurefunc, and decide whether to update or not from there.
author Nenue
date Sun, 17 Apr 2016 00:21:45 -0400
parents 7583684becf4
children 69d03f8e293e
line wrap: on
line diff
--- a/ObjectiveTracker/Achievements.lua	Fri Apr 15 17:01:06 2016 -0400
+++ b/ObjectiveTracker/Achievements.lua	Sun Apr 17 00:21:45 2016 -0400
@@ -21,46 +21,63 @@
   Cheevs.trackedCheevs = {GetTrackedAchievements()}
   return GetNumTrackedAchievements()
 end
-Cheevs.GetInfo = function(self, index)
-  local cheevID = Cheevs.trackedCheevs[index]
+Cheevs.GetInfo = function(self, watchIndex)
+  --- step 1: confirm primary data and begin an entry if needed
+  local cheevID = Cheevs.trackedCheevs[watchIndex]
   local id, name, points, completed, month, day, year, description, flags, icon, rewardText, isGuildAch, wasEarnedByMe, earnedBy = GetAchievementInfo(cheevID)
+  if not id then return false end
 
-  self.Info[cheevID] = {}
+  if not self.Info[cheevID] then self.Info[cheevID] = {} end
   local c = self.Info[cheevID]
+  local numObjectives = GetAchievementNumCriteria(cheevID)
+
+  local tagInfo = {}
+  local objectives = c.objectives or {}
+  for i = 1, numObjectives do
+    local description, type, completed, quantity, requiredQuantity, characterName, flags, assetID, quantityString, criteriaID = GetAchievementCriteriaInfo(cheevID, i)
+    local line = objectives[i] or {}
+    line.objectiveIndex = i
+    line.cheevID = cheevID
+    line.text = description
+    line.type = type
+    line.finished = completed
+    line.value = quantity
+    line.maxValue = requiredQuantity
+    line.characterName = characterName
+    line.flags = flags
+    line.assetID = assetID
+    line.quantityString = quantityString
+    line.criteriaID = criteriaID
+    objectives[i] = line
+  end
+
+
+  local rewards = {}
+  print('Cheevs.|cFF0088FFGetInfo|r('..watchIndex..')', 'obj:', GetAchievementNumCriteria(cheevID), name, description)
+
+  c.rewardInfo = rewards
+  c.numObjectives = numObjectives
+  c.objectives = objectives
   c.type = 'Cheevs'
-  c.watchIndex = index
+  c.title = name
+  c.points = points
+  c.completed = completed
+  c.month = month
+  c.day = day
+  c.year = year
+  c.description = description
+  c.flags = flags
+  c.icon = icon
+  c.rewardText = rewardText
+  c.isGuildAch = isGuildAch
+  c.wasEarnedByMe = wasEarnedByMe
+  c.earnedBy = earnedBy
+
+  c.tagInfo = tagInfo
+  c.watchIndex = watchIndex
   c.id = cheevID
   c.cheevID = cheevID
-  c.title = name
-  c.points, c.completed, c.month, c.day, c.year, c.description, c.flags, c.icon, c.rewardText, c.isGuildAch, c.wasEarnedByMe, c.earnedBy =
-  points, completed, month, day, year, description, flags, icon, rewardText, isGuildAch, wasEarnedByMe, earnedBy
-  c.numObjectives = GetAchievementNumCriteria(cheevID)
-
-  local tagInfo = {}
-
-
-  c.objectives = {}
-  for i = 1, c.numObjectives do
-    local description, type, completed, quantity, requiredQuantity, characterName, flags, assetID, quantityString, criteriaID = GetAchievementCriteriaInfo(cheevID, i)
-    c.objectives[i] = {
-      objectiveIndex = i,
-      cheevID = cheevID,
-      text = description,
-      type = type,
-      finished = completed,
-      value = quantity,
-      maxValue = requiredQuantity,
-      characterName = characterName,
-      flags = flags,
-      assetID = assetID,
-      quantityString = quantityString,
-      criteriaID = criteriaID,
-    }
-  end
-  print('Cheevs.|cFF0088FFGetInfo|r('..index..')', 'obj:', GetAchievementNumCriteria(cheevID), name, description)
-
-  c.tagInfo = tagInfo
-  self.WatchInfo[index] = c
+  self.WatchInfo[watchIndex] = c
   return self.Info[cheevID]
 end