Files
florian.berthold bbe2492a5b chore: flatten Altoholic-Addon/ wrapper + add standard .gitignore/.gitattributes
Each DataStore_* / Altoholic_* addon now lives at the repo root, matching
the Exiles fork-layout convention (one folder per addon, no wrapper dir).
2026-05-25 10:59:24 +02:00

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