365 lines
12 KiB
Lua
365 lines
12 KiB
Lua
-- ------------------------------------------------------------------------------ --
|
|
-- TradeSkillMaster --
|
|
-- https://tradeskillmaster.com --
|
|
-- All Rights Reserved - Detailed license information included with addon. --
|
|
-- ------------------------------------------------------------------------------ --
|
|
|
|
local _, TSM = ...
|
|
local ResultSubRow = TSM.Init("Service.AuctionScanClasses.ResultSubRow")
|
|
local ItemString = TSM.Include("Util.ItemString")
|
|
local ObjectPool = TSM.Include("Util.ObjectPool")
|
|
local Math = TSM.Include("Util.Math")
|
|
local ItemInfo = TSM.Include("Service.ItemInfo")
|
|
local LibTSMClass = TSM.Include("LibTSMClass")
|
|
local Util = TSM.Include("Service.AuctionScanClasses.Util")
|
|
local ResultSubRowWrapper = LibTSMClass.DefineClass("ResultSubRowWrapper")
|
|
local private = {
|
|
objectPool = ObjectPool.New("AUCTION_SCAN_RESULT_SUB_ROW", ResultSubRowWrapper),
|
|
ownersTemp = {},
|
|
}
|
|
|
|
|
|
|
|
-- ============================================================================
|
|
-- Module Functions
|
|
-- ============================================================================
|
|
|
|
function ResultSubRow.Get(resultRow)
|
|
local subRow = private.objectPool:Get()
|
|
subRow:_Acquire(resultRow)
|
|
return subRow
|
|
end
|
|
|
|
|
|
|
|
-- ============================================================================
|
|
-- ResultSubRowWrapper - Meta Class Methods
|
|
-- ============================================================================
|
|
|
|
function ResultSubRowWrapper.__init(self)
|
|
self._resultRow = nil
|
|
self._itemLink = nil
|
|
self._buyout = nil
|
|
self._minBid = nil
|
|
self._currentBid = nil
|
|
self._minIncrement = nil
|
|
self._isHighBidder = nil
|
|
self._quantity = nil
|
|
self._timeLeft = nil
|
|
self._ownerStr = nil
|
|
self._hasOwners = false
|
|
self._numOwnerItems = nil
|
|
self._auctionId = nil
|
|
self._hash = nil
|
|
self._hashNoSeller = nil
|
|
self._browseId = nil
|
|
self._numAuctions = 1
|
|
end
|
|
|
|
function ResultSubRowWrapper._Acquire(self, resultRow)
|
|
self._resultRow = resultRow
|
|
end
|
|
|
|
|
|
|
|
-- ============================================================================
|
|
-- ResultSubRowWrapper - Public Class Methods
|
|
-- ============================================================================
|
|
|
|
function ResultSubRowWrapper.Merge(self, other)
|
|
if TSM.IsWowClassic() then
|
|
self._numAuctions = self._numAuctions + other._numAuctions
|
|
else
|
|
if self:IsCommodity() then
|
|
self._quantity = self._quantity + other._quantity
|
|
self._numOwnerItems = self._numOwnerItems + other._numOwnerItems
|
|
else
|
|
self._numAuctions = self._numAuctions + other._numAuctions
|
|
end
|
|
end
|
|
end
|
|
|
|
function ResultSubRowWrapper.Release(self)
|
|
self._resultRow = nil
|
|
self._numAuctions = 1
|
|
self:_SetRawData(nil)
|
|
private.objectPool:Recycle(self)
|
|
end
|
|
|
|
function ResultSubRowWrapper.IsSubRow(self)
|
|
return true
|
|
end
|
|
|
|
function ResultSubRowWrapper.HasRawData(self)
|
|
return self._timeLeft and true or false
|
|
end
|
|
|
|
function ResultSubRowWrapper.HasOwners(self)
|
|
return self._hasOwners
|
|
end
|
|
|
|
function ResultSubRowWrapper.HasItemString(self)
|
|
assert(self:HasRawData())
|
|
local itemString = ItemString.Get(self._itemLink)
|
|
if not Util.HasItemInfo(itemString) then
|
|
return false
|
|
end
|
|
return true
|
|
end
|
|
|
|
function ResultSubRowWrapper.IsCommodity(self)
|
|
return self._resultRow:IsCommodity()
|
|
end
|
|
|
|
function ResultSubRowWrapper.GetResultRow(self)
|
|
return self._resultRow
|
|
end
|
|
|
|
function ResultSubRowWrapper.GetBaseItemString(self)
|
|
return self._resultRow:GetBaseItemString()
|
|
end
|
|
|
|
function ResultSubRowWrapper.GetItemString(self)
|
|
assert(self:HasRawData())
|
|
local itemString = ItemString.Get(self._itemLink)
|
|
return itemString or self._resultRow:GetItemString()
|
|
end
|
|
|
|
function ResultSubRowWrapper.GetItemInfo(self)
|
|
assert(self:HasItemString())
|
|
local itemString = ItemString.Get(self._itemLink)
|
|
local itemName = ItemInfo.GetName(itemString)
|
|
local quality = ItemInfo.GetQuality(itemString)
|
|
local itemLevel = ItemInfo.GetItemLevel(itemString)
|
|
assert(itemName and quality and itemLevel)
|
|
return itemName, quality, itemLevel, nil
|
|
end
|
|
|
|
function ResultSubRowWrapper.GetBuyouts(self)
|
|
assert(self:HasRawData())
|
|
return self._buyout, floor(self._buyout / self._quantity), nil
|
|
end
|
|
|
|
function ResultSubRowWrapper.GetBidInfo(self)
|
|
assert(self:HasRawData())
|
|
local itemMinBid = Math.Floor(self._minBid / self._quantity, TSM.IsWowClassic() and 1 or COPPER_PER_SILVER)
|
|
return self._minBid, itemMinBid, self._currentBid, self._isHighBidder, self._minIncrement
|
|
end
|
|
|
|
function ResultSubRowWrapper.GetRequiredBid(self)
|
|
local requiredBid = nil
|
|
if TSM.IsWowClassic() then
|
|
requiredBid = self._currentBid == 0 and self._minBid or (self._currentBid + self._minIncrement)
|
|
else
|
|
requiredBid = self._minBid
|
|
end
|
|
return requiredBid
|
|
end
|
|
|
|
function ResultSubRowWrapper.GetDisplayedBids(self)
|
|
local displayedBid = self._currentBid == 0 and self._minBid or self._currentBid
|
|
local itemDisplayedBid = Math.Floor(displayedBid / self._quantity, TSM.IsWowClassic() and 1 or COPPER_PER_SILVER)
|
|
return displayedBid, itemDisplayedBid
|
|
end
|
|
|
|
function ResultSubRowWrapper.GetLinks(self)
|
|
assert(self:HasRawData())
|
|
local rawLink = self._itemLink
|
|
local itemLink = ItemInfo.GeneralizeLink(rawLink)
|
|
return itemLink, rawLink
|
|
end
|
|
|
|
function ResultSubRowWrapper.GetListingInfo(self)
|
|
assert(self:HasRawData())
|
|
return self._timeLeft, self._auctionId, self._browseId
|
|
end
|
|
|
|
function ResultSubRowWrapper.GetQuantities(self)
|
|
assert(self:HasRawData())
|
|
return self._quantity, self._numAuctions
|
|
end
|
|
|
|
function ResultSubRowWrapper.GetOwnerInfo(self)
|
|
assert(self:HasRawData())
|
|
return self._ownerStr, self._numOwnerItems
|
|
end
|
|
|
|
function ResultSubRowWrapper.GetHashes(self)
|
|
if not self._hash then
|
|
assert(self:HasRawData())
|
|
if TSM.IsWowClassic() then
|
|
self._hash = strjoin("~", tostringall(self._itemLink, self._minBid, self._minIncrement, self._buyout, self._currentBid, self._ownerStr, self._timeLeft, self._quantity, self._isHighBidder))
|
|
self._hashNoSeller = strjoin("~", tostringall(self._itemLink, self._minBid, self._minIncrement, self._buyout, self._currentBid, self._timeLeft, self._quantity, self._isHighBidder))
|
|
else
|
|
local baseItemString = self:GetBaseItemString()
|
|
local itemMinBid = Math.Floor(self._minBid / self._quantity, COPPER_PER_SILVER)
|
|
local itemBuyout = floor(self._buyout / self._quantity)
|
|
local itemKeyId, itemKeySpeciesId = nil, nil
|
|
if ItemString.IsPet(baseItemString) then
|
|
itemKeyId = ItemString.ToId(ItemString.GetPetCage())
|
|
itemKeySpeciesId = ItemString.ToId(baseItemString)
|
|
elseif ItemString.IsItem(baseItemString) then
|
|
itemKeyId = ItemString.ToId(baseItemString)
|
|
itemKeySpeciesId = 0
|
|
else
|
|
error("Invalid baseItemString: "..tostring(baseItemString))
|
|
end
|
|
if self:IsCommodity() then
|
|
self._hash = strjoin("~", tostringall(itemKeyId, itemBuyout, self._auctionId, self._ownerStr))
|
|
self._hashNoSeller = strjoin("~", tostringall(itemKeyId, itemBuyout, self._auctionId))
|
|
else
|
|
self._hash = strjoin("~", tostringall(itemKeyId, itemKeySpeciesId, self._itemLink, itemMinBid, itemBuyout, self._currentBid, self._quantity, self._isHighBidder, self._ownerStr, self._auctionId))
|
|
self._hashNoSeller = strjoin("~", tostringall(itemKeyId, itemKeySpeciesId, self._itemLink, itemMinBid, itemBuyout, self._currentBid, self._quantity, self._isHighBidder, self._auctionId))
|
|
end
|
|
end
|
|
end
|
|
return self._hash, self._hashNoSeller
|
|
end
|
|
|
|
function ResultSubRowWrapper.EqualsIndex(self, index, noSeller)
|
|
assert(TSM.IsWowClassic())
|
|
local _, _, stackSize, _, _, _, _, minBid, minIncrement, buyout, bid, isHighBidder, _, seller, sellerFull = GetAuctionItemInfo("list", index)
|
|
seller = Util.FixSellerName(seller, sellerFull) or "?"
|
|
-- this is to get around a bug in Blizzard's code where the minIncrement value will be inconsistent for auctions where the player is the highest bidder
|
|
minIncrement = isHighBidder and 0 or minIncrement
|
|
if minBid ~= self._minBid or minIncrement ~= self._minIncrement or buyout ~= self._buyout or bid ~= self._currentBid or stackSize == self._quantity and isHighBidder ~= self._isHighBidder then
|
|
return false
|
|
elseif not noSeller and seller ~= self._ownerStr then
|
|
return false
|
|
elseif GetAuctionItemLink("list", index) ~= self._itemLink then
|
|
return false
|
|
elseif GetAuctionItemTimeLeft("list", index) ~= self._timeLeft then
|
|
return false
|
|
end
|
|
return true
|
|
end
|
|
|
|
function ResultSubRowWrapper.DecrementQuantity(self, amount)
|
|
if TSM.IsWowClassic() then
|
|
assert(amount == self._quantity)
|
|
self._numAuctions = self._numAuctions - 1
|
|
if self._numAuctions == 0 then
|
|
self._resultRow:RemoveSubRow(self)
|
|
end
|
|
else
|
|
if self:IsCommodity() then
|
|
self._resultRow:DecrementQuantity(amount)
|
|
else
|
|
assert(amount == 1 and amount == self._quantity)
|
|
self._numAuctions = self._numAuctions - 1
|
|
assert(self._numOwnerItems <= self._numAuctions)
|
|
if self._numAuctions == 0 then
|
|
self._resultRow:RemoveSubRow(self)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function ResultSubRowWrapper.UpdateResultInfo(self, newAuctionId, newResultInfo)
|
|
if newResultInfo then
|
|
self:_SetRawData(newResultInfo, self._browseId)
|
|
else
|
|
self._auctionId = newAuctionId
|
|
self._hash = nil
|
|
self._hashNoSeller = nil
|
|
end
|
|
end
|
|
|
|
|
|
|
|
-- ============================================================================
|
|
-- ResultRowWrapper - Private Class Methods
|
|
-- ============================================================================
|
|
|
|
function ResultSubRowWrapper._SetRawData(self, data, browseId, itemLink)
|
|
self._hash = nil
|
|
self._hashNoSeller = nil
|
|
self._browseId = browseId
|
|
if data then
|
|
if TSM.IsWowClassic() then
|
|
local _, _, stackSize, _, _, _, _, minBid, minIncrement, buyout, bid, isHighBidder, _, seller, sellerFull = GetAuctionItemInfo("list", data)
|
|
seller = Util.FixSellerName(seller, sellerFull)
|
|
-- this is to get around a bug in Blizzard's code where the minIncrement value will be inconsistent for auctions where the player is the highest bidder
|
|
minIncrement = isHighBidder and 0 or minIncrement
|
|
self._itemLink = itemLink
|
|
self._buyout = buyout
|
|
self._minBid = minBid
|
|
self._currentBid = bid
|
|
self._minIncrement = minIncrement
|
|
self._isHighBidder = isHighBidder
|
|
self._quantity = stackSize
|
|
self._timeLeft = GetAuctionItemTimeLeft("list", data)
|
|
self._ownerStr = seller or "?"
|
|
self._hasOwners = seller and true or false
|
|
self._numOwnerItems = 0
|
|
self._auctionId = 0
|
|
else
|
|
if self._resultRow:IsCommodity() then
|
|
local baseItemString = self._resultRow:GetBaseItemString()
|
|
self._itemLink = ItemInfo.GetLink(baseItemString)
|
|
else
|
|
self._itemLink = data.itemLink
|
|
end
|
|
|
|
if self:IsCommodity() then
|
|
self._quantity = data.quantity
|
|
self._buyout = data.unitPrice * data.quantity
|
|
self._minBid = self._buyout
|
|
self._currentBid = 0
|
|
self._minIncrement = 0
|
|
self._isHighBidder = data.bidder and data.bidder == UnitGUID("player") or false
|
|
self._numOwnerItems = data.numOwnerItems or 0
|
|
-- convert the timeLeftSeconds to regular timeLeft
|
|
if data.timeLeftSeconds < 60 * 60 then
|
|
self._timeLeft = 1
|
|
elseif data.timeLeftSeconds < 2 * 60 * 60 then
|
|
self._timeLeft = 2
|
|
elseif data.timeLeftSeconds < 12 * 60 * 60 then
|
|
self._timeLeft = 3
|
|
else
|
|
self._timeLeft = 4
|
|
end
|
|
else
|
|
self._quantity = 1
|
|
self._numAuctions = data.quantity
|
|
self._buyout = data.buyoutAmount or 0
|
|
self._minBid = data.minBid or data.buyoutAmount
|
|
self._currentBid = data.bidAmount or 0
|
|
self._minIncrement = 0
|
|
self._isHighBidder = false
|
|
self._numOwnerItems = data.containsAccountItem and data.quantity or 0
|
|
self._timeLeft = data.timeLeft + 1
|
|
end
|
|
|
|
self._hasOwners = #data.owners > 0
|
|
assert(#private.ownersTemp == 0)
|
|
for _, owner in ipairs(data.owners) do
|
|
if owner == "player" then
|
|
owner = UnitName("player")
|
|
elseif owner == "" then
|
|
owner = "?"
|
|
self._hasOwners = false
|
|
end
|
|
tinsert(private.ownersTemp, owner)
|
|
end
|
|
self._ownerStr = table.concat(private.ownersTemp, ",")
|
|
wipe(private.ownersTemp)
|
|
self._auctionId = data.auctionID
|
|
end
|
|
assert(self._itemLink and self._quantity and self._buyout and self._minBid and self._currentBid and self._numOwnerItems and self._timeLeft and self._ownerStr and self._auctionId)
|
|
else
|
|
self._itemLink = nil
|
|
self._buyout = nil
|
|
self._minBid = nil
|
|
self._currentBid = nil
|
|
self._minIncrement = nil
|
|
self._isHighBidder = nil
|
|
self._quantity = nil
|
|
self._timeLeft = nil
|
|
self._ownerStr = nil
|
|
self._hasOwners = false
|
|
self._numOwnerItems = nil
|
|
self._auctionId = nil
|
|
end
|
|
end
|