bbe2492a5b
Each DataStore_* / Altoholic_* addon now lives at the repo root, matching the Exiles fork-layout convention (one folder per addon, no wrapper dir).
215 lines
6.8 KiB
Lua
215 lines
6.8 KiB
Lua
--[[ *** DataStore_Auctions ***
|
|
Written by : Thaoky, EU-Marécages de Zangar
|
|
July 15th, 2009
|
|
--]]
|
|
if not DataStore then return end
|
|
|
|
local addonName = "DataStore_Auctions"
|
|
|
|
_G[addonName] = LibStub("AceAddon-3.0"):NewAddon(addonName, "AceConsole-3.0", "AceEvent-3.0", "AceTimer-3.0")
|
|
|
|
local addon = _G[addonName]
|
|
|
|
local THIS_ACCOUNT = "Default"
|
|
|
|
local AddonDB_Defaults = {
|
|
global = {
|
|
Options = {
|
|
AutoClearExpiredItems = 1, -- Automatically clear expired auctions and bids
|
|
},
|
|
Characters = {
|
|
['*'] = { -- ["Account.Realm.Name"]
|
|
Auctions = {},
|
|
Bids = {},
|
|
lastUpdate = nil, -- last time the AH was checked for this char
|
|
lastVisitDate = nil, -- in YYYY MM DD hh:mm, for external apps
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
local function GetOption(option)
|
|
return addon.db.global.Options[option]
|
|
end
|
|
|
|
|
|
-- ** Mixins **
|
|
local function _GetNumAuctions(character)
|
|
return #character.Auctions
|
|
end
|
|
|
|
local function _GetNumBids(character)
|
|
return #character.Bids
|
|
end
|
|
|
|
local function _GetAuctionHouseItemInfo(character, list, index)
|
|
if list == "Auctions" or list == "Bids" then
|
|
local item = character[list][index]
|
|
if not item then return end
|
|
local isGoblin, itemID, count, name, price1, price2, timeLeft = strsplit("|", item)
|
|
isGoblin = tonumber(isGoblin)
|
|
isGoblin = (isGoblin == 1) and true or nil
|
|
return isGoblin, tonumber(itemID), tonumber(count), name, tonumber(price1), tonumber(price2), tonumber(timeLeft)
|
|
end
|
|
end
|
|
|
|
local function _GetAuctionHouseLastVisit(character)
|
|
return character.lastUpdate or 0
|
|
end
|
|
|
|
local function _GetAuctionHouseItemCount(character, searchedID)
|
|
local count = 0
|
|
for k, v in pairs (character.Auctions) do
|
|
local _, id, itemCount = strsplit("|", v)
|
|
if id and (tonumber(id) == searchedID) then
|
|
itemCount = tonumber(itemCount) or 1
|
|
count = count + itemCount
|
|
end
|
|
end
|
|
return count
|
|
end
|
|
|
|
local function _ClearAuctionEntries(character, AHType, AHZone)
|
|
-- this function clears the "auctions" or "bids" of a specific AH (faction or goblin)
|
|
-- AHType = "Auctions" or "Bids" (the name of the table in the DB)
|
|
-- AHZone = 0 for player faction, or 1 for goblin
|
|
local ah = character[AHType]
|
|
|
|
for i = #ah, 1, -1 do -- parse backwards to avoid messing up the index
|
|
local faction = strsplit("|", ah[i])
|
|
if faction then
|
|
if tonumber(faction) == AHZone then
|
|
table.remove(ah, i)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local PublicMethods = {
|
|
GetNumAuctions = _GetNumAuctions,
|
|
GetNumBids = _GetNumBids,
|
|
GetAuctionHouseItemInfo = _GetAuctionHouseItemInfo,
|
|
GetAuctionHouseLastVisit = _GetAuctionHouseLastVisit,
|
|
GetAuctionHouseItemCount = _GetAuctionHouseItemCount,
|
|
ClearAuctionEntries = _ClearAuctionEntries,
|
|
}
|
|
|
|
-- maximum time left in seconds per auction type : [1] = max 30 minutes, [2] = 2 hours, [3] = 12 hours, [4] = more than 12, but max 48 hours
|
|
-- info : http://www.wowwiki.com/API_GetAuctionItemTimeLeft
|
|
local maxTimeLeft = { 30*60, 2*60*60, 12*60*60, 48*60*60 }
|
|
|
|
local function CheckExpiries()
|
|
local AHTypes = { "Auctions", "Bids" }
|
|
local timeLeft, diff
|
|
|
|
for key, character in pairs(addon.db.global.Characters) do
|
|
for _, ahType in pairs(AHTypes) do -- browse both auctions & bids
|
|
for index = #character[ahType], 1, -1 do -- from last to first, to make sure table.remove does not screw up indexes.
|
|
timeLeft = select(7, _GetAuctionHouseItemInfo(character, ahType, index))
|
|
if not timeLeft or (timeLeft < 1) or (timeLeft > 4) then
|
|
timeLeft = 4 -- timeLeft is supposed to always be between 1 and 4, if it's not in this range, set it to the longest value (4 = more than 12 hours)
|
|
end
|
|
|
|
diff = time() - character.lastUpdate
|
|
if diff > maxTimeLeft[timeLeft] then -- has expired
|
|
table.remove(character[ahType], index)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function addon:OnInitialize()
|
|
addon.db = LibStub("AceDB-3.0"):New(addonName .. "DB", AddonDB_Defaults)
|
|
|
|
DataStore:RegisterModule(addonName, addon, PublicMethods)
|
|
DataStore:SetCharacterBasedMethod("GetNumAuctions")
|
|
DataStore:SetCharacterBasedMethod("GetNumBids")
|
|
DataStore:SetCharacterBasedMethod("GetAuctionHouseItemInfo")
|
|
DataStore:SetCharacterBasedMethod("GetAuctionHouseLastVisit")
|
|
DataStore:SetCharacterBasedMethod("GetAuctionHouseItemCount")
|
|
DataStore:SetCharacterBasedMethod("ClearAuctionEntries")
|
|
end
|
|
|
|
function addon:OnEnable()
|
|
addon:RegisterEvent("AUCTION_HOUSE_SHOW")
|
|
addon:SetupOptions()
|
|
|
|
if GetOption("AutoClearExpiredItems") == 1 then
|
|
addon:ScheduleTimer(CheckExpiries, 3) -- check AH expiries 3 seconds later, to decrease the load at startup
|
|
end
|
|
end
|
|
|
|
function addon:OnDisable()
|
|
addon:UnregisterEvent("AUCTION_HOUSE_SHOW")
|
|
end
|
|
|
|
-- *** Scanning functions ***
|
|
local function ScanAuctions()
|
|
local AHZone = 0 -- 0 means faction AH
|
|
local zoneFaction = GetZonePVPInfo() -- "friendly", "sanctuary", "contested" (PvP server) or nil (PvE server)
|
|
if ( zoneFaction ~= "friendly" ) and ( zoneFaction ~= "sanctuary" ) then
|
|
AHZone = 1 -- 1 means goblin AH
|
|
end
|
|
|
|
local character = addon.ThisCharacter
|
|
character.lastUpdate = time()
|
|
|
|
_ClearAuctionEntries(character, "Auctions", AHZone)
|
|
|
|
for i = 1, GetNumAuctionItems("owner") do
|
|
local itemName, _, count, _, _, _, startPrice,
|
|
_, buyoutPrice, _, highBidder = GetAuctionItemInfo("owner", i);
|
|
|
|
if itemName then
|
|
local link = GetAuctionItemLink("owner", i)
|
|
local id = tonumber(link:match("item:(%d+)"))
|
|
local timeLeft = GetAuctionItemTimeLeft("owner", i)
|
|
|
|
table.insert(character.Auctions, format("%s|%s|%s|%s|%s|%s|%s",
|
|
AHZone, id, count, highBidder or "", startPrice, buyoutPrice, timeLeft))
|
|
end
|
|
end
|
|
end
|
|
|
|
local function ScanBids()
|
|
local AHZone = 0 -- 0 means faction AH
|
|
local zoneFaction = GetZonePVPInfo() -- "friendly", "sanctuary", "contested" (PvP server) or nil (PvE server)
|
|
if ( zoneFaction ~= "friendly" ) and ( zoneFaction ~= "sanctuary" ) then
|
|
AHZone = 1 -- 1 means goblin AH
|
|
end
|
|
|
|
local character = addon.ThisCharacter
|
|
character.lastUpdate = time()
|
|
character.lastVisitDate = date("%Y/%m/%d %H:%M")
|
|
|
|
_ClearAuctionEntries(character, "Bids", AHZone)
|
|
|
|
for i = 1, GetNumAuctionItems("bidder") do
|
|
local itemName, _, count, _, _, _, _,
|
|
_, buyoutPrice, bidPrice, _, ownerName = GetAuctionItemInfo("bidder", i);
|
|
|
|
if itemName then
|
|
local link = GetAuctionItemLink("bidder", i)
|
|
local id = tonumber(link:match("item:(%d+)"))
|
|
local timeLeft = GetAuctionItemTimeLeft("bidder", i)
|
|
|
|
table.insert(character.Bids, format("%s|%s|%s|%s|%s|%s|%s",
|
|
AHZone, id, count, ownerName or "", bidPrice, buyoutPrice, timeLeft))
|
|
end
|
|
end
|
|
end
|
|
|
|
-- *** EVENT HANDLERS ***
|
|
function addon:AUCTION_HOUSE_SHOW()
|
|
addon:RegisterEvent("AUCTION_HOUSE_CLOSED")
|
|
addon:RegisterEvent("AUCTION_OWNED_LIST_UPDATE", ScanAuctions)
|
|
addon:RegisterEvent("AUCTION_BIDDER_LIST_UPDATE", ScanBids)
|
|
end
|
|
|
|
function addon:AUCTION_HOUSE_CLOSED()
|
|
addon:UnregisterEvent("AUCTION_HOUSE_CLOSED")
|
|
addon:UnregisterEvent("AUCTION_OWNED_LIST_UPDATE")
|
|
addon:UnregisterEvent("AUCTION_BIDDER_LIST_UPDATE")
|
|
end
|