155 lines
4.8 KiB
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
|