You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
241 lines
7.9 KiB
241 lines
7.9 KiB
local _, addon = ...;
|
|
local DataProvider = {};
|
|
addon.DataProvider = DataProvider;
|
|
|
|
local GetAchievementCategory = GetAchievementCategory;
|
|
local GetCategoryInfo = GetCategoryInfo;
|
|
local GetAchievementInfo = GetAchievementInfo;
|
|
local SetFocusedAchievement= SetFocusedAchievement;
|
|
|
|
--Changed in 10.1.5 (C_ContentTracking)
|
|
local GetTrackedAchievements = GetTrackedAchievements;
|
|
local RemoveTrackedAchievement = RemoveTrackedAchievement;
|
|
local AddTrackedAchievement = AddTrackedAchievement;
|
|
|
|
do
|
|
local TRACKING_TYPE_ACHV = (Enum and Enum.ContentTrackingType and Enum.ContentTrackingType.Achievement) or 2;
|
|
|
|
if C_ContentTracking then
|
|
if C_ContentTracking.GetTrackedIDs then
|
|
GetTrackedAchievements = function()
|
|
return C_ContentTracking.GetTrackedIDs(TRACKING_TYPE_ACHV)
|
|
end
|
|
end
|
|
|
|
if C_ContentTracking.StopTracking then
|
|
RemoveTrackedAchievement = function(id)
|
|
C_ContentTracking.StopTracking(TRACKING_TYPE_ACHV, id, Enum.ContentTrackingStopType.Manual);
|
|
end
|
|
end
|
|
|
|
if C_ContentTracking.StartTracking then
|
|
AddTrackedAchievement = function(id)
|
|
AchievementFrame_LoadUI(); --Due to the change of Objective Tracker in 10.1.5;
|
|
|
|
local trackingError = C_ContentTracking.StartTracking(TRACKING_TYPE_ACHV, id);
|
|
if trackingError then
|
|
ContentTrackingUtil.DisplayTrackingError(trackingError);
|
|
end
|
|
end
|
|
end
|
|
|
|
if C_ContentTracking.IsTracking then
|
|
function DataProvider:IsTrackedAchievement(id)
|
|
return C_ContentTracking.IsTracking(TRACKING_TYPE_ACHV, id)
|
|
end
|
|
end
|
|
else
|
|
function DataProvider:IsTrackedAchievement(id)
|
|
return self.isTrackedAchievements[id]
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
local NARCI_CATE_ID = 12080000;
|
|
|
|
DataProvider.categoryCache = {
|
|
[NARCI_CATE_ID] = {"Narcissus", -1},
|
|
};
|
|
|
|
DataProvider.achievementCache = {};
|
|
DataProvider.achievementOrderCache = {};
|
|
DataProvider.id2Button = {};
|
|
DataProvider.currentCategory = 0;
|
|
DataProvider.isTrackedAchievements = {};
|
|
DataProvider.trackedAchievements = {};
|
|
DataProvider.rootCategories = {};
|
|
|
|
function DataProvider:ClearCache()
|
|
wipe(self.categoryCache);
|
|
wipe(self.achievementCache);
|
|
collectgarbage("collect");
|
|
end
|
|
|
|
function DataProvider:GetCategoryInfo(id, index)
|
|
if id and id >= NARCI_CATE_ID or id < 0 then
|
|
return "Narcissus", -1
|
|
end
|
|
if not self.categoryCache[id] then
|
|
local name, parentID, flags = GetCategoryInfo(id);
|
|
if name then
|
|
self.categoryCache[id] = { name, parentID, flags };
|
|
end
|
|
return name, parentID, flags;
|
|
else
|
|
if index then
|
|
return self.categoryCache[id][index];
|
|
else
|
|
return unpack( self.categoryCache[id] );
|
|
end
|
|
end
|
|
end
|
|
|
|
function DataProvider:GetAchievementCategory(achievementID)
|
|
if achievementID and achievementID > NARCI_CATE_ID or achievementID < 0 then
|
|
return NARCI_CATE_ID
|
|
else
|
|
return GetAchievementCategory(achievementID)
|
|
end
|
|
end
|
|
|
|
function DataProvider:GetAchievementInfo(id, index)
|
|
if not id or id < 0 then
|
|
return id
|
|
end
|
|
if id > NARCI_CATE_ID then
|
|
--reserved for Narcissus Statistics
|
|
return id
|
|
end
|
|
if not self.achievementCache[id] then
|
|
local id, name, points, completed, month, day, year, description, flags, icon, rewardText, isGuild, wasEarnedByMe, earnedBy, isStatistic = GetAchievementInfo(id);
|
|
if isGuild then
|
|
SetFocusedAchievement(id);
|
|
end
|
|
if description then
|
|
self.achievementCache[id] = {id, name, points, completed, month, day, year, description, flags, icon, rewardText, isGuild, wasEarnedByMe, true, isStatistic};
|
|
end
|
|
if index then
|
|
if self.achievementCache[id] then
|
|
return self.achievementCache[id][index];
|
|
end
|
|
else
|
|
return id, name, points, completed, month, day, year, description, flags, icon, rewardText, isGuild, wasEarnedByMe, earnedBy, isStatistic
|
|
end
|
|
else
|
|
if index then
|
|
return self.achievementCache[id][index];
|
|
else
|
|
return unpack( self.achievementCache[id] );
|
|
end
|
|
end
|
|
end
|
|
|
|
function DataProvider:IsStatistic(id)
|
|
if id > NARCI_CATE_ID or id < 0 then
|
|
--reserved for Narcissus Statistics
|
|
return true
|
|
end
|
|
if self.achievementCache[id] then
|
|
return self.achievementCache[id][15]
|
|
else
|
|
local isStatistic = select(15, GetAchievementInfo(id));
|
|
return isStatistic
|
|
end
|
|
end
|
|
|
|
function DataProvider:UpdateAchievementCache(id)
|
|
if self.achievementCache[id] then
|
|
local id, name, points, completed, month, day, year, description, flags, icon, rewardText, isGuild, wasEarnedByMe, earnedBy = GetAchievementInfo(id);
|
|
if isGuild then
|
|
SetFocusedAchievement(id);
|
|
end
|
|
if description then
|
|
self.achievementCache[id] = {id, name, points, completed, month, day, year, description, flags, icon, rewardText, isGuild, wasEarnedByMe};
|
|
end
|
|
end
|
|
end
|
|
|
|
function DataProvider:GetAchievementInfoByOrder(categoryID, order)
|
|
if not self.achievementOrderCache[categoryID] then
|
|
self.achievementOrderCache[categoryID] = {};
|
|
end
|
|
|
|
if not self.achievementOrderCache[categoryID][order] then
|
|
local id, name, points, completed, month, day, year, description, flags, icon, rewardText, isGuild, wasEarnedByMe, earnedBy = GetAchievementInfo(categoryID, order);
|
|
if isGuild then
|
|
SetFocusedAchievement(id);
|
|
end
|
|
if description then
|
|
self.achievementOrderCache[categoryID][order] = id;
|
|
self.achievementCache[id] = {id, name, points, completed, month, day, year, description, flags, icon, rewardText, isGuild, wasEarnedByMe};
|
|
end
|
|
return id, name, points, completed, month, day, year, description, flags, icon, rewardText, isGuild, wasEarnedByMe, earnedBy
|
|
else
|
|
local id = self.achievementOrderCache[categoryID][order];
|
|
return self:GetAchievementInfo(id)
|
|
end
|
|
end
|
|
|
|
function DataProvider:GetCategoryButtonByID(categoryID, isGuild)
|
|
return self.id2Button[categoryID];
|
|
end
|
|
|
|
function DataProvider:GetTrackedAchievements()
|
|
local new = {GetTrackedAchievements()} or {};
|
|
local old = self.trackedAchievements;
|
|
local numNew, numOld = #new, #old;
|
|
local dif;
|
|
|
|
if numNew >= numOld then
|
|
local lookup = {};
|
|
for i = 1, #old do
|
|
lookup[ old[i] ] = true;
|
|
end
|
|
for i = 1, #new do
|
|
if not lookup[ new[i] ] then
|
|
dif = new[i];
|
|
break
|
|
end
|
|
end
|
|
else
|
|
local lookup = {};
|
|
for i = 1, #new do
|
|
lookup[ new[i] ] = true;
|
|
end
|
|
for i = 1, #old do
|
|
if not lookup[ old[i] ] then
|
|
dif = old[i];
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
self.trackedAchievements = new;
|
|
self.numTrackedAchievements = #new;
|
|
wipe(self.isTrackedAchievements);
|
|
for index, id in pairs(new) do
|
|
self.isTrackedAchievements[id] = true;
|
|
end
|
|
return dif
|
|
end
|
|
|
|
function DataProvider:StopTracking(id)
|
|
RemoveTrackedAchievement(id);
|
|
end
|
|
|
|
function DataProvider:StartTracking(id)
|
|
AddTrackedAchievement(id);
|
|
end
|
|
|
|
function DataProvider:IsAchievementCompleted(id)
|
|
return self:GetAchievementInfo(id, 4) and true
|
|
end
|
|
|
|
function DataProvider:IsRootCategory(categoryID)
|
|
if self.rootCategories[categoryID] == nil then
|
|
local name, parentID = self:GetCategoryInfo(categoryID);
|
|
self.rootCategories[categoryID] = (parentID == -1 or parentID == 15076) or false;
|
|
end
|
|
return self.rootCategories[categoryID]
|
|
end
|