diff --git a/Titan/TitanHistory.lua b/Titan/TitanHistory.lua
index 1aaa3c1..004ccfc 100644
--- a/Titan/TitanHistory.lua
+++ b/Titan/TitanHistory.lua
@@ -10,8 +10,8 @@ These are in a seperate file to
--- Release notes. Keep structure; most recent on 'top'
local recent_changes = {
{
- version = "9.1.0",
- when = "2026/01/02",
+ version = "9.0.2",
+ when = "2026/01/12",
topics = {
{
topic = "Titan TOC",
@@ -32,16 +32,6 @@ local recent_changes = {
},
},
{
- topic = "TitanPost",
- lines = {
- "New Built-in plugin",
- "Button info: ",
- ": ?? read/total from last open; ?? - not opened this session.",
- ": ++ new mail this session; number not shown; cleared on open Mail.",
- ": !! number of toons with expiring mail.",
- },
- },
- {
topic = "Titan Config > Profile",
lines = {
"Added Mail info - if enabled and running.",
diff --git a/TitanPost/TitanPost.lua b/TitanPost/TitanPost.lua
deleted file mode 100644
index a3a7698..0000000
--- a/TitanPost/TitanPost.lua
+++ /dev/null
@@ -1,942 +0,0 @@
--- **************************************************************************
--- * TitanPost.lua
--- *
--- * By: The Titan Panel Development Team
--- **************************************************************************
-
--- ******************************** Constants *******************************
-local _G = getfenv(0);
-local TITAN_POST_ID = "Post";
-local TITAN_BUTTON = "TitanPanel" .. TITAN_POST_ID .. "Button"
-
--- Constants
-local FolderPre = "Interface\\AddOns\\TitanPost\\artwork\\"
-
--- Local variables
-local L = LibStub("AceLocale-3.0"):GetLocale("Titan", true)
-local AceConfigDialog = LibStub("AceConfigDialog-3.0")
-local AceTimer = LibStub("AceTimer-3.0")
-local AceHook = LibStub("AceHook-3.0")
-
-local mailbox = {} -- default on load; store display info here
---mailbox.opened = false
-mailbox.open_now = false
-mailbox.new = 0
-mailbox.expiry_text = ""
-mailbox.expiry_num = 0
-mailbox.ignore_next_pending = false
-
-local player = TitanUtils_GetPlayer()
-local debug = false;
-local SECONDS_PER_DAY = 24 * 60 * 60
-local SECONDS_PER_HOUR = 60 * 60
-local MAX_MAIL_DAYS = 30
-
-local expiry_warn_days = 7
-local expiry_err_days = 2
-
-local DAYS_REM = "Days Remaining"
-local MAIL_OPENED = "Opened"
-local CHAR = "Character"
-
-local READ_PRE = " ?? "
-local NEW_PRE = " ++ "
-local EXP_PRE = " !! "
-local READ_TT_POST = " : About read / total "
-local NEW_TT_POST = " : New Mail this session "
-local EXP_TT_POST = " : Characters with expiring Mail "
-local MAIL_TT_PRE = "Mail opened : "
-
-TitanPost = {}
-TitanPost.mailbox = mailbox
-
-----------------------------------------------------------------------------------
-
-function Debug(str)
- if (debug) then
- DEFAULT_CHAT_FRAME:AddMessage("TitanPost "
- .. date("%H:%M:%S ", _G.time())
- .. str
- );
- end
-end
-
-local ThresholdTable = {
- Values = { expiry_err_days, expiry_warn_days },
- Colors = { RED_FONT_COLOR, YELLOW_FONT_COLOR, GREEN_FONT_COLOR },
-}
-local ex_header = " " .. CHAR .. " : " .. DAYS_REM .. " : " .. MAIL_OPENED .. "\n"
-
-local date_stamp = "%Y-%m-%d"
-local time_stamp = "%H:%M"
-
----Format time stamp
----@param time_sec number timestamp
----@param with_time boolean add time
----@return string Timestamp Formatted
-local function FormatTS(time_sec, with_time)
- local f = date_stamp
- if with_time then
- f = f .. " " .. time_stamp
- else
- -- just date w/o time
- end
- local str = date(f, time_sec)
-
- return str
-end
-
----Start / stop the timer to check expiry
----@param action string 'start' | 'stop'
-local function ExpiryTimer(action) end -- real declaration later...
-
----Format an expiry text for a single toon
----@param toon_name string
----@param toon_info table toon
----@return string
-local function ShowExpiry(toon_name, toon_info)
- local now = _G.time()
- local res = ""
- local use_color = true -- TitanGetVar(TITAN_POST_ID, "ShowColoredText")
-
- local days = math.floor((toon_info.nextExpiry - now) / SECONDS_PER_DAY)
- local last = toon_info.lastUpdate_str
- local estr = toon_name
- .. " : " .. days
- .. " : " .. last
- .. "\n"
- if (use_color == true)
- or (use_color == 1) then
- local color = TitanUtils_GetThresholdColor(ThresholdTable, days);
- estr = TitanUtils_GetColoredText(estr, color)
- else
- -- leave alone
- end
-
- res = res .. estr
-
- local str = "...ShowExpiry"
- .. " " .. tostring(toon_name) .. ""
- .. " " .. tostring(days) .. ""
- .. " " .. tostring(last) .. ""
- -- .." "..tostring(color)..""
- .. " \n" .. tostring(res) .. ""
- Debug(str)
-
- return res
-end
-
----Create time stamp from warning days + now
----@return integer Timestamp
-local function ExpiryWarn()
- local now = _G.time()
- return (expiry_warn_days * SECONDS_PER_DAY) + now -- make timestamp
-end
-
----Check the saved vars for expiring mail, only from last time that toon opened mail
----@return integer Num of toons with expiring mail
----@return string Display text with name, num, and last time mail was opened
-local function CheckExpiry()
- local expiry_check = ExpiryWarn()
- local res = ""
- local exp_str = ""
-
- local has_expiry = false
- local expiry_toons = 0
- local expiry_low = expiry_check + 1
-
- local str = ""
-
- str = "CheckExpiry"
- .. " @ " .. FormatTS(expiry_check, true)
- .. " (" .. tostring(expiry_check) .. ")"
- Debug(str)
-
- for toon_name, characterList in pairs(TitanPostDB) do
- str = ".CheckExpiry"
- .. " " .. tostring(toon_name) .. ""
- .. " # " .. tostring(characterList.mailCount) .. ""
- -- Debug(str)
- if (characterList.mailCount > 0) then
- str = "...CheckExpiry"
- .. " [" .. tostring(characterList.nextExpiry_str) .. "]"
- .. " " .. tostring(characterList.nextExpiry) .. ""
- .. " < " .. tostring(expiry_check) .. ""
- .. " = " .. tostring((characterList.nextExpiry < expiry_check)) .. ""
- -- Debug(str)
- if (characterList.nextExpiry < expiry_check) then -- add to list for user
- has_expiry = true
-
- local estr = ShowExpiry(toon_name, characterList)
-
- exp_str = exp_str .. estr
- expiry_toons = expiry_toons + 1 -- count the number of toons with expiring mail
- else
- -- still time
- end
- else
- -- no mail
- end
- end
- if has_expiry then -- add prefix for user
- res = "Expired: " .. " " .. tostring(expiry_toons) .. "\n"
- res = res .. ex_header
- res = res .. exp_str
- else
- -- still time
- end
-
- ExpiryTimer('start')
-
- str = "=CheckExpiry"
- .. " " .. tostring(expiry_toons) .. ""
- .. " \n" .. tostring(res) .. ""
- Debug(str)
-
- return expiry_toons, res
-end
-
-local expiry_timer = nil
-function ExpiryTimer(action) -- prior declaration
- if action == 'start' then
- -- stop current, just in case for sanity
- if expiry_timer == nil then
- -- no timer
- else
- AceTimer.CancelTimer(_G[TITAN_BUTTON], expiry_timer)
- end
- local time_int = TitanGetVar(TITAN_POST_ID, "ExpiryTimer")
- expiry_timer =
- AceTimer.ScheduleRepeatingTimer(_G[TITAN_BUTTON], CheckExpiry, time_int * 60) -- in seconds
- local str = "Expiry next check in"
- .. " " .. tostring(time_int) .. " minutes"
- Debug(str)
- elseif action == 'stop' then
- if expiry_timer == nil then
- -- no timer
- else
- AceTimer.CancelTimer(_G[TITAN_BUTTON], expiry_timer)
- expiry_timer = nil
- end
- end
-
- local str = "ExpiryTimer"
- .. " " .. tostring(action) .. ""
- Debug(str)
-end
-
----Create an x/y string for Mail
----@param playerName string
----@param addOpen boolean
----@return string
-local function GetCountsStr(playerName, addOpen)
- local toon = TitanPostDB[playerName]
- local res = ""
-
- if addOpen then
- if toon.opened then
- res = res .. " " -- counts should be accurate for this session
- else
- res = res .. READ_PRE -- counts may not be accurate
- end
- end
-
- if (toon.lastUpdate == 0) then
- res = res .. L["TITAN_PANEL_NA"] --NOT_OPENED yet
- else
- if toon.mailCount > 0 then
- res = res .. toon.mailReadNum .. "/" .. toon.mailCount
- else
- -- leave 0 as blank
- end
- end
-
- return res
-end
-
----Create plugin text
----@param id string
----@return string Label
----@return string Display text
-local function GetButtonText(id)
- local res = ""
-
- res = res .. GetCountsStr(player, true)
-
- local new = ""
- if (mailbox.new > 0) then
- new = NEW_PRE -- .. tostring(mailbox.new)
- else
- new = ""
- end
-
- local expiry = ""
- if (mailbox.expiry_num > 0) then
- expiry = EXP_PRE .. tostring(mailbox.expiry_num)
- else
- expiry = ""
- end
-
- res = res .. new .. expiry
-
- return "Mail : ", res
-end
-
----Create a tool tip
----@return string
-function GetTooltipText()
- local str = ""
- local res = ""
-
- local toon = TitanPostDB[player]
- res = MAIL_TT_PRE .. tostring(toon.lastUpdate_str) .. "\n"
- res = res .. " "
- .. GetCountsStr(player, true)
- .. READ_TT_POST .. "\n"
-
-
- local new = ""
- if (mailbox.new > 0) then
- -- new = NEW_PRE .. tostring(mailbox.new) .. NEW_TT_POST .. "\n"
- new = NEW_PRE .. NEW_TT_POST .. "\n"
- else
- new = ""
- end
-
- local expiry = ""
- if (mailbox.expiry_num > 0) then
- expiry = EXP_PRE .. tostring(mailbox.expiry_num) .. EXP_TT_POST .. "\n"
- else
- expiry = ""
- end
-
- res = res .. new .. expiry
- res = res .. "\n"
- res = res .. mailbox.expiry_text .. "\n"
-
- return res
-end
-
----Look at any mail, setting data for action
-local function UpdateInboxData()
- if not _G.MailFrame:IsVisible() then
- return
- end
-
- local inboxCount, totalCount = _G.GetInboxNumItems()
- local playerData = TitanPostDB[player]
- local remainingDays = MAX_MAIL_DAYS
- local mailReadNum = 0
-
- table.wipe(playerData.mailEntries)
- local now = _G.time()
-
- local str = "UpdateInboxData"
- .. " " .. tostring(playerData) .. ""
- .. " #" .. tostring(inboxCount) .. ""
- .. " #" .. tostring(totalCount) .. ""
- Debug(str)
-
- for index = 1, inboxCount do
- -- https://warcraft.wiki.gg/wiki/API_GetInboxHeaderInfo
- -- packageIcon, stationeryIcon, sender, subject, money, CODAmount, daysLeft, hasItem, wasRead,
- -- wasReturned, textCreated, canReply, isGM = GetInboxHeaderInfo(index)
- -- as of 2025 Dec
- local _, _, senderName, subject, _, CODAmount, daysLeft, _, wasRead,
- _, _, _, _ = _G.GetInboxHeaderInfo(index)
-
- if _G.type(daysLeft) == nil then -- sanity check
- daysLeft = MAX_MAIL_DAYS
- end
-
- if daysLeft < remainingDays then -- get shortest expiry
- remainingDays = daysLeft
- end
-
- if wasRead then --
- mailReadNum = mailReadNum + 1
- end
-
- str = "UpdateInboxData"
- .. " #" .. tostring(index) .. ""
- .. " '" .. tostring(senderName) .. "'"
- .. " '" .. tostring(subject) .. "'"
- .. " '" .. tostring(daysLeft) .. "'"
- .. " '" .. tostring(remainingDays) .. "'"
- Debug(str)
-
- table.insert(playerData.mailEntries, {
- daysLeft = daysLeft, -- fractional number
- -- packageIcon = packageIcon,
- senderName = senderName,
- -- stationaryIcon = stationaryIcon,
- subject = subject,
- wasRead = wasRead,
- })
- end
-
- playerData.lastUpdate = now
- playerData.lastUpdate_str = FormatTS(playerData.lastUpdate, true)
- playerData.mailCount = inboxCount
- playerData.mailReadNum = mailReadNum
- local ex_ts = math.floor(remainingDays * SECONDS_PER_DAY) + now -- make timestamp
- playerData.nextExpiry = ex_ts
- playerData.nextExpiry_str = FormatTS(ex_ts, true)
-end
-
----Look for expiry notifications, the routine will include the current too
-local function UpdateInfo()
- local next_exp = 0
- mailbox.expiry_num, mailbox.expiry_text = CheckExpiry()
-
- local str = "UpdateInfo"
- .. " " .. tostring(player) .. ""
- Debug(str)
-end
-
----Ensure there is something in the saved vars
-local function InitVars()
- local str = "InitVars"
- .. " " .. tostring(player) .. ""
- Debug(str)
-
- if (not TitanPostDB) then
- TitanPostDB = {}
- end
- if (not TitanPostDB[player]) then
- TitanPostDB[player] = {}
- local p = TitanPostDB[player]
- p.lastUpdate = 0
- p.mailCount = 0
- p.mailReadNum = 0
- p.nextExpiry = 0
- end
- if (not TitanPostDB[player].mailEntries) then
- TitanPostDB[player].mailEntries = {}
- end
-end
-
----Process the MAIL_INBOX_UPDATE event while mailbox is open
-local function MailInboxUpdate(reason)
- local str = "MailInboxUpdate"
- .. " o: " .. tostring(mailbox.opened) .. ""
- .. " on: " .. tostring(mailbox.open_now) .. ""
- .. " " .. tostring(reason) .. ""
- Debug(str)
-
- TitanPostDB[player].opened = true
-
- UpdateInboxData()
-
- UpdateInfo()
-
- local numItems, totalItems = GetInboxNumItems()
- Debug("Inbox: "
- .. " #" .. numItems .. ""
- .. " #" .. totalItems .. ""
- )
- TitanPanelButton_UpdateButton(TITAN_POST_ID)
-end
-
-local function OpenMailbox()
- mailbox.opened = true -- this session only
- mailbox.open_now = true
-
- MailInboxUpdate("Mailbox opened")
-end
-
-local function CloseMailbox()
- mailbox.open_now = false -- this session only
-
- if HasNewMail() then
- -- has unread mail, expect a nag event :)
- mailbox.ignore_next_pending = true
- else
- -- no unread mail
- end
-
- local reason = "Mailbox closed " .. tostring(mailbox.ignore_next_pending)
- MailInboxUpdate(reason)
-end
-
----Process the UPDATE_PENDING_MAIL event
-local function UpdatePending()
- local action = ""
- -- Fires on entering world if player has unread mail...
- if mailbox.ignore_next_pending then
- -- ignore 1st event on entering world (first or instance or reload)
- mailbox.ignore_next_pending = false
- action = "ignored"
- elseif _G.MailFrame:IsVisible() then
- action = "ignored"
- else
- -- Likely a brand new mail
- mailbox.new = mailbox.new + 1
- action = "+ 1"
- end
-
- local numItems, totalItems = GetInboxNumItems()
- local str = "UpdatePending"
- .. " o:" .. tostring(mailbox.opened) .. ""
- .. " on: " .. tostring(mailbox.open_now) .. ""
- .. " n:" .. tostring(HasNewMail()) .. ""
- .. " #" .. numItems .. ""
- .. " #" .. totalItems .. ""
- .. " " .. tostring(action) .. ""
-
- Debug(str)
-
- UpdateInfo()
- TitanPanelButton_UpdateButton(TITAN_POST_ID)
-end
-
-local AUCTION_OUTBID = ERR_AUCTION_OUTBID_S:gsub('%%s', '%.+') -- remove the 'what'
-local function GetAHMsg(message)
- if strmatch(message, AUCTION_OUTBID) then
- -- problem child / Blizz bug
- UpdatePending()
- else
- -- Not interested :)
- end
-end
-
----Event handler for registered events
----@param self Button
----@param event string
----@param ... unknown
-local function OnEvent(self, event, arg1, arg2,...)
- Debug("New > "
- .." ".. tostring(event) .. ""
- .." ".. tostring(arg1) .. ""
- .." ".. tostring(arg2) .. ""
-);
- if (event == "VARIABLES_LOADED") then
- InitVars()
- end
- if (event == "PLAYER_ENTERING_WORLD") then
- -- ignore 1st UPDATE_PENDING_MAIL event on entering world (first or instance or reload)
- mailbox.ignore_next_pending = true
-
- if arg1 == true then
- TitanPostDB[player].opened = false
- else
- -- reload / new instance / ...
- end
- end
- ---[===[
- if (event == "MAIL_INBOX_UPDATE") then
- --[[ Dec 2025 https://warcraft.wiki.gg/wiki/MAIL_INBOX_UPDATE
-Fires when the inbox list is loaded while the frame is open
-Fires when mail item changes from new to read
-Fires when mail item is opened for the first time in a session
- --]]
- MailInboxUpdate()
- end
- --]===]
- if (event == "UPDATE_PENDING_MAIL") then
- --[[ Dec 2025 https://warcraft.wiki.gg/wiki/UPDATE_PENDING_MAIL
-Fired when the player enters the world and enters/leaves an instance, if there is mail in the player's mailbox.
-Fired when new mail is received.
-Fired when mailbox window is closed if the number of mail items in the inbox changed (I.E. you deleted mail)
-Does not appear to trigger when auction outbid mail is received... may not in other cases as well
- --]]
-
- UpdatePending()
- end
- if (event == "CHAT_MSG_SYSTEM") then
- --[[ Dec 2025 https://warcraft.wiki.gg/wiki/UPDATE_PENDING_MAIL
-Appears to be a long standing bug that AH 'out bid' message does not fire a 'mail pending' event
- --]]
- GetAHMsg(arg1)
- end
-end
-
-TitanPost.time_ints = {
- { min = 1, set = false },
- { min = 10, set = false },
- { min = 30, set = false },
- { min = 60, set = false },
-}
-local function SetTimer(val)
- local timer = val or 10
- local time_ints = TitanPost.time_ints
- for idx = 1, #time_ints do
- if time_ints[idx].min == timer then
- time_ints[idx].set = true
- else
- time_ints[idx].set = false
- end
- end
-end
-
----First level of right click menu
----@param frame Button
-local function BuildMainMenu(frame)
- local info;
-
- TitanPanelRightClickMenu_AddTitle(TitanPlugins[TITAN_POST_ID].menuText, TitanPanelRightClickMenu_GetDropdownLevel());
-
- TitanPanelRightClickMenu_AddSeparator(TitanPanelRightClickMenu_GetDropdownLevel());
-
- info = {};
- info.notCheckable = true
- info.text = "Expiry Check Interval"
- info.value = "ExpiryInterval";
- TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
-
- SetTimer(TitanGetVar(TITAN_POST_ID, "ExpiryTimer"))
- local time_ints = TitanPost.time_ints
- for idx = 1, #time_ints do
- info = {};
- info.text = tostring(time_ints[idx].min) .. L["TITAN_PANEL_MINUTES_ABBR"]
- info.checked = time_ints[idx].set
- ---@diagnostic disable-next-line: duplicate-set-field
- info.func = function()
- SetTimer(time_ints[idx].min)
- TitanSetVar(TITAN_POST_ID, "ExpiryTimer", time_ints[idx].min)
- end
- TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
- end
- TitanPanelRightClickMenu_AddSeparator(TitanPanelRightClickMenu_GetDropdownLevel());
-
- info = {};
- info.notCheckable = true
- info.text = L["TITAN_PANEL_MENU_PROFILES"] .. " " .. L["TITAN_PANEL_MENU_CONFIGURATION"]
- info.value = "ConfigProfile";
- ---@diagnostic disable-next-line: duplicate-set-field
- info.func = function()
- TitanUpdateConfig("init")
- -- Open the profile config as distinct frame
- AceConfigDialog:Open("Titan Panel Addon Chars")
- end
- TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
- -- TitanPanelRightClickMenu_AddSpacer(TitanPanelRightClickMenu_GetDropdownLevel());
-
- TitanPanelRightClickMenu_AddControlVars(TITAN_POST_ID, TitanPanelRightClickMenu_GetDropdownLevel())
-end
-
----Handle navigating within right click menu
----@param self Button
-local function PrepareMenu(self)
- local s, e, frame = string.find(self:GetName(), "(.*)" .. TITAN_PANEL_CLICK_MENU_SUFFIX);
- local lev = (TitanPanelRightClickMenu_GetDropdownLevel() or 1)
- if lev == 1 then
- BuildMainMenu(frame)
- end
-end
-
----Register events when active
----@param self Button
-local function OnShow(self)
- Debug("OnShow ");
- -- Register for events
- self:RegisterEvent("VARIABLES_LOADED")
- self:RegisterEvent("MAIL_INBOX_UPDATE")
- self:RegisterEvent("UPDATE_PENDING_MAIL")
- self:RegisterEvent("PLAYER_ENTERING_WORLD")
-
- -- Ace does parameter shuffling under the hood depending on the types passed
- -- hence the ignore diagnostic...
- ---@diagnostic disable-next-line: param-type-mismatch
- if AceHook:IsHooked("MailFrame_Show", OpenMailbox) then
- -- Already hooked
- else
- AceHook:SecureHook("MailFrame_Show", OpenMailbox) -- MailFrame.lua
- end
- ---@diagnostic disable-next-line: param-type-mismatch
- if AceHook:IsHooked("MailFrame_Hide", CloseMailbox) then
- -- Already hooked
- else
- -- Ace does parameter shuffling under the hood depending on the types passed
- AceHook:SecureHook("MailFrame_Hide", CloseMailbox) -- MailFrame.lua
- end
-
- UpdateInfo()
- TitanPanelButton_UpdateButton(TITAN_POST_ID)
-end
-
----Unregister events when not active
----@param self Button
-local function OnHide(self)
- Debug("OnHide ");
- -- UnregisterEvent for events
- self:UnregisterEvent("VARIABLES_LOADED");
- self:UnregisterEvent("MAIL_INBOX_UPDATE");
- self:UnregisterEvent("UPDATE_PENDING_MAIL");
- self:UnregisterEvent("PLAYER_ENTERING_WORLD");
-
- ---@diagnostic disable-next-line: param-type-mismatch
- if AceHook:IsHooked("MailFrame_Show", OpenMailbox) then
- ---@diagnostic disable-next-line: param-type-mismatch
- AceHook:Unhook("MailFrame_Show", OpenMailbox) -- MailFrame.lua
- else
- -- nothing to do
- end
- ---@diagnostic disable-next-line: param-type-mismatch
- if AceHook:IsHooked("MailFrame_Hide", CloseMailbox) then
- ---@diagnostic disable-next-line: param-type-mismatch
- AceHook:Unhook("MailFrame_Hide", CloseMailbox) -- MailFrame.lua
- else
- -- nothing to do
- end
-
- ExpiryTimer('stop')
-end
-
----Handle any mouse clicks
----@param self Button
----@param button string Mouse click
-local function OnClick(self, button)
- if (button == "LeftButton") then
- -- ToggleBags();
- end
-end
-
----Registry for Titan; first events
----@param self Button
-local function OnLoad(self)
- local notes = ""
- .. "Adds mail information to Titan Panel.\n"
- .. "- ?? : Have opened Mail this session; counts not known.\n"
- .. "- ?? <read>/<total> : Have not opened Mail this session; x/y from last time Mail opened with TitanPost running.\n"
- .. "- <read>/<total> : Opened Mail this session; x/y known counts.\n"
- .. "- ++ new mail this session; no number given - counts may not be accurate.\n"
- .. "- !! x : x characters with expiring Mail.\n"
- .. "- NOTE: New mail counts NOT given may not be accurate!\n"
- .. "- NOTE: New mail counts NOT added to x/y!\n"
- .. "- New built-in Jan 2026.\n"
- self.registry = {
- id = TITAN_POST_ID,
- menuText = TITAN_POST_ID,
- category = "Built-ins",
- menuTextFunction = PrepareMenu,
- buttonTextFunction = GetButtonText,
- tooltipTitle = TITAN_POST_ID,
- tooltipTextFunction = GetTooltipText,
- icon = FolderPre .. "Mail",
- version = TITAN_VERSION,
- iconWidth = 16,
- notes = notes,
- controlVariables = {
- ShowIcon = true,
- ShowLabelText = true,
- -- ShowColoredText = true,
- DisplayOnRightSide = true,
- },
- savedVariables = {
- ShowIcon = 1,
- ShowLabelText = true,
- -- ShowColoredText = true,
- DisplayOnRightSide = false,
- ExpiryTimer = 10,
- ShowToonList = true,
- }
- };
-
- -- Just these for now
- self:RegisterEvent("VARIABLES_LOADED");
- self:RegisterEvent("PLAYER_ENTERING_WORLD");
-end
-
-local function FormatCounts(playerName, now)
- local toon = TitanPostDB[playerName]
- local res = ""
- local div = " : "
-
- local last_open = ""
- local counts = ""
- local warning = ""
- if (toon.lastUpdate == 0) then
- last_open = "" --L["TITAN_PANEL_NA"] --NOT_OPENED yet
- else
- last_open = tostring(toon.lastUpdate_str)
-
- if toon.mailCount >= 0 then
- -- counts may not be accurate
- counts = div .. READ_PRE .. toon.mailReadNum .. "/" .. toon.mailCount
- else
- -- leave blank
- end
-
- if (toon.nextExpiry < ExpiryWarn()) then
- -- add to list for user
- local days = math.floor((toon.nextExpiry - now) / SECONDS_PER_DAY)
- local color = TitanUtils_GetThresholdColor(ThresholdTable, days)
- local days_str = DAYS_REM .. " : " .. tostring(days)
- days_str = TitanUtils_GetColoredText(days_str, color)
- warning = div .. days_str
- else
- -- no mail to warn about
- warning = ""
- end
- end
-
- res = MAIL_OPENED .. " " .. last_open .. counts .. warning .. "\n"
-
- return res
-end
-
-
----Titan Allow Titan to lookup mail info for a toon; return a formatted string
----@param playerName string
----@return string
-function TitanPost.GetMailInfo(playerName)
- local res = ""
- local now = _G.time()
-
- local str = "GetMailInfo"
- .. " " .. tostring(playerName) .. ""
- Debug(str)
-
- if _G[TITAN_BUTTON]:IsShown() then
- if TitanPostDB and TitanPostDB[playerName] then
- res = FormatCounts(playerName, now)
- else
- res = L["TITAN_PANEL_NA"]
- end
- else
- res = L["TITAN_PANEL_MENU_DISABLED"]
- end
-
- return res
-end
-
----Titan Allow Titan to clear mail data for the given toon.
----@param playerName string
-function TitanPost.ClearMailInfo(playerName)
- local res = ""
- local now = _G.time()
-
- local str = "ClearMailInfo"
- .. " " .. tostring(playerName) .. ""
- Debug(str)
-
- if _G[TITAN_BUTTON]:IsShown() then
- if TitanPostDB and TitanPostDB[playerName] then
- -- Set mail data to defaults for given toon
- local p = TitanPostDB[playerName]
- p.lastUpdate = 0
- p.mailCount = 0
- p.mailReadNum = 0
- p.nextExpiry = 0
-
- table.wipe(p.mailEntries)
- else
- -- toon has no mail data
- end
- else
- -- TitanPost not running
- end
-end
-
----Create needed plugin frames
-local function Create_Frames()
- if _G[TITAN_BUTTON] then
- return -- if already created
- end
-
- -- general container frame
- local f = CreateFrame("Frame", TITAN_BUTTON .. "Frame", UIParent)
- -- f:Hide()
-
- -- Titan plugin button
- local window = CreateFrame("Button", TITAN_BUTTON, f, "TitanPanelComboTemplate")
- window:SetFrameStrata("FULLSCREEN")
- -- Using SetScript("OnLoad", does not work
- OnLoad(window);
- -- TitanPanelButton_OnLoad(window); -- Titan XML template calls this...
-
- window:SetScript("OnShow", function(self)
- OnShow(self);
- TitanPanelButton_OnShow(self);
- end)
- window:SetScript("OnHide", function(self)
- OnHide(self)
- end)
- window:SetScript("OnEvent", function(self, event, ...)
- OnEvent(self, event, ...)
- end)
- window:SetScript("OnClick", function(self, button)
- OnClick(self, button);
- TitanPanelButton_OnClick(self, button);
- end)
-end
-
-Create_Frames() -- do the work
-
---==== For debug access and testing
---[===[
-print("======")
-local TITAN_POST_ID = "Post";
-local TITAN_BUTTON = "TitanPanel" .. TITAN_POST_ID .. "Button"
-
-local SECONDS_PER_DAY = 24 * 60 * 60
-local now = _G.time()
-local player = "Syldil@Staghelm"
-local playerData = TitanPostDB[player]
-
-local sender = "Lascar@Staghelm"
---[[
-local p = TitanPostDB[player]
-p.lastUpdate = now
-p.mailCount = 1
-p.mailReadNum = 0
-p.nextExpiry = math.floor(30 * SECONDS_PER_DAY) + now -- make timestamp
-
-table.wipe(playerData.mailEntries)
-TitanPostDB[player].mailEntries = {}
-TitanPostDB[player].mailEntries[1] = {}
-local m = TitanPostDB[player].mailEntries[1]
-m.daysLeft = 30
-m.senderName = sender
-m.subject = "Debug Msg"
-m.wasRead = false
---]]
-
---TitanPost.SimUpdatePending()
-
---FormatTS(1768597331, true)
--- 1768597331 -- 2026-01-16 16:00
---print(FormatTS(1768597331, false)) -- 2026-01-16 16:00
---print(FormatTS(1768597331, true)) -- 2026-01-16 04:00 PM
-
-TitanDumpTable(TitanPostDB) --(playerData)
---
---
-
-TitanPanelButton_UpdateButton(TITAN_POST_ID)
---
-
--- Simulate an event manually DOES NOT WORK
-TitanPanelPostButton:OnEvent("PLAYER_REGEN_ENABLED", "player")
-
---]===]
-
-
-
--- ==== Simulate firing the events
--- frame:OnEvent("MY_CUSTOM_EVENT", "arg1", "arg2") -- Does NOT appear to work...
-
-
-function TitanPost.SimUpdatePending()
- UpdatePending()
-end
-
-function TitanPost.SimUpdateExpiry()
- UpdateInfo()
-
- local numItems, totalItems = GetInboxNumItems()
- local str = "Inbox Sim : "
- .. " " .. numItems .. ""
- .. " " .. totalItems .. ""
- Debug(str);
-
- TitanPanelButton_UpdateButton(TITAN_POST_ID)
-end
-
-function TitanPost.SimOutBid()
- local msg = "You have been outbid on New Fangled Boots."
- -- print("TPost '"..AUCTION_OUTBID.."'")
-
- GetAHMsg(msg)
-end
diff --git a/TitanPost/TitanPost.toc b/TitanPost/TitanPost.toc
deleted file mode 100644
index c51919b..0000000
--- a/TitanPost/TitanPost.toc
+++ /dev/null
@@ -1,10 +0,0 @@
-## Interface: 120001, 120000, 110207, 50503, 11507
-## Title: Titan Panel [|cffeda55fPost|r] |cff00aa009.1.0.0|r
-## Version: 9.1.0
-## Notes: Adds mail information to Titan Panel
-## Author: Titan Panel Development Team
-## SavedVariables: TitanPostDB
-## Dependencies: Titan
-## OptionalDeps:
-TitanPost.lua
-
diff --git a/TitanPost/artwork/Mail.blp b/TitanPost/artwork/Mail.blp
deleted file mode 100644
index 44252f7..0000000
Binary files a/TitanPost/artwork/Mail.blp and /dev/null differ
diff --git a/TitanPost/artwork/mail_here.mp3 b/TitanPost/artwork/mail_here.mp3
deleted file mode 100644
index 9de61cb..0000000
Binary files a/TitanPost/artwork/mail_here.mp3 and /dev/null differ