153 lines
5.9 KiB
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
|