TradeSkillMaster/Core/Service/Operations/Auctioning.lua

153 lines
5.9 KiB
Lua

-- ------------------------------------------------------------------------------ --
-- TradeSkillMaster --
-- https://tradeskillmaster.com --
-- All Rights Reserved - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ --
local _, TSM = ...
local Auctioning = TSM.Operations:NewPackage("Auctioning")
local private = {}
local L = TSM.Include("Locale").GetTable()
local TempTable = TSM.Include("Util.TempTable")
local Money = TSM.Include("Util.Money")
local OPERATION_INFO = {
-- general
blacklist = { type = "string", default = "" },
ignoreLowDuration = { type = "number", default = 0 },
-- post
postCap = { type = "string", default = "5" },
keepQuantity = { type = "string", default = "0" },
maxExpires = { type = "string", default = "0" },
duration = { type = "number", default = 2, customSanitizeFunction = nil },
bidPercent = { type = "number", default = 1 },
undercut = { type = "string", default = "0c", customSanitizeFunction = nil },
minPrice = { type = "string", default = "check(first(crafting,dbmarket,dbregionmarketavg),max(0.25*avg(crafting,dbmarket,dbregionmarketavg),1.5*vendorsell))" },
maxPrice = { type = "string", default = "check(first(crafting,dbmarket,dbregionmarketavg),max(5*avg(crafting,dbmarket,dbregionmarketavg),30*vendorsell))" },
normalPrice = { type = "string", default = "check(first(crafting,dbmarket,dbregionmarketavg),max(2*avg(crafting,dbmarket,dbregionmarketavg),12*vendorsell))" },
priceReset = { type = "string", default = "none" },
aboveMax = { type = "string", default = "maxPrice" },
-- cancel
cancelUndercut = { type = "boolean", default = true },
cancelRepost = { type = "boolean", default = true },
cancelRepostThreshold = { type = "string", default = "1g" },
}
local OPERATION_VALUE_LIMITS = {
postCap = { min = 0, max = 50000 },
keepQuantity = { min = 0, max = 50000 },
maxExpires = { min = 0, max = 50000 },
}
if TSM.IsWowClassic() then
OPERATION_INFO.undercut.default = "1c"
OPERATION_INFO.matchStackSize = { type = "boolean", default = false }
OPERATION_INFO.stackSize = { type = "string", default = "1" }
OPERATION_INFO.stackSizeIsCap = { type = "boolean", default = false }
OPERATION_VALUE_LIMITS.stackSize = { min = 1, max = 200 }
OPERATION_VALUE_LIMITS.postCap.max = 200
end
-- ============================================================================
-- Module Functions
-- ============================================================================
function Auctioning.OnInitialize()
OPERATION_INFO.duration.customSanitizeFunction = private.SanitizeDuration
OPERATION_INFO.undercut.customSanitizeFunction = private.SanitizeUndercut
TSM.Operations.Register("Auctioning", L["Auctioning"], OPERATION_INFO, 20, private.GetOperationInfo, private.OperationSanitize)
end
function Auctioning.GetMinMaxValues(key)
local info = OPERATION_VALUE_LIMITS[key]
return info and info.min or -math.huge, info and info.max or math.huge
end
function Auctioning.GetMinPrice(itemString)
return private.GetOperationValueHelper(itemString, "minPrice")
end
function Auctioning.GetMaxPrice(itemString)
return private.GetOperationValueHelper(itemString, "maxPrice")
end
function Auctioning.GetNormalPrice(itemString)
return private.GetOperationValueHelper(itemString, "normalPrice")
end
-- ============================================================================
-- Private Helper Functions
-- ============================================================================
function private.OperationSanitize(operation)
if not TSM.IsWowClassic() then
if operation.stackSize then
operation.postCap = tonumber(operation.postCap) * tonumber(operation.stackSize)
end
if (type(operation.undercut) == "number" and operation.undercut or Money.FromString(operation.undercut) or math.huge) < COPPER_PER_SILVER then
operation.undercut = "0c"
end
end
end
function private.SanitizeDuration(value)
-- convert from 12/24/48 durations to 1/2/3 API values
if value == 12 then
return 1
elseif value == 24 then
return 2
elseif value == 48 then
return 3
else
return value
end
end
function private.SanitizeUndercut(value)
if not TSM.IsWowClassic() and (Money.FromString(Money.ToString(value) or value) or math.huge) < COPPER_PER_SILVER then
return "0c"
end
return value
end
function private.GetOperationValueHelper(itemString, key)
local origItemString = itemString
itemString = TSM.Groups.TranslateItemString(itemString)
local operationName, operationSettings = TSM.Operations.GetFirstOperationByItem("Auctioning", itemString)
if not operationName then
return
end
return TSM.Auctioning.Util.GetPrice(key, operationSettings, origItemString)
end
function private.GetOperationInfo(operationSettings)
local parts = TempTable.Acquire()
-- get the post string
if operationSettings.postCap == 0 then
tinsert(parts, L["No posting."])
else
if TSM.IsWowClassic() then
tinsert(parts, format(L["Posting %d stack(s) of %d for %s hours."], operationSettings.postCap, operationSettings.stackSize, strmatch(TSM.CONST.AUCTION_DURATIONS[operationSettings.duration], "%d+")))
else
tinsert(parts, format(L["Posting %d items for %s hours."], operationSettings.postCap, strmatch(TSM.CONST.AUCTION_DURATIONS[operationSettings.duration], "%d+")))
end
end
-- get the cancel string
if operationSettings.cancelUndercut and operationSettings.cancelRepost then
tinsert(parts, format(L["Canceling undercut auctions and to repost higher."]))
elseif operationSettings.cancelUndercut then
tinsert(parts, format(L["Canceling undercut auctions."]))
elseif operationSettings.cancelRepost then
tinsert(parts, format(L["Canceling to repost higher."]))
else
tinsert(parts, L["Not canceling."])
end
local result = table.concat(parts, " ")
TempTable.Release(parts)
return result
end