155 lines
6.4 KiB
Lua
155 lines
6.4 KiB
Lua
--[[
|
|
Auctioneer Addon for World of Warcraft(tm).
|
|
Version: 5.9.4961 (WhackyWallaby)
|
|
Revision: $Id: BidMonitor.lua 4426 2009-08-28 01:39:55Z kandoko $
|
|
URL: http://auctioneeraddon.com/
|
|
|
|
BidMonitor - Records bids posted in the Auctionhouse
|
|
|
|
License:
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; either version 2
|
|
of the License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program(see GPL.txt); if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
Note:
|
|
This AddOn's source code is specifically designed to work with
|
|
World of Warcraft's interpreted AddOn system.
|
|
You have an implicit license to use this AddOn with these facilities
|
|
since that is it's designated purpose as per:
|
|
http://www.fsf.org/licensing/licenses/gpl-faq.html#InterpreterIncompat
|
|
]]
|
|
LibStub("LibRevision"):Set("$URL: http://svn.norganna.org/auctioneer/branches/5.9/BeanCounter/BidMonitor.lua $","$Rev: 4426 $","5.1.DEV.", 'auctioneer', 'libs')
|
|
|
|
local libName = "BeanCounter"
|
|
local libType = "Util"
|
|
local lib = BeanCounter
|
|
local private, print, get, set, _BC = lib.getLocals()
|
|
|
|
local function debugPrint(...)
|
|
if get("util.beancounter.debugBid") then
|
|
private.debugPrint("BidMonitor",...)
|
|
end
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
-- Called after PlaceAuctionBid()
|
|
-------------------------------------------------------------------------------
|
|
function private.postPlaceAuctionBidHook(_, _, listType, index, bid)
|
|
local name, texture, count, quality, canUse, level, minBid, minIncrement, buyoutPrice, bidAmount, highBidder, owner = GetAuctionItemInfo(listType, index)
|
|
local itemLink = GetAuctionItemLink(listType, index)
|
|
local timeLeft = GetAuctionItemTimeLeft(listType, index)
|
|
if (name and count and bid) then
|
|
private.addPendingBid(name, count, bid, owner, (bid == buyoutPrice), highBidder, timeLeft, itemLink)
|
|
end
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
-- Adds a pending bid to the queue.
|
|
-------------------------------------------------------------------------------
|
|
function private.addPendingBid(name, count, bid, owner, isBuyout, isHighBidder, timeLeft, itemLink)
|
|
-- Add a pending bid to the queue.
|
|
local pendingBid = {}
|
|
pendingBid.name = name
|
|
pendingBid.count = count
|
|
pendingBid.bid = bid
|
|
pendingBid.owner = owner
|
|
pendingBid.isBuyout = isBuyout
|
|
pendingBid.isHighBidder = isHighBidder
|
|
pendingBid.timeLeft = timeLeft
|
|
pendingBid.itemLink = itemLink
|
|
table.insert(private.PendingBids, pendingBid)
|
|
debugPrint("addPendingBid() - Added pending bid")
|
|
|
|
-- Register for the response events if this is the first pending bid.
|
|
if (#private.PendingBids == 1) then
|
|
debugPrint("addPendingBid() - Registering for CHAT_MSG_SYSTEM and UI_ERROR_MESSAGE")
|
|
Stubby.RegisterEventHook("CHAT_MSG_SYSTEM", "BeanCounter_BidMonitor", private.onEventHookBid)
|
|
Stubby.RegisterEventHook("UI_ERROR_MESSAGE", "BeanCounter_BidMonitor", private.onEventHookBid)
|
|
end
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
-- Removes the pending bid from the queue.
|
|
-------------------------------------------------------------------------------
|
|
function private.removePendingBid()
|
|
if (#private.PendingBids > 0) then
|
|
-- Remove the first pending bid.
|
|
local bid = private.PendingBids[1]
|
|
table.remove(private.PendingBids, 1)
|
|
debugPrint("removePendingBid() - Removed pending bid")
|
|
|
|
-- Unregister for the response events if this is the last pending bid.
|
|
if (#private.PendingBids == 0) then
|
|
debugPrint("removePendingBid() - Unregistering for CHAT_MSG_SYSTEM and UI_ERROR_MESSAGE")
|
|
Stubby.UnregisterEventHook("CHAT_MSG_SYSTEM", "BeanCounter_BidMonitor", private.onEventHookBid)
|
|
Stubby.UnregisterEventHook("UI_ERROR_MESSAGE", "BeanCounter_BidMonitor", private.onEventHookBid)
|
|
end
|
|
|
|
return bid
|
|
end
|
|
|
|
-- No pending bid to remove!
|
|
return nil
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
-- OnEvent handler BIDS. these are unhooked when not needed
|
|
-------------------------------------------------------------------------------
|
|
function private.onEventHookBid(_, event, arg1)
|
|
if (event == "CHAT_MSG_SYSTEM" and arg1) then
|
|
if (arg1 == ERR_AUCTION_BID_PLACED) then
|
|
private.onBidAccepted()
|
|
end
|
|
elseif (event == "UI_ERROR_MESSAGE" and arg1) then
|
|
if (arg1) then debugPrint(" "..arg1) end
|
|
if (arg1 == ERR_ITEM_NOT_FOUND or
|
|
arg1 == ERR_NOT_ENOUGH_MONEY or
|
|
arg1 == ERR_AUCTION_BID_OWN or
|
|
arg1 == ERR_AUCTION_HIGHER_BID or
|
|
arg1 == ERR_ITEM_MAX_COUNT) then
|
|
private.onBidFailed()
|
|
end
|
|
end
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
-- Called when a bid is accepted by the server.
|
|
-------------------------------------------------------------------------------
|
|
function private.onBidAccepted()
|
|
local bid = private.removePendingBid()
|
|
if (bid) then
|
|
|
|
local itemID = lib.API.decodeLink(bid.itemLink)
|
|
local text = private.packString(bid.count, bid.bid, bid.owner, bid.isBuyout, bid.timeLeft, time(), "")
|
|
debugPrint(bid.isBuyout, bid.isHighBidder)
|
|
--we use the bid/buy data for storing "BTM/SearchUI reasons" and outbid data
|
|
if (bid.isBuyout) then
|
|
if bid.isHighBidder then-- If the player is buying out an auction they already bid on, we need to remove the pending bid
|
|
debugPrint('private.databaseRemove(',"postedBids", itemID, bid.name, bid.owner, bid.bid)
|
|
private.databaseRemove("postedBids", itemID, bid.itemLink, bid.owner, bid.count) --remove old entry
|
|
end
|
|
debugPrint('private.databaseAdd(pendingBids', itemID, text)
|
|
private.databaseAdd("postedBids", bid.itemLink, nil, text) --replace with buyout entry.
|
|
else
|
|
debugPrint('private.databaseAdd(pendingBids', itemID, text)
|
|
private.databaseAdd("postedBids", bid.itemLink, nil, text)
|
|
end
|
|
end
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
-- Called when a bid is rejected by the server.
|
|
-------------------------------------------------------------------------------
|
|
function private.onBidFailed()
|
|
private.removePendingBid()
|
|
end
|