TradeSkillMaster/Core/Service/Accounting/Merchant.lua

134 lines
4.6 KiB
Lua

-- ------------------------------------------------------------------------------ --
-- TradeSkillMaster --
-- https://tradeskillmaster.com --
-- All Rights Reserved - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ --
local _, TSM = ...
local Merchant = TSM.Accounting:NewPackage("Merchant")
local Event = TSM.Include("Util.Event")
local Math = TSM.Include("Util.Math")
local ItemString = TSM.Include("Util.ItemString")
local ItemInfo = TSM.Include("Service.ItemInfo")
local private = {
repairMoney = 0,
couldRepair = nil,
repairCost = 0,
pendingSales = {
itemString = {},
quantity = {},
copper = {},
insertTime = {},
},
}
-- ============================================================================
-- Module Functions
-- ============================================================================
function Merchant.OnInitialize()
Event.Register("MERCHANT_SHOW", private.SetupRepairCost)
Event.Register("BAG_UPDATE_DELAYED", private.OnMerchantUpdate)
Event.Register("UPDATE_INVENTORY_DURABILITY", private.AddRepairCosts)
Event.Register("MERCHANT_CLOSED", private.OnMerchantClosed)
hooksecurefunc("UseContainerItem", private.CheckMerchantSale)
hooksecurefunc("BuyMerchantItem", private.OnMerchantBuy)
hooksecurefunc("BuybackItem", private.OnMerchantBuyback)
end
-- ============================================================================
-- Repair Cost Tracking
-- ============================================================================
function private.SetupRepairCost()
private.repairMoney = GetMoney()
private.couldRepair = CanMerchantRepair()
-- if merchant can repair set up variables so we can track repairs
if private.couldRepair then
private.repairCost = GetRepairAllCost()
end
end
function private.OnMerchantUpdate()
-- Could have bought something before or after repair
private.repairMoney = GetMoney()
-- log any pending sales
for i, insertTime in ipairs(private.pendingSales.insertTime) do
if GetTime() - insertTime < 5 then
TSM.Accounting.Transactions.InsertVendorSale(private.pendingSales.itemString[i], private.pendingSales.quantity[i], private.pendingSales.copper[i])
end
end
wipe(private.pendingSales.itemString)
wipe(private.pendingSales.quantity)
wipe(private.pendingSales.copper)
wipe(private.pendingSales.insertTime)
end
function private.AddRepairCosts()
if private.couldRepair and private.repairCost > 0 then
local cash = GetMoney()
if private.repairMoney > cash then
-- this is probably a repair bill
local cost = private.repairMoney - cash
TSM.Accounting.Money.InsertRepairBillExpense(cost)
-- reset money as this might have been a single item repair
private.repairMoney = cash
-- reset the repair cost for the next repair
private.repairCost = GetRepairAllCost()
end
end
end
function private.OnMerchantClosed()
private.couldRepair = nil
private.repairCost = 0
end
-- ============================================================================
-- Merchant Purchases / Sales Tracking
-- ============================================================================
function private.CheckMerchantSale(bag, slot, onSelf)
-- check if we are trying to sell something to a vendor
if (not MerchantFrame:IsShown() and not TSM.UI.VendoringUI.IsVisible()) or onSelf then
return
end
local itemString = ItemString.Get(GetContainerItemLink(bag, slot))
local _, quantity = GetContainerItemInfo(bag, slot)
local copper = ItemInfo.GetVendorSell(itemString)
if not itemString or not quantity or not copper then
return
end
tinsert(private.pendingSales.itemString, itemString)
tinsert(private.pendingSales.quantity, quantity)
tinsert(private.pendingSales.copper, copper)
tinsert(private.pendingSales.insertTime, GetTime())
end
function private.OnMerchantBuy(index, quantity)
local _, _, price, batchQuantity = GetMerchantItemInfo(index)
local itemString = ItemString.Get(GetMerchantItemLink(index))
if not itemString or not price or price <= 0 then
return
end
quantity = quantity or batchQuantity
local copper = Math.Round(price / batchQuantity)
TSM.Accounting.Transactions.InsertVendorBuy(itemString, quantity, copper)
end
function private.OnMerchantBuyback(index)
local _, _, price, quantity = GetBuybackItemInfo(index)
local itemString = ItemString.Get(GetBuybackItemLink(index))
if not itemString or not price or price <= 0 then
return
end
local copper = Math.Round(price / quantity)
TSM.Accounting.Transactions.InsertVendorBuy(itemString, quantity, copper)
end