11local _ , ADDON = ...
22
33local function collectFavoredByApi ()
4+ local c = 0
45 local mountIds = C_MountJournal .GetMountIDs ()
56 local favoredMounts = {}
67 for _ , mountId in ipairs (mountIds ) do
78 local _ , _ , _ , _ , _ , _ , isFavorite = C_MountJournal .GetMountInfoByID (mountId )
89 if isFavorite then
9- favoredMounts [# favoredMounts + 1 ] = mountId
10+ c = c + 1
11+ favoredMounts [c ] = mountId
1012 end
1113 end
1214
1315 return favoredMounts
1416end
1517
1618local backgroundTimer
17- local function UpdateFavoritesInBackground ()
19+ local function cancelBackgroundTask ()
1820 if backgroundTimer then
1921 backgroundTimer :Cancel ()
2022 end
23+ ADDON .Events :UnregisterFrameEventAndCallback (" MOUNT_JOURNAL_SEARCH_UPDATED" , ' cleanup-favorite-background' )
24+ end
25+ local function UpdateFavoritesInBackground ()
26+ cancelBackgroundTask ()
2127
2228 local _ , _ , favorites = ADDON .Api :GetFavoriteProfile ()
23- local flippedFavorites = CopyValuesAsKeys (favorites )
29+ favorites = tFilter (favorites , function (mountId )
30+ local _ , _ , _ , _ , _ , _ , _ , _ , _ , shouldHideOnChar = C_MountJournal .GetMountInfoByID (mountId )
31+ return not shouldHideOnChar
32+ end )
33+
34+ local flippedFavorites = {}
35+ for _ , v in pairs (favorites ) do -- CopyValuesAsKeys() somehow created faulty list
36+ flippedFavorites [v ] = true
37+ end
2438 local operationCount = # favorites
39+ favorites = nil
2540
2641 local favoredByApi = collectFavoredByApi ()
2742
@@ -36,29 +51,52 @@ local function UpdateFavoritesInBackground()
3651 end
3752
3853 if operationCount > 0 then
39- backgroundTimer = C_Timer .NewTicker (0.4 , function ()
40- local toRemove = {}
41- for mountId , value in pairs (flippedFavorites ) do
42- value = value ~= false
43- local _ , _ , _ , _ , _ , _ , isFavorite = C_MountJournal .GetMountInfoByID (mountId )
44- if isFavorite == value then
45- toRemove [mountId ] = mountId
54+ local lastTickMount , tickTryMount = 0 , 0
55+ local tickHandler = function ()
56+ local mountId , shouldBeFavored = next (flippedFavorites )
57+ if mountId then
58+ if lastTickMount == mountId and tickTryMount >= 3 then
59+ flippedFavorites [mountId ] = nil
4660 else
47- local index = ADDON .Api :MountIdToOriginalIndex (mountId )
61+ if lastTickMount == mountId then
62+ tickTryMount = tickTryMount + 1
63+ else
64+ lastTickMount = mountId
65+ tickTryMount = 1
66+ end
67+
68+ local index = ADDON .Api :MountIdToOriginalIndex (mountId ) -- costly call
4869 if index then
49- C_MountJournal .SetIsFavorite (index , value )
50- break
70+ local isFavorite = C_MountJournal .GetIsFavorite (index )
71+ if isFavorite == shouldBeFavored then
72+ flippedFavorites [mountId ] = nil
73+ else
74+ C_MountJournal .SetIsFavorite (index , shouldBeFavored )
75+ end
5176 end
5277 end
5378 end
54- for mountId , _ in pairs (toRemove ) do
55- flippedFavorites [mountId ] = nil
79+
80+ if TableIsEmpty (flippedFavorites ) then
81+ cancelBackgroundTask ()
82+ end
83+ end
84+
85+ ADDON .Events :RegisterFrameEventAndCallback (" MOUNT_JOURNAL_SEARCH_UPDATED" , function ()
86+ local mountId , shouldBeFavored = next (flippedFavorites )
87+ if mountId then
88+ local _ , _ , _ , _ , _ , _ , isFavorite = C_MountJournal .GetMountInfoByID (mountId )
89+ if isFavorite == shouldBeFavored then
90+ flippedFavorites [mountId ] = nil
91+ end
5692 end
5793
5894 if TableIsEmpty (flippedFavorites ) then
59- backgroundTimer : Cancel ()
95+ cancelBackgroundTask ()
6096 end
61- end )
97+ end , ' cleanup-favorite-background' )
98+
99+ backgroundTimer = C_Timer .NewTicker (0.4 , tickHandler )
62100 end
63101end
64102
0 commit comments