initial commit
This commit is contained in:
364
LibTSM/Service/AuctionScanClasses/ResultSubRow.lua
Normal file
364
LibTSM/Service/AuctionScanClasses/ResultSubRow.lua
Normal file
@@ -0,0 +1,364 @@
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
-- 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
|
||||
Reference in New Issue
Block a user