TradeSkillMaster/Core/Service/TaskList/Expirations.lua

155 lines
4.8 KiB
Lua

-- ------------------------------------------------------------------------------ --
-- TradeSkillMaster --
-- https://tradeskillmaster.com --
-- All Rights Reserved - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ --
local _, TSM = ...
local Expirations = TSM.TaskList:NewPackage("Expirations")
local L = TSM.Include("Locale").GetTable()
local Delay = TSM.Include("Util.Delay")
local Table = TSM.Include("Util.Table")
local ObjectPool = TSM.Include("Util.ObjectPool")
local AuctionTracking = TSM.Include("Service.AuctionTracking")
local MailTracking = TSM.Include("Service.MailTracking")
local private = {
mailTaskPool = ObjectPool.New("EXPIRING_MAIL_TASK", TSM.TaskList.ExpiringMailTask, 0),
auctionTaskPool = ObjectPool.New("EXPIRED_AUCTION_TASK", TSM.TaskList.ExpiredAuctionTask, 0),
activeTasks = {},
expiringMailTasks = {},
expiredAuctionTasks = {},
}
local PLAYER_NAME = UnitName("player")
local DAYS_LEFT_LIMIT = 1
-- ============================================================================
-- Module Functions
-- ============================================================================
function Expirations.OnEnable()
AuctionTracking.RegisterExpiresCallback(Expirations.Update)
MailTracking.RegisterExpiresCallback(private.UpdateDelayed)
TSM.TaskList.RegisterTaskPool(private.ActiveTaskIterator)
private.PopulateTasks()
end
function Expirations.Update()
private.PopulateTasks()
end
-- ============================================================================
-- Private Helper Functions
-- ============================================================================
function private.UpdateDelayed()
Delay.AfterTime("EXPIRATION_UPDATE_DELAYED", 0.5, private.PopulateTasks)
end
function private.ActiveTaskIterator()
return ipairs(private.activeTasks)
end
function private.PopulateTasks()
local minPendingCooldown = math.huge
wipe(private.activeTasks)
for _, task in pairs(private.expiringMailTasks) do
task:WipeCharacters()
end
for _, task in pairs(private.expiredAuctionTasks) do
task:WipeCharacters()
end
-- expiring mails
for k, v in pairs(TSM.db.factionrealm.internalData.expiringMail) do
local task = private.expiringMailTasks["ExpiringMails"]
if not task then
task = private.mailTaskPool:Get()
task:Acquire(private.RemoveMailTask, L["Expirations"])
private.expiringMailTasks["ExpiringMails"] = task
end
local expiration = (v - time()) / 24 / 60 / 60
if expiration <= DAYS_LEFT_LIMIT * -1 then
TSM.db.factionrealm.internalData.expiringMail[PLAYER_NAME] = nil
else
if not task:HasCharacter(k) and expiration <= DAYS_LEFT_LIMIT then
task:AddCharacter(k, expiration)
end
if expiration > 0 and expiration <= DAYS_LEFT_LIMIT then
minPendingCooldown = min(minPendingCooldown, expiration * 24 * 60 * 60)
else
minPendingCooldown = min(minPendingCooldown, (expiration + DAYS_LEFT_LIMIT) * 24 * 60 * 60)
end
end
end
for character, task in pairs(private.expiringMailTasks) do
if task:HasCharacters() then
tinsert(private.activeTasks, task)
task:Update()
else
private.expiringMailTasks[character] = nil
task:Release()
private.mailTaskPool:Recycle(task)
end
end
-- expired auctions
for k, v in pairs(TSM.db.factionrealm.internalData.expiringAuction) do
local task = private.expiredAuctionTasks["ExpiredAuctions"]
if not task then
task = private.auctionTaskPool:Get()
task:Acquire(private.RemoveAuctionTask, L["Expirations"])
private.expiredAuctionTasks["ExpiredAuctions"] = task
end
local expiration = (v - time()) / 24 / 60 / 60
if expiration > 0 and expiration <= DAYS_LEFT_LIMIT then
minPendingCooldown = min(minPendingCooldown, expiration * 24 * 60 * 60)
else
if not task:HasCharacter(k) then
task:AddCharacter(k, expiration)
end
end
end
for character, task in pairs(private.expiredAuctionTasks) do
if task:HasCharacters() then
tinsert(private.activeTasks, task)
task:Update()
else
private.expiredAuctionTasks[character] = nil
task:Release()
private.auctionTaskPool:Recycle(task)
end
end
TSM.TaskList.OnTaskUpdated()
if minPendingCooldown ~= math.huge and minPendingCooldown < DAYS_LEFT_LIMIT then
Delay.AfterTime("EXPIRATION_UPDATE", minPendingCooldown, private.PopulateTasks)
else
Delay.Cancel("EXPIRATION_UPDATE")
end
end
function private.RemoveMailTask(task)
assert(Table.RemoveByValue(private.activeTasks, task) == 1)
task:Release()
private.mailTaskPool:Recycle(task)
TSM.TaskList.OnTaskUpdated()
end
function private.RemoveAuctionTask(task)
assert(Table.RemoveByValue(private.activeTasks, task) == 1)
task:Release()
private.auctionTaskPool:Recycle(task)
TSM.TaskList.OnTaskUpdated()
end