-
Notifications
You must be signed in to change notification settings - Fork 0
/
AuctionFavoritesSync.lua
115 lines (91 loc) · 2.87 KB
/
AuctionFavoritesSync.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
local addonName = ...
local gdb, cdb
local function serializeValues(t)
local keys, values = {}, {}
for k in pairs(t) do table.insert(keys, k) end
table.sort(keys)
for _, k in ipairs(keys) do table.insert(values, t[k]) end
return table.concat(values, "-")
end
local function sync(itemKey)
local key = serializeValues(itemKey)
if not gdb.favorites[key] == not cdb.favorites[key] then
return false
end
C_AuctionHouse.SetFavoriteItem(itemKey, gdb.favorites[key] ~= nil)
return true
end
local function setFavorite(itemKey, favorite)
local key = serializeValues(itemKey)
gdb.favorites[key] = favorite and itemKey or nil
cdb.favorites[key] = favorite and itemKey or nil
end
hooksecurefunc(C_AuctionHouse, "SetFavoriteItem", setFavorite)
local f = CreateFrame("Frame")
f:RegisterEvent("ADDON_LOADED")
f:RegisterEvent("AUCTION_HOUSE_SHOW")
f:RegisterEvent("AUCTION_HOUSE_CLOSED")
f:SetScript("OnEvent", function(_, event, ...)
if event == "ADDON_LOADED" and ... == addonName then
f:UnregisterEvent("ADDON_LOADED")
AuctionFavoritesSyncGDB = AuctionFavoritesSyncGDB or {}
gdb = AuctionFavoritesSyncGDB
gdb.favorites = gdb.favorites or {}
AuctionFavoritesSyncCDB = AuctionFavoritesSyncCDB or {}
cdb = AuctionFavoritesSyncCDB
cdb.favorites = cdb.favorites or {}
if not cdb.sync then
f:RegisterEvent("AUCTION_HOUSE_BROWSE_RESULTS_UPDATED")
f:RegisterEvent("AUCTION_HOUSE_BROWSE_RESULTS_ADDED")
f:RegisterEvent("COMMODITY_SEARCH_RESULTS_UPDATED")
f:RegisterEvent("COMMODITY_SEARCH_RESULTS_ADDED")
f:RegisterEvent("ITEM_SEARCH_RESULTS_UPDATED")
f:RegisterEvent("ITEM_SEARCH_RESULTS_ADDED")
end
end
if event == "AUCTION_HOUSE_SHOW" then
local needRefresh = false
if cdb.sync then
for _, db in ipairs { gdb, cdb } do
for _, itemKey in pairs(db.favorites) do
needRefresh = sync(itemKey) or needRefresh
end
end
else
for _, itemKey in pairs(gdb.favorites) do
C_AuctionHouse.SetFavoriteItem(itemKey, true)
needRefresh = true
end
end
if needRefresh then
C_AuctionHouse.SearchForFavorites({})
end
end
if event == "AUCTION_HOUSE_CLOSED" then
cdb.sync = true
f:UnregisterAllEvents()
f:SetScript("OnEvent", nil)
end
if cdb.sync then
return
end
local function processItemKey(itemKey)
setFavorite(itemKey, C_AuctionHouse.IsFavoriteItem(itemKey))
end
if event == "AUCTION_HOUSE_BROWSE_RESULTS_UPDATED" then
for _, result in ipairs(C_AuctionHouse.GetBrowseResults()) do
processItemKey(result.itemKey)
end
end
if event == "AUCTION_HOUSE_BROWSE_RESULTS_ADDED" then
for _, result in ipairs(...) do
processItemKey(result.itemKey)
end
end
if event == "COMMODITY_SEARCH_RESULTS_UPDATED" or event == "COMMODITY_SEARCH_RESULTS_ADDED" then
processItemKey(C_AuctionHouse.MakeItemKey(...))
end
if event == "ITEM_SEARCH_RESULTS_UPDATED" or event == "ITEM_SEARCH_RESULTS_ADDED" then
processItemKey(...)
end
end)