Quantcast

- Remove Post

urnati [01-13-26 - 02:11]
- Remove Post
- Update history remove Post and version
Filename
Titan/TitanHistory.lua
TitanPost/TitanPost.lua
TitanPost/TitanPost.toc
TitanPost/artwork/Mail.blp
TitanPost/artwork/mail_here.mp3
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