Files
aux-addon-ClassicAPI/aux-addon/aux-addon.lua
T
geojak 02cfc420dd aux auto bid and price heuristics
this commit does two things
1. it implements auto bid just like auto buy
2. it has some minimum pricing heuristics when posting items. this behavoiur actiaves when the post bid price is set to 0, the buyout price behaves like a minimum
2022-02-20 23:51:19 +01:00

243 lines
6.1 KiB
Lua

module 'aux'
local T = require 'T'
local post = require 'aux.tabs.post'
M.print = T.vararg-function(arg)
DEFAULT_CHAT_FRAME:AddMessage(LIGHTYELLOW_FONT_COLOR_CODE .. '<aux> ' .. join(map(arg, tostring), ' '))
end
local bids_loaded
function M.bids_loaded() return bids_loaded end
local current_owner_page
function M.current_owner_page() return current_owner_page end
local event_frame = CreateFrame'Frame'
for event in T.temp-T.set('ADDON_LOADED', 'VARIABLES_LOADED', 'PLAYER_LOGIN', 'AUCTION_HOUSE_SHOW', 'AUCTION_HOUSE_CLOSED', 'AUCTION_BIDDER_LIST_UPDATE', 'AUCTION_OWNED_LIST_UPDATE') do
event_frame:RegisterEvent(event)
end
local set_handler = {}
M.handle = setmetatable({}, {__metatable=false, __newindex=function(_, k, v) set_handler[k](v) end})
do
local handlers, handlers2 = {}, {}
function set_handler.LOAD(f)
tinsert(handlers, f)
end
function set_handler.LOAD2(f)
tinsert(handlers2, f)
end
event_frame:SetScript('OnEvent', function()
if event == 'ADDON_LOADED' then
if arg1 == 'Blizzard_AuctionUI' then
auction_ui_loaded()
end
elseif event == 'VARIABLES_LOADED' then
for _, f in handlers do f() end
elseif event == 'PLAYER_LOGIN' then
for _, f in handlers2 do f() end
print('loaded - /aux')
else
_M[event]()
end
end)
end
function handle.LOAD()
_G.aux = aux or {}
assign(aux, {
account = {},
realm = {},
faction = {},
character = {},
})
M.account_data = assign(aux.account, {
scale = 1,
ignore_owner = true,
crafting_cost = true,
post_bid = false,
post_duration = post.DURATION_24,
items = {},
item_ids = {},
auctionable_items = {},
merchant_buy = {},
merchant_sell = {},
})
do
local key = format('%s|%s', GetCVar'realmName', UnitName'player')
aux.character[key] = aux.character[key] or {}
M.character_data = assign(aux.character[key], {
tooltip = {
value = true,
merchant_sell = false,
merchant_buy = false,
daily = false,
disenchant_value = false,
disenchant_distribution = false,
}
})
end
do
local key = GetCVar'realmName'
aux.realm[key] = aux.realm[key] or {}
M.realm_data = assign(aux.realm[key], {
characters = {},
recent_searches = {},
favorite_searches = {},
})
end
end
function handle.LOAD2()
local key = format('%s|%s', GetCVar'realmName', UnitFactionGroup'player')
aux.faction[key] = aux.faction[key] or {}
M.faction_data = assign(aux.faction[key], {
history = {},
post = {},
})
end
tab_info = {}
function M.tab(name)
local tab = T.map('name', name)
local tab_event = {
OPEN = function(f) tab.OPEN = f end,
CLOSE = function(f) tab.CLOSE = f end,
USE_ITEM = function(f) tab.USE_ITEM = f end,
CLICK_LINK = function(f) tab.CLICK_LINK = f end,
}
tinsert(tab_info, tab)
return setmetatable({}, {__metatable=false, __newindex=function(_, k, v) tab_event[k](v) end})
end
do
local index
function M.get_tab() return tab_info[index] end
function on_tab_click(i)
CloseDropDownMenus()
do (index and get_tab().CLOSE or pass)() end
index = i
do (index and get_tab().OPEN or pass)() end
end
end
M.orig = setmetatable({[_G]=T.acquire()}, {__index=function(self, key) return self[_G][key] end})
M.hook = T.vararg-function(arg)
local name, object, handler
if getn(arg) == 3 then
name, object, handler = unpack(arg)
else
object, name, handler = _G, unpack(arg)
end
handler = handler or getfenv(3)[name]
orig[object] = orig[object] or T.acquire()
assert(not orig[object][name], '"' .. name .. '" is already hooked into.')
orig[object][name], object[name] = object[name], handler
return hook
end
do
local locked
function M.bid_in_progress() return locked end
function M.place_bid(type, index, amount, on_success)
if locked then return end
local money = GetMoney()
PlaceAuctionBid(type, index, amount)
if money >= amount then
locked = true
local send_signal, signal_received = signal()
thread(when, signal_received, function()
do (on_success or pass)() end
locked = false
end)
thread(when, later(5), send_signal)
event_listener('CHAT_MSG_SYSTEM', function(kill)
if arg1 == ERR_AUCTION_BID_PLACED then
send_signal()
kill()
end
end)
end
end
end
do
local locked
function M.cancel_in_progress() return locked end
function M.cancel_auction(index, on_success)
if locked then return end
locked = true
CancelAuction(index)
local send_signal, signal_received = signal()
thread(when, signal_received, function()
do (on_success or pass)() end
locked = false
end)
thread(when, later(5), send_signal)
event_listener('CHAT_MSG_SYSTEM', function(kill)
if arg1 == ERR_AUCTION_REMOVED then
send_signal()
kill()
end
end)
end
end
function handle.LOAD2()
frame:SetScale(account_data.scale)
end
function AUCTION_HOUSE_SHOW()
AuctionFrame:Hide()
frame:Show()
set_tab(1)
end
do
local handlers = {}
function set_handler.CLOSE(f)
tinsert(handlers, f)
end
function AUCTION_HOUSE_CLOSED()
bids_loaded = false
current_owner_page = nil
for _, handler in handlers do
handler()
end
set_tab()
frame:Hide()
end
end
function AUCTION_BIDDER_LIST_UPDATE()
bids_loaded = true
end
do
local last_owner_page_requested
function GetOwnerAuctionItems(index)
last_owner_page_requested = index
return orig.GetOwnerAuctionItems(index)
end
function AUCTION_OWNED_LIST_UPDATE()
current_owner_page = last_owner_page_requested or 0
end
end
function auction_ui_loaded()
AuctionFrame:UnregisterEvent('AUCTION_HOUSE_SHOW')
AuctionFrame:SetScript('OnHide', nil)
hook('ShowUIPanel', T.vararg-function(arg)
if arg[1] == AuctionFrame then return AuctionFrame:Show() end
return orig.ShowUIPanel(unpack(arg))
end)
hook 'GetOwnerAuctionItems' 'SetItemRef' 'UseContainerItem' 'AuctionFrameAuctions_OnEvent'
end
AuctionFrameAuctions_OnEvent = T.vararg-function(arg)
if AuctionFrameAuctions:IsVisible() then
return orig.AuctionFrameAuctions_OnEvent(unpack(arg))
end
end