You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

358 lines
10 KiB

local WIT, core = ...
local TSMHelper = {}
core.TSMHelper = TSMHelper
local version = nil
local priceSources = {
'Custom',
'DBMinBuyout',
'DBMarket',
'DBHistorical',
'DBRegionMinBuyoutAvg',
'DBRegionMarketAvg',
'DBRegionHistorical',
'DBRegionSaleAvg'
}
TSMHelper.PetCageItemId = 82800
function TSMHelper.Initialize()
version = GetAddOnMetadata("TradeSkillMaster", "Version")
end
function TSMHelper.IsValidCustomPrice(customPrice)
return TSM_API.IsCustomPriceValid(customPrice)
end
function TSMHelper.HasCustomPrice(itemId)
return TSMHelper.GetCustomPrice(itemId) ~= nil
end
function TSMHelper.GetCustomPrice(itemId)
if type(itemId) == "string" then
local petId = strsub(itemId, 3)
for _, item in pairs(core.Config.GetCustomItemPrices()) do
if item.PetId == petId then
return item.PriceSource == "" and core.Config.GetPriceSourceString() or item.PriceSource
end
end
else
for _, item in pairs(core.Config.GetCustomItemPrices()) do
if item.ItemId == itemId then
return item.PriceSource == "" and core.Config.GetPriceSourceString() or item.PriceSource
end
end
end
return nil
end
local function getPriceSourceForItem(itemId)
local priceSource = TSMHelper.GetCustomPrice(itemId)
if not priceSource and (type(itemId) == "string" or itemId > 152500) then
priceSource = core.Config.GetPriceSource()
if priceSource == priceSources[1] then
priceSource = core.Config.GetCustomPriceSource()
end
end
if not priceSource and itemId <= 152500 then
priceSource = core.Config.GetLegacyPriceSource()
if priceSource == priceSources[1] then
priceSource = core.Config.GetLegacyCustomPriceSource()
end
end
return priceSource
end
function TSMHelper.GetItemPrice(item, priceSource)
if not TSM_API then
error("TSM addon not found")
end
local itemId = type(item) == "number" and "i:" .. item or item
if not priceSource or TSMHelper.HasCustomPrice(item) then
priceSource = getPriceSourceForItem(item)
end
if not TSMHelper.IsValidCustomPrice(priceSource) then
error("Invalid price source")
end
local value = TSM_API.GetCustomPriceValue(priceSource, itemId)
if value == nil or value == 0 then
local isMoreGeneral = false
for _, alternativePriceSource in pairs(priceSources) do
if isMoreGeneral and (value == nil or value == 0) then
value = TSM_API.GetCustomPriceValue(alternativePriceSource, itemId)
end
if alternativePriceSource == priceSource then
isMoreGeneral = true
end
end
end
return value
end
function TSMHelper.GetItemVendorBuyPrice(item)
if not TSM_API then
error("TSM addon not found")
end
local itemId = type(item) == "number" and "i:" .. item or item
return TSM_API.GetCustomPriceValue('vendorBuy', itemId)
end
function TSMHelper.GetItemVendorSellPrice(item)
if not TSM_API then
error("TSM addon not found")
end
local itemId = type(item) == "number" and "i:" .. item or item
return TSM_API.GetCustomPriceValue('vendorSell', itemId)
end
function TSMHelper.GetItemDestroyingPrice(item)
if not TSM_API then
error("TSM addon not found")
end
local itemId = type(item) == "number" and "i:" .. item or item
return TSM_API.GetCustomPriceValue('Destroy', itemId)
end
function TSMHelper.GetItemSellRate(item)
if not TSM_API then
error("TSM addon not found")
end
local itemId = type(item) == "number" and "i:" .. item or item
return TSM_API.GetCustomPriceValue('DBregionsaleRate*1000', itemId) or 0
end
function TSMHelper.GetItemSoldPerDay(item)
if not TSM_API then
error("TSM addon not found")
end
local itemId = type(item) == "number" and "i:" .. item or item
return TSM_API.GetCustomPriceValue('DBRegionSoldPerDay', itemId)
end
function TSMHelper.GetItemLink(item)
if not TSM_API then
error("TSM addon not found")
end
local id = type(item) == "number" and "i:" .. item or item
return TSM_API.GetItemLink(id)
end
function TSMHelper.GetItemName(item)
if not TSM_API then
error("TSM addon not found")
end
local id = type(item) == "number" and "i:" .. item or item
return TSM_API.GetItemName(id)
end
function TSMHelper.ToMoneyString(value)
if not TSM_API then
error("TSM addon not found")
end
return value ~= nil and TSM_API.FormatMoneyString(value) or ''
end
function TSMHelper.ToColoredMoneyString(value)
if not TSM_API then
error("TSM addon not found")
end
local moneyString = core.TSMHelper.ToMoneyString(value)
if value ~= nil and value < 0 then
moneyString = "|cFFFF0000" .. moneyString:gsub("|r", "|cFFFF0000") .. "|r"
end
return moneyString or ''
end
local function GetItemBelowThresholdValue()
local price = core.TSMHelper.GetItemVendorSellPrice(id)
end
function TSMHelper.GetInventoryValue(priceSource)
for i = 1, 10 do
local value = TSMHelper.GetBagsValue({0, 1, 2, 3, 4}, priceSource)
if value ~= nil then
return value
end
end
return nil
end
function TSMHelper.GetInventoryContent(priceSource)
for i = 1, 10 do
local list = TSMHelper.GetBagsContent({0, 1, 2, 3, 4}, priceSource)
if list ~= nil then
return list
end
end
return nil
end
function TSMHelper.GetBankValue(priceSource)
local bags = { BANK_CONTAINER }
local bankSlots = GetNumBankSlots()
for num = NUM_BAG_SLOTS+1, NUM_BAG_SLOTS+bankSlots do
table.insert(bags, num)
end
for i = 1, 10 do
local value = TSMHelper.GetBagsValue(bags, priceSource)
if value ~= nil then
return value
end
end
return nil
end
function TSMHelper.GetBagsValue(bags, priceSource)
local sum = 0
local isValidData = true
for _, bag in pairs(bags) do
local slots=GetContainerNumSlots(bag)
for slot=1,slots do
local _,c,_,q,_,_,link,_,_,id = GetContainerItemInfo(bag,slot)
if c and id then
local _, _, _, _, _, _, _, _, _, _, itemSellPrice = GetItemInfo(link)
local isBound = C_Item.IsBound(ItemLocation:CreateFromBagAndSlot(bag, slot))
local price = nil
local itemId = id == TSMHelper.PetCageItemId and 'p:'.. strmatch(link,"Hbattlepet:(%d+):") or id
if (isBound and not TSMHelper.HasCustomPrice(itemId)) or core.ScrapHelper.IsJunk(id) or (q ~= nil and q or -1) < core.Config.GetBagValueMinQuality() or (core.TSMHelper.GetItemPrice(itemId, priceSource) or 0) < core.Config.GetBagValueMinPrice() * 10000 then
local belowThresholdValue = core.Config.GetBelowThresholdValue()
if belowThresholdValue == 1 then
price = itemSellPrice or 0
elseif belowThresholdValue == 2 then
price = core.TSMHelper.GetItemDestroyingPrice(id) or itemSellPrice or 0
else
price = 0
end
else
price = core.TSMHelper.GetItemPrice(itemId, priceSource)
end
if price ~= nil then
sum = sum + price * c;
end
elseif GetContainerItemID(bag,slot) then
isValidData = false
end
end
end
if isValidData then
return sum
else
return nil
end
end
function TSMHelper.GetBagsContent(bags, priceSource)
local list = {}
local isValidData = true
for _, bag in pairs(bags) do
local slots=GetContainerNumSlots(bag)
for slot=1,slots do
local _,c,_,q,_,_,link,_,_,id = GetContainerItemInfo(bag,slot)
if c and id then
local _, _, _, _, _, _, _, _, _, _, itemSellPrice = GetItemInfo(link)
local isBound = C_Item.IsBound(ItemLocation:CreateFromBagAndSlot(bag, slot))
local price = nil
local itemId = id == TSMHelper.PetCageItemId and 'p:'.. strmatch(link,"Hbattlepet:(%d+):") or id
if (isBound and not TSMHelper.HasCustomPrice(itemId)) or core.ScrapHelper.IsJunk(id) or (q ~= nil and q or -1) < core.Config.GetBagValueMinQuality() or (core.TSMHelper.GetItemPrice(itemId, priceSource) or 0) < core.Config.GetBagValueMinPrice() * 10000 then
local belowThresholdValue = core.Config.GetBelowThresholdValue()
if belowThresholdValue == 1 then
price = itemSellPrice or 0
elseif belowThresholdValue == 2 then
price = core.TSMHelper.GetItemDestroyingPrice(id) or itemSellPrice or 0
else
price = 0
end
else
price = core.TSMHelper.GetItemPrice(itemId, priceSource)
end
if price ~= nil and price > 0 then
local item
for _, i in pairs(list) do
if i.Id == itemId then
item = i
end
end
if item then
item.Quantity = item.Quantity + c
else
table.insert(list, { Id = itemId, ItemLink = link, Quantity = c, Price = price })
end
end
elseif GetContainerItemID(bag,slot) then
isValidData = false
end
end
end
if isValidData then
return list
else
return nil
end
end
function TSMHelper.GetPriceSources()
return priceSources
end
function TSMHelper.DefaultPriceSource()
return priceSources[3]
end
function TSMHelper.IsTSMAPIAvailable()
return TSM_API ~= nil
end
function TSMHelper.IsTSMDBAvailable()
-- checks if historical price for copper ore or current content ore is available
return (TSM_API.GetCustomPriceValue('DBHistorical', "i:2770") or TSM_API.GetCustomPriceValue('DBHistorical', "i:152512")) ~= nil
end