TradeSkillMaster/LibTSM/Service/AuctionScanClasses/ResultSubRow.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