TradeSkillMaster/Core/Service/Vendoring/Sell.lua

169 lines
5.1 KiB
Lua

-- ------------------------------------------------------------------------------ --
-- TradeSkillMaster --
-- https://tradeskillmaster.com --
-- All Rights Reserved - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ --
local _, TSM = ...
local Sell = TSM.Vendoring:NewPackage("Sell")
local Database = TSM.Include("Util.Database")
local TempTable = TSM.Include("Util.TempTable")
local ItemString = TSM.Include("Util.ItemString")
local ItemInfo = TSM.Include("Service.ItemInfo")
local CustomPrice = TSM.Include("Service.CustomPrice")
local BagTracking = TSM.Include("Service.BagTracking")
local private = {
ignoreDB = nil,
potentialValueDB = nil,
}
-- ============================================================================
-- Module Functions
-- ============================================================================
function Sell.OnInitialize()
local used = TempTable.Acquire()
private.ignoreDB = Database.NewSchema("VENDORING_IGNORE")
:AddUniqueStringField("itemString")
:AddBooleanField("ignoreSession")
:AddBooleanField("ignorePermanent")
:Commit()
private.ignoreDB:BulkInsertStart()
for itemString in pairs(TSM.db.global.userData.vendoringIgnore) do
itemString = ItemString.Get(itemString)
if not used[itemString] then
used[itemString] = true
private.ignoreDB:BulkInsertNewRow(itemString, false, true)
end
end
private.ignoreDB:BulkInsertEnd()
TempTable.Release(used)
private.potentialValueDB = Database.NewSchema("VENDORING_POTENTIAL_VALUE")
:AddUniqueStringField("itemString")
:AddNumberField("potentialValue")
:Commit()
BagTracking.RegisterCallback(private.UpdatePotentialValueDB)
end
function Sell.IgnoreItemSession(itemString)
local row = private.ignoreDB:GetUniqueRow("itemString", itemString)
if row then
assert(not row:GetField("ignoreSession"))
row:SetField("ignoreSession", true)
row:Update()
row:Release()
else
private.ignoreDB:NewRow()
:SetField("itemString", itemString)
:SetField("ignoreSession", true)
:SetField("ignorePermanent", false)
:Create()
end
end
function Sell.IgnoreItemPermanent(itemString)
assert(not TSM.db.global.userData.vendoringIgnore[itemString])
TSM.db.global.userData.vendoringIgnore[itemString] = true
local row = private.ignoreDB:GetUniqueRow("itemString", itemString)
if row then
assert(not row:GetField("ignorePermanent"))
row:SetField("ignorePermanent", true)
row:Update()
row:Release()
else
private.ignoreDB:NewRow()
:SetField("itemString", itemString)
:SetField("ignoreSession", false)
:SetField("ignorePermanent", true)
:Create()
end
end
function Sell.ForgetIgnoreItemPermanent(itemString)
assert(TSM.db.global.userData.vendoringIgnore[itemString])
TSM.db.global.userData.vendoringIgnore[itemString] = nil
local row = private.ignoreDB:GetUniqueRow("itemString", itemString)
assert(row and row:GetField("ignorePermanent"))
if row:GetField("ignoreSession") then
row:SetField("ignorePermanent")
row:Update()
else
private.ignoreDB:DeleteRow(row)
end
row:Release()
end
function Sell.CreateIgnoreQuery()
return private.ignoreDB:NewQuery()
:Equal("ignorePermanent", true)
:InnerJoin(ItemInfo.GetDBForJoin(), "itemString")
:OrderBy("name", true)
end
function Sell.CreateBagsQuery()
local query = BagTracking.CreateQueryBags()
:Distinct("itemString")
:LeftJoin(private.ignoreDB, "itemString")
:InnerJoin(ItemInfo.GetDBForJoin(), "itemString")
:LeftJoin(private.potentialValueDB, "itemString")
:Equal("isBoP", false)
:Equal("isBoA", false)
Sell.ResetBagsQuery(query)
return query
end
function Sell.ResetBagsQuery(query)
query:ResetOrderBy()
query:ResetFilters()
BagTracking.FilterQueryBags(query)
query:NotEqual("ignoreSession", true)
:NotEqual("ignorePermanent", true)
:Equal("isBoP", false)
:Equal("isBoA", false)
:GreaterThan("vendorSell", 0)
:OrderBy("name", true)
end
function Sell.SellItem(itemString, includeSoulbound)
local query = BagTracking.CreateQueryBags()
:OrderBy("slotId", true)
:Select("bag", "slot", "itemString")
:Equal("isBoP", false)
:Equal("isBoA", false)
for _, bag, slot, bagItemString in query:Iterator() do
if itemString == bagItemString and ItemString.Get(GetContainerItemLink(bag, slot)) == itemString then
UseContainerItem(bag, slot)
end
end
query:Release()
end
-- ============================================================================
-- Private Helper Functions
-- ============================================================================
function private.UpdatePotentialValueDB()
private.potentialValueDB:TruncateAndBulkInsertStart()
local query = BagTracking.CreateQueryBags()
:OrderBy("slotId", true)
:Select("itemString")
:Distinct("itemString")
:Equal("isBoP", false)
:Equal("isBoA", false)
for _, itemString in query:Iterator() do
local value = CustomPrice.GetValue(TSM.db.global.vendoringOptions.qsMarketValue, itemString)
if value then
private.potentialValueDB:BulkInsertNewRow(itemString, value)
end
end
query:Release()
private.potentialValueDB:BulkInsertEnd()
end