From 252c0a7469785701ff65aae60778ee75607a4da3 Mon Sep 17 00:00:00 2001 From: urnati Date: Sun, 28 Dec 2025 21:47:48 -0500 Subject: [PATCH] - Profile changes to add Post and Gold info - XP time played text output fix - Gold API for Config - Post API for Config --- Titan/Titan.lua | 7 +- Titan/TitanConfig.lua | 70 ++++ Titan/TitanGlobal.lua | 8 + TitanGold/TitanGold.lua | 15 + TitanPost/Localization.lua | 302 +++++++++++++ TitanPost/TitanPost.lua | 885 +++++++++++++++++++++++++++++++++++++++ TitanPost/TitanPost.toc | 11 + TitanPost/artwork/Mail.blp | Bin 0 -> 3902 bytes TitanPost/artwork/mail_here.mp3 | Bin 0 -> 18037 bytes TitanXP/TitanXP.lua | 28 +- 10 files changed, 1317 insertions(+), 9 deletions(-) create mode 100644 TitanPost/Localization.lua create mode 100644 TitanPost/TitanPost.lua create mode 100644 TitanPost/TitanPost.toc create mode 100644 TitanPost/artwork/Mail.blp create mode 100644 TitanPost/artwork/mail_here.mp3 diff --git a/Titan/Titan.lua b/Titan/Titan.lua index 601a835..9ccf8ef 100644 --- a/Titan/Titan.lua +++ b/Titan/Titan.lua @@ -263,7 +263,8 @@ local function RegisterAddonCompartment() notCheckable = true, func = function(button, menuInputData, menu) TitanUpdateConfig("init") - Settings.OpenToCategory(TITAN_PANEL_CONFIG.topic.About) + AceConfigDialog:Open("Titan Panel Main") +-- Settings.OpenToCategory(TITAN_PANEL_CONFIG.topic.About) end, funcOnEnter = function(button) MenuUtil.ShowTooltip(button, function(tooltip) @@ -732,8 +733,9 @@ local function handle_giu_cmds(cmd_list) return end + AceConfigDialog:Open("Titan Panel Panel Control") -- DF changed how options are called. The best I get is the Titan 'about', not deeper. - Settings.OpenToCategory(TITAN_PANEL_CONFIG.topic.About, TITAN_PANEL_CONFIG.topic.scale) +-- Settings.OpenToCategory(TITAN_PANEL_CONFIG.topic.About, TITAN_PANEL_CONFIG.topic.scale) -- so the below does not work as expected... end @@ -1952,6 +1954,7 @@ local function BuildMainMenu(frame) info.func = function() TitanUpdateConfig("init") Settings.OpenToCategory(TITAN_PANEL_CONFIG.topic.About) +-- AceConfigDialog:Open("Titan Panel Main") end TitanPanelRightClickMenu_AddButton(info); end diff --git a/Titan/TitanConfig.lua b/Titan/TitanConfig.lua index 44e8958..5a67e09 100644 --- a/Titan/TitanConfig.lua +++ b/Titan/TitanConfig.lua @@ -1383,8 +1383,10 @@ local function TitanUpdateChars() -- - green for custom profiles if server == TITAN_CUSTOM_PROFILE_POSTFIX then this_toon.fancy_name = TitanUtils_GetGreenText((index or "?")) + this_toon.is_custom = true else this_toon.fancy_name = TitanUtils_GetGoldText((index or "?")) + this_toon.is_custom = false end this_toon.name = index @@ -1802,6 +1804,74 @@ local function TitanUpdateChars() order = position, } + position = position + 1 + p_args[tostring(position)] = { + type = "header", + name = TitanUtils_GetGoldText("TitanPost"), + cmdHidden = true, + order = position, + } + + local post_str = "" + local post_button = TitanUtils_GetButton("Post") + if post_button and post_button:IsShown() then + -- It is enabled + if this_toon.is_custom then + -- can not log in to custom so NA + post_str = L["TITAN_PANEL_NA"] + else + post_str = TitanPost.GetMailInfo(this_toon.name) + end + else + -- not enabled + post_str = L["TITAN_PANEL_MENU_DISABLED"] + end + + position = position + 1 + p_args[tostring(position)] = { + name = post_str, + order = position, + type = "description", + } + position = position + 1 + p_args[tostring(position)] = { + type = "description", + name = "", + cmdHidden = true, + order = position, + } + + position = position + 1 + p_args[tostring(position)] = { + type = "header", + name = TitanUtils_GetGoldText("TitanGold"), + cmdHidden = true, + order = position, + } + + local gold_str = "" + local gold_button = TitanUtils_GetButton("Gold") + if gold_button and gold_button:IsShown() then + -- It is enabled + if this_toon.is_custom then + -- can not log in to custom so NA + gold_str = L["TITAN_PANEL_NA"] + else + local name, server = TitanUtils_ParseName(this_toon.name) + local faction = UnitFactionGroup("Player") + gold_str = tostring(TitanPanel_GoldGetGold(name, server, faction)) + end + else + -- not enabled + gold_str = L["TITAN_PANEL_MENU_DISABLED"] + end + + position = position + 1 + p_args[tostring(position)] = { + name = gold_str, + order = position, + type = "description", + } --[[ --==== --==== Summary section position = position + 1 diff --git a/Titan/TitanGlobal.lua b/Titan/TitanGlobal.lua index 9b0508b..6df6d9b 100644 --- a/Titan/TitanGlobal.lua +++ b/Titan/TitanGlobal.lua @@ -41,6 +41,14 @@ else Titan_Global.switch.classic_era = false end +Titan_Global.switch.chat_class = true -- if chat routines moved into ChatFrameUtil +if ChatFrameUtil and ChatFrameUtil.DisplayTimePlayed then + Titan_Global.switch.chat_class = true -- started in 11.* somewhere +else + Titan_Global.switch.chat_class = false -- older version +end + + Titan_Global.AdjList = { -- TODO : localize ["UIWidgetTopCenterContainerFrame"] = { frame_name = "UIWidgetTopCenterContainerFrame", diff --git a/TitanGold/TitanGold.lua b/TitanGold/TitanGold.lua index 9581fc6..fc83d0a 100644 --- a/TitanGold/TitanGold.lua +++ b/TitanGold/TitanGold.lua @@ -1342,6 +1342,21 @@ local function OnClick(self, button) end end +function TitanPanel_GoldGetGold(player, server, faction) + local res = "" + -- Gold was written WAY before the profile changes so translate the index + local idx = CreateIndex(player, server, faction) + if _G[TITAN_BUTTON]:IsShown() + and GoldSave[idx] + then + res = NiceCash(GoldSave[idx].gold, true, false) + else + res = "?" + end + + return res +end + ---local Create required Gold frames local function Create_Frames() if _G[TITAN_BUTTON] then diff --git a/TitanPost/Localization.lua b/TitanPost/Localization.lua new file mode 100644 index 0000000..af8c108 --- /dev/null +++ b/TitanPost/Localization.lua @@ -0,0 +1,302 @@ +--- English --- +--- by Tekkub --- +TITAN_POST_MENU_TEXT = "Mail"; +TITAN_POST_RIGHT_MENU_TEXT = "Mail (Right)"; +TITAN_POST_BUTTON_TEXT_NOMAIL = "No mail "; +TITAN_POST_BUTTON_TEXT_MAIL = "New Mail "; +TITAN_POST_BUTTON_TEXT_ALERT = "AH Alert! "; + +TITAN_POST_CHAT_NEW = "New Mail Received "; + +TITAN_POST_TOOLTIP = "Mail"; +TITAN_POST_TOOLTIP_NEW = " new mail items\n"; +TITAN_POST_TOOLTIP_TOTAL = " total mail items"; +TITAN_POST_TOOLTIP_OUTBID = "Outbid: "; +TITAN_POST_TOOLTIP_WON = "Won: "; +TITAN_POST_TOOLTIP_EXPIRED = "Expired: "; +TITAN_POST_TOOLTIP_CANCELLED = "Cancelled: "; +TITAN_POST_TOOLTIP_SOLD = "Sold: "; + +TITAN_POST_MENU_HIDEMM = "Hide Minimap Icon"; +TITAN_POST_MENU_COMPACT = "Compact Mode"; +TITAN_POST_MENU_CHAT = "Chat Alert"; +TITAN_POST_MENU_SOUND = "Use Sound"; +TITAN_POST_MENU_STEXT = "Show Text"; +TITAN_POST_MENU_SHOW_ICON = "Show Icon"; +TITAN_POST_MENU_COUNT = "Show Count"; +TITAN_POST_MENU_ALTICON = "Alt. AH Icon"; +TITAN_POST_MENU_NOICONNOMAIL = "No icon if no mail"; + +--- German --- +--- by Lunox --- +if ( GetLocale() == "deDE") then + TITAN_POST_MENU_TEXT = "Post"; + TITAN_POST_RIGHT_MENU_TEXT = "Post (Rechts)"; + TITAN_POST_BUTTON_TEXT_NOMAIL = "Keine Post "; + TITAN_POST_BUTTON_TEXT_MAIL = "Neue Post "; + TITAN_POST_BUTTON_TEXT_ALERT = "AH-Alarm! "; + + TITAN_POST_CHAT_NEW = "Neue Post erhalten "; + + TITAN_POST_TOOLTIP = "Post"; + TITAN_POST_TOOLTIP_NEW = " neue Nachrichten\n"; + TITAN_POST_TOOLTIP_TOTAL = " Nachrichten insgesamt"; + TITAN_POST_TOOLTIP_OUTBID = "\195\156berboten: "; + TITAN_POST_TOOLTIP_WON = "Gewonnen: "; + TITAN_POST_TOOLTIP_EXPIRED = "Abgelaufen: "; + TITAN_POST_TOOLTIP_CANCELLED = "Abgebrochen: "; + TITAN_POST_TOOLTIP_SOLD = "Verkauft: "; + + TITAN_POST_MENU_HIDEMM = "Verstecke Minimap-Symbol"; + TITAN_POST_MENU_COMPACT = "Kompakt-Modus"; + TITAN_POST_MENU_CHAT = "Chat-Alarm"; + TITAN_POST_MENU_SOUND = "Sound verwenden"; + TITAN_POST_MENU_STEXT = "Text Anzeigen"; + TITAN_POST_MENU_SHOW_ICON = "Symbol Anzeigen"; + TITAN_POST_MENU_COUNT = "Anzahl Anzeigen"; + TITAN_POST_MENU_ALTICON = "Alternatives AH-Symbol"; + TITAN_POST_MENU_NOICONNOMAIL = "Kein Symbol, wenn keine Post"; +end + +--- French --- +--- by Apsalar --- +if ( GetLocale() == "frFR") then + TITAN_POST_MENU_TEXT = "Courrier"; + TITAN_POST_RIGHT_MENU_TEXT = "Courrier (Droite)"; + TITAN_POST_BUTTON_TEXT_NOMAIL = "Aucun courrier"; + TITAN_POST_BUTTON_TEXT_MAIL = "Nouveau courrier"; + TITAN_POST_BUTTON_TEXT_ALERT = "Alerte AH!"; + + TITAN_POST_CHAT_NEW = "Nouveau courrier reçu"; + + TITAN_POST_TOOLTIP = "Courrier"; + TITAN_POST_TOOLTIP_NEW = " nouveaux courriers\n"; + TITAN_POST_TOOLTIP_TOTAL = " nombre total d'articles de courrier"; + TITAN_POST_TOOLTIP_OUTBID = "Vous devez surench\195\169rir sur"; + TITAN_POST_TOOLTIP_WON = "Vous avez gagn\195\169 l'ench\195\168re pour"; + TITAN_POST_TOOLTIP_EXPIRED = "a expir\195\169."; + TITAN_POST_TOOLTIP_CANCELLED = "a \195\169t\195\169 annul\195\169e par le vendeur"; + TITAN_POST_TOOLTIP_SOLD = " vendu."; + + TITAN_POST_MENU_HIDEMM = "Cacher l'ic\195\180ne de la minicarte"; + TITAN_POST_MENU_COMPACT = "Mode compact"; + TITAN_POST_MENU_CHAT = "Alerte de chat"; + TITAN_POST_MENU_SOUND = "Utiliser le son"; + TITAN_POST_MENU_STEXT = "Afficher le texte"; + TITAN_POST_MENU_SHOW_ICON = "Afficher l'icône"; + TITAN_POST_MENU_COUNT = "Afficher le nombre"; + TITAN_POST_MENU_ALTICON = "Autre icône AH"; + TITAN_POST_MENU_NOICONNOMAIL = "Aucune icône si pas de courrier"; +end + +--- Italian --- +if ( GetLocale() == "itIT") then + TITAN_POST_MENU_TEXT = "Posta"; + TITAN_POST_RIGHT_MENU_TEXT = "Posta (Destra)"; + TITAN_POST_BUTTON_TEXT_NOMAIL = "Niente posta "; + TITAN_POST_BUTTON_TEXT_MAIL = "Nuova posta "; + TITAN_POST_BUTTON_TEXT_ALERT = "AH Allarme! "; + + TITAN_POST_CHAT_NEW = "Nuova posta ricevuta "; + + TITAN_POST_TOOLTIP = "Posta"; + TITAN_POST_TOOLTIP_NEW = " nuovi elementi di posta\n"; + TITAN_POST_TOOLTIP_TOTAL = " invii postali totali"; + TITAN_POST_TOOLTIP_OUTBID = "Supera l'offerta: "; + TITAN_POST_TOOLTIP_WON = "Vinto: "; + TITAN_POST_TOOLTIP_EXPIRED = "Scaduto: "; + TITAN_POST_TOOLTIP_CANCELLED = "Annullato: "; + TITAN_POST_TOOLTIP_SOLD = "Venduto: "; + + TITAN_POST_MENU_HIDEMM = "Nascondi icona minimappa"; + TITAN_POST_MENU_COMPACT = "Modalità compatta"; + TITAN_POST_MENU_CHAT = "Avviso Chat"; + TITAN_POST_MENU_SOUND = "Usa il suono"; + TITAN_POST_MENU_STEXT = "Mostra testo"; + TITAN_POST_MENU_SHOW_ICON = "Mostra icona"; + TITAN_POST_MENU_COUNT = "Mostra conteggio"; + TITAN_POST_MENU_ALTICON = "Alt. Icona AH"; + TITAN_POST_MENU_NOICONNOMAIL = "Nessuna icona se nessuna posta"; +end + +--- Korean --- +if ( GetLocale() == "koKR") then + TITAN_POST_MENU_TEXT = "우편"; + TITAN_POST_RIGHT_MENU_TEXT = "메일 (오른쪽)"; + TITAN_POST_BUTTON_TEXT_NOMAIL = "메일 없음 "; + TITAN_POST_BUTTON_TEXT_MAIL = "새 메일 "; + TITAN_POST_BUTTON_TEXT_ALERT = "아 경고! "; + + TITAN_POST_CHAT_NEW = "새 메일 수신됨 "; + + TITAN_POST_TOOLTIP = "우편"; + TITAN_POST_TOOLTIP_NEW = " 새 메일 항목\n"; + TITAN_POST_TOOLTIP_TOTAL = " 총 메일 항목"; + TITAN_POST_TOOLTIP_OUTBID = "더 높은 입찰가: "; + TITAN_POST_TOOLTIP_WON = "이겼다: "; + TITAN_POST_TOOLTIP_EXPIRED = "만료됨: "; + TITAN_POST_TOOLTIP_CANCELLED = "취소 된: "; + TITAN_POST_TOOLTIP_SOLD = "판매된: "; + + TITAN_POST_MENU_HIDEMM = "미니맵 아이콘 숨기기"; + TITAN_POST_MENU_COMPACT = "컴팩트 모드"; + TITAN_POST_MENU_CHAT = "채팅 알림"; + TITAN_POST_MENU_SOUND = "사운드 사용"; + TITAN_POST_MENU_STEXT = "텍스트 표시"; + TITAN_POST_MENU_SHOW_ICON = "아이콘 표시"; + TITAN_POST_MENU_COUNT = "카운트 표시"; + TITAN_POST_MENU_ALTICON = "대체 AH 아이콘"; + TITAN_POST_MENU_NOICONNOMAIL = "메일이 없으면 아이콘 없음"; +end + +--- Chinese --- +--- by Yeachan --- +if ( GetLocale() == "zhCN") then + TITAN_POST_MENU_TEXT = "郵件"; + TITAN_POST_RIGHT_MENU_TEXT = "邮件 (右侧)"; + TITAN_POST_BUTTON_TEXT_NOMAIL = "没有邮件 "; + TITAN_POST_BUTTON_TEXT_MAIL = "有新邮件"; + TITAN_POST_BUTTON_TEXT_ALERT = "拍卖行信件! "; + TITAN_POST_CHAT_NEW = "收到新邮件"; + + TITAN_POST_TOOLTIP = "邮件助手"; + TITAN_POST_TOOLTIP_NEW = "有新邮寄物品\n"; + TITAN_POST_TOOLTIP_TOTAL = " 所有邮件附件物品"; + TITAN_POST_TOOLTIP_OUTBID = "竞标失败: "; + TITAN_POST_TOOLTIP_WON = "竞标获胜: "; + TITAN_POST_TOOLTIP_EXPIRED = "拍卖到期: "; + TITAN_POST_TOOLTIP_CANCELLED = "拍卖取消: "; + TITAN_POST_TOOLTIP_SOLD = "已售出: "; + + TITAN_POST_MENU_HIDEMM = "隐藏小地图邮件图标"; + TITAN_POST_MENU_COMPACT = "简洁模式"; + TITAN_POST_MENU_CHAT = "聊天窗口通告"; + TITAN_POST_MENU_SOUND = "使用声音报告"; + TITAN_POST_MENU_STEXT = "显示内容"; + TITAN_POST_MENU_SHOW_ICON = "显示图标"; + TITAN_POST_MENU_COUNT = "显示数目"; + TITAN_POST_MENU_ALTICON = "改变拍卖行图标"; + TITAN_POST_MENU_NOICONNOMAIL = "如无邮件则不显示图标"; +end + +if ( GetLocale() == "zhTW") then + TITAN_POST_MENU_TEXT = "郵件"; + TITAN_POST_RIGHT_MENU_TEXT = "郵件(右)"; + TITAN_POST_BUTTON_TEXT_NOMAIL = "沒有郵件 "; + TITAN_POST_BUTTON_TEXT_MAIL = "新郵件 "; + TITAN_POST_BUTTON_TEXT_ALERT = "啊警報!"; + + TITAN_POST_CHAT_NEW = "收到新郵件 "; + + TITAN_POST_TOOLTIP = "郵件"; + TITAN_POST_TOOLTIP_NEW = "有新郵寄物品\n"; + TITAN_POST_TOOLTIP_TOTAL = " 所有郵件附件物品"; + TITAN_POST_TOOLTIP_OUTBID = "競標失敗: "; + TITAN_POST_TOOLTIP_WON = "競標獲勝: "; + TITAN_POST_TOOLTIP_EXPIRED = "拍賣到期: "; + TITAN_POST_TOOLTIP_CANCELLED = "拍賣取消: "; + TITAN_POST_TOOLTIP_SOLD = "已售出: "; + + TITAN_POST_MENU_HIDEMM = "隱藏小地圖郵件圖標"; + TITAN_POST_MENU_COMPACT = "簡潔模式"; + TITAN_POST_MENU_CHAT = "聊天窗口通告"; + TITAN_POST_MENU_SOUND = "使用聲音報告"; + TITAN_POST_MENU_STEXT = "顯示內容"; + TITAN_POST_MENU_SHOW_ICON = "顯示圖標"; + TITAN_POST_MENU_COUNT = "顯示數目"; + TITAN_POST_MENU_ALTICON = "改變拍賣行圖標"; + TITAN_POST_MENU_NOICONNOMAIL = "如無郵件則不顯示圖標"; +end + +------- Russian ---------------- +------- by Mikhailo ---------------- +if ( GetLocale() == "ruRU") then + TITAN_POST_MENU_TEXT = "Сообщение"; + TITAN_POST_RIGHT_MENU_TEXT = "Сообщение (Правый)"; + TITAN_POST_BUTTON_TEXT_NOMAIL = "Нет сообщений "; + TITAN_POST_BUTTON_TEXT_MAIL = "Новое сообщение "; + TITAN_POST_BUTTON_TEXT_ALERT = "Сообщение с Аукциона! "; + + TITAN_POST_CHAT_NEW = "Получено новое сообщение "; + + TITAN_POST_TOOLTIP = "Сообщение"; + TITAN_POST_TOOLTIP_NEW = " новое сообщение\n"; + TITAN_POST_TOOLTIP_TOTAL = " всего сообщений"; + TITAN_POST_TOOLTIP_OUTBID = "Выкуплено: "; + TITAN_POST_TOOLTIP_WON = "Выиграно: "; + TITAN_POST_TOOLTIP_EXPIRED = "Истекло: "; + TITAN_POST_TOOLTIP_CANCELLED = "Отменено: "; + TITAN_POST_TOOLTIP_SOLD = "Продано: "; + + TITAN_POST_MENU_HIDEMM = "Скрыть иконку на миникарте"; + TITAN_POST_MENU_COMPACT = "Компактный режим"; + TITAN_POST_MENU_CHAT = "Предупреждать в чат"; + TITAN_POST_MENU_SOUND = "Использовать звук"; + TITAN_POST_MENU_STEXT = "Показывать текст"; + TITAN_POST_MENU_SHOW_ICON = "Показать значок"; + TITAN_POST_MENU_COUNT = "Показывать счётчик"; + TITAN_POST_MENU_ALTICON = "Альт. иконка Аукциона"; + TITAN_POST_MENU_NOICONNOMAIL = "Нет иконки если нет сообщений"; +end + +--- Portuguese Brazil --- +--- by Caracalho --- +if ( GetLocale() == "ptBR") then + TITAN_POST_MENU_TEXT = "Caixa de Correio"; + TITAN_POST_RIGHT_MENU_TEXT = "Correspondência a (Direita)"; + TITAN_POST_BUTTON_TEXT_NOMAIL = "Sem Correspondência "; + TITAN_POST_BUTTON_TEXT_MAIL = "Nova(s) Correspondência(s) "; + TITAN_POST_BUTTON_TEXT_ALERT = "Casa de Leilao! "; + + TITAN_POST_CHAT_NEW = "Nova(s) Correspondência(s) Recebida "; + + TITAN_POST_TOOLTIP = "Caixa de Correio"; + TITAN_POST_TOOLTIP_NEW = " nova(s) correspondência(s)\n"; + TITAN_POST_TOOLTIP_TOTAL = " correspondência(s) no total"; + TITAN_POST_TOOLTIP_OUTBID = "Você perdeu o lance: "; + TITAN_POST_TOOLTIP_WON = "Você venceu o lance: "; + TITAN_POST_TOOLTIP_EXPIRED = "Expirou sua Venda: "; + TITAN_POST_TOOLTIP_CANCELLED = "Venda Cancelada: "; + TITAN_POST_TOOLTIP_SOLD = "Itens foram Vendidos: "; + + TITAN_POST_MENU_HIDEMM = "Esconder Icone no Mini Mapa"; + TITAN_POST_MENU_COMPACT = "Modo Compacto"; + TITAN_POST_MENU_CHAT = "Alerta para o Bate-Papo"; + TITAN_POST_MENU_SOUND = "Usar Som"; + TITAN_POST_MENU_STEXT = "Mostrar Texto"; + TITAN_POST_MENU_SHOW_ICON = "Mostrar Icone"; + TITAN_POST_MENU_COUNT = "Mostrar Quantidade"; + TITAN_POST_MENU_ALTICON = "Alt. Icone da Casa de Leilao"; + TITAN_POST_MENU_NOICONNOMAIL = "Sem icone se não tiver correspondência"; +end + +--- Español --- +--- by Valeria Piñero --- +if ( GetLocale() == "esES" or GetLocale() == "esMX") then + TITAN_POST_MENU_TEXT = "Buzon"; + TITAN_POST_RIGHT_MENU_TEXT = "Correo a (Derecha)"; + TITAN_POST_BUTTON_TEXT_NOMAIL = "No tienes correo "; + TITAN_POST_BUTTON_TEXT_MAIL = "Nuevo(s) Correo(s) "; + TITAN_POST_BUTTON_TEXT_ALERT = "Casa de Subastas! "; + + TITAN_POST_CHAT_NEW = "Nuevo(s) Correo(s) Recibido(s) "; + + TITAN_POST_TOOLTIP = "Buzon"; + TITAN_POST_TOOLTIP_NEW = " nuevo(s) correo(s)\n"; + TITAN_POST_TOOLTIP_TOTAL = " correo(s) en total"; + TITAN_POST_TOOLTIP_OUTBID = "Ud. perdio la puja: "; + TITAN_POST_TOOLTIP_WON = "Ud. gano la puja: "; + TITAN_POST_TOOLTIP_EXPIRED = "Expiro su Venta: "; + TITAN_POST_TOOLTIP_CANCELLED = "Venta Cancelada: "; + TITAN_POST_TOOLTIP_SOLD = "Items fueron Vendidos: "; + + TITAN_POST_MENU_HIDEMM = "Esconder Icono en Mini Mapa"; + TITAN_POST_MENU_COMPACT = "Modo Compacto"; + TITAN_POST_MENU_CHAT = "Alerta de chat"; + TITAN_POST_MENU_SOUND = "Usar Sonido"; + TITAN_POST_MENU_STEXT = "Mostrar Texto"; + TITAN_POST_MENU_SHOW_ICON = "Mostrar Icono"; + TITAN_POST_MENU_COUNT = "Mostrar Cantidade"; + TITAN_POST_MENU_ALTICON = "Alt. Icono de Casa de Subastas"; + TITAN_POST_MENU_NOICONNOMAIL = "Sin icono si no hay correo"; +end diff --git a/TitanPost/TitanPost.lua b/TitanPost/TitanPost.lua new file mode 100644 index 0000000..c55b5fd --- /dev/null +++ b/TitanPost/TitanPost.lua @@ -0,0 +1,885 @@ +-- ************************************************************************** +-- * TitanPost.lua +-- * +-- * By: The Titan Panel Development Team +-- ************************************************************************** + +--[[ +Dec 2025 : + APIs to consider + CheckInbox() - when open +GetInboxNumItems() +GetInboxHeaderInfo(index) + +GetInboxInvoiceInfo(index) + self:RegisterEvent("MAIL_INBOX_UPDATE", UpdateAll) + self:RegisterEvent("MAIL_SEND_SUCCESS") + + warcraft.wiki.gg/wiki/Making_scrollable_frames +--]] + +-- ******************************** 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 TITAN_POST_ICON_NEW = FolderPre .. "Mail"; + +-- Local variables +local L = LibStub("AceLocale-3.0"):GetLocale("Titan", true) +local AceConfigDialog = LibStub("AceConfigDialog-3.0") + +local mailbox = {} -- default on load; store display info here +mailbox.opened = false +mailbox.when = nil +mailbox.total = 0 +mailbox.read = 0 +mailbox.new = 0 +mailbox.expiry_active = false +mailbox.expiry_next = 0 +mailbox.expiry_text = "" +mailbox.expiry_num = 0 + +local enter_or_reload = true + + +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 MAX_COD_DAYS = 72 * SECONDS_PER_HOUR + +local expiry_warn_days = 7 +local expiry_err_days = 2 + +local NOT_OPENED = "Not Opened Yet" +local NOT_USED = "Not Used Yet" +local NOT_SHOWN = "Not Running" +local DAYS_REM = "Days Remaining" +local MAIL_OPENED = "Mail Opened" +local CHAR = "Character" + +local NEW_PRE = " + " +local EXP_PRE = " !! " + +local MENU_SERVER = "Server_list" +local MENU_CHAR = "Char_name" + +TitanPost = {} +TitanPost.mailbox = mailbox +--[===[ for debug + + --]===] +---------------------------------------------------------------------------------- + +function Debug(str) + if (debug) then + DEFAULT_CHAT_FRAME:AddMessage("TitanPost " .. 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 + +---Format an expiry text for a single toon +---@param toon_name string +---@param next_expiry number timestamp +---@param last_update number timestamp +---@return string +local function ShowExpiry(toon_name, next_expiry, last_update) + local now = _G.time() + local res = "" + local use_color = true -- TitanGetVar(TITAN_POST_ID, "ShowColoredText") + + local days = math.floor((next_expiry - now) / SECONDS_PER_DAY) + local last = FormatTS(last_update, true) + 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) .. "" + .. " < " .. 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.nextExpiry, characterList.lastUpdate) + + 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 = TITAN_POST_TOOLTIP_EXPIRED .. " " .. tostring(expiry_toons) .. "\n" + res = res .. ex_header + res = res .. exp_str + else + -- still time + end + + str = "CheckExpiry" + .. " " .. tostring(expiry_toons) .. "" + .. " \n" .. tostring(res) .. "" + Debug(str) + + return expiry_toons, res +end + +---Create plugin text +---@param id string +---@return string Label +---@return string Display text +---@return string Label +---@return string Display text +local function GetButtonText(id) + --[[ + local total = "" + local read = "" + + local str = "" + if (mailbox.total > 0) then + total = tostring(mailbox.total) + if (mailbox.read > 0) then + read = tostring(mailbox.read) + else + read = "" + end + str = str .. "[" .. read .. "/" .. total .. "]" + else + str = str .. "" --NOT_OPENED + end + --]] + + 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 + + return "New : ", new, + "Expiry : ", expiry +end + +---Create a tool tip +---@return string +function GetTooltipText() + local str = ""; + + -- local now = _G.time() + -- str = FormatTS(now, false) .. "\n" -- date only for comparisions + + local playerData = TitanPostDB[player] + if playerData.lastUpdate == 0 then + str = UNKNOWN + else + str = FormatTS(playerData.lastUpdate, true) + end + str = str .. " last time Mail opened.\n" + + local new = "" + if (mailbox.new > 0) then + new = NEW_PRE .. tostring(mailbox.new) .. " new mail this session.\n" + else + new = "" + end + + local expiry = "" + if (mailbox.expiry_num > 0) then + expiry = EXP_PRE .. tostring(mailbox.expiry_num) .. " characters with mail expiring!!\n" + else + expiry = "" + end + + --[[ + local total = (mailbox.total > 0) and tostring(mailbox.total) or "" + local read = (mailbox.read > 0) and tostring(mailbox.read) or "" + if mailbox.opened then + str = str .. "[" .. read .. "/" .. total .. "]" + else + str = str .. NOT_OPENED + end +--]] + str = str .. new .. expiry + str = str .. "\n" + str = str .. mailbox.expiry_text .. "\n" + + return str; +end + +local function convertSeconds(time) + local days = math.floor(time / 86400) + local hours = math.floor(math.fmod(time, 86400) / 3600) + local minutes = math.floor(math.fmod(time, 3600) / 60) + local seconds = math.floor(math.fmod(time, 60)) + + local s = tostring(days > 0 and days .. (days == 1 and " day, " or " days, ") or "") + s = s .. tostring(hours > 0 and hours .. (hours == 1 and " hour, " or " hours, ") or "") + s = s .. tostring(minutes > 0 and minutes .. (minutes == 1 and " minute, " or " minutes, ") or "") + s = s .. tostring(seconds > 0 and seconds .. (seconds == 1 and " second, " or " seconds, ") or "") + + return string.gsub(s, ",[^,]*$", "") +end + +---Look at any mail, setting data for action +local function UpdateInboxData() + if not _G.MailFrame:IsVisible() then + return + end + + local inboxCount = _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) .. "" + 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.mailCount = inboxCount + playerData.mailReadNum = mailReadNum + playerData.nextExpiry = math.floor(remainingDays * SECONDS_PER_DAY) + now -- make timestamp +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 = {} + local m = TitanPostDB[player].mailEntries + m.daysLeft = 0 + m.senderName = "Init" + m.subject = "Init" + m.wasRead = false + end +end + +---Process the MAIL_INBOX_UPDATE event while mailbox is open +local function MailInboxUpdate() + local str = "MAIL_INBOX_UPDATE" + .. " " .. tostring(mailbox.opened) .. "" + Debug(str) + + UpdateInboxData() + + UpdateInfo() + Debug("Inbox: " .. GetInboxNumItems()); + TitanPanelButton_UpdateButton(TITAN_POST_ID) +end + +---Process the UPDATE_PENDING_MAIL event +local function UpdatePending() + -- Fires on entering world if player has unread mail... + if enter_or_reload then + -- ignore 1st event on entering world (first or instance or reload) + enter_or_reload = false + else + -- Likely a brand new mail + mailbox.new = mailbox.new + 1 + end + + local str = "UPDATE_PENDING_MAIL" + .. " " .. tostring(mailbox.opened) .. "" + .. " " .. tostring(HasNewMail()) .. "" + .. " " .. tostring(GetInboxNumItems()) .. "" + + Debug(str) + + UpdateInfo() + TitanPanelButton_UpdateButton(TITAN_POST_ID) +end + +---Event handler for registered events +---@param self Button +---@param event string +---@param ... unknown +local function OnEvent(self, event, ...) + Debug(time() .. " " .. event); + 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) + enter_or_reload = true + end + if (event == "MAIL_INBOX_UPDATE") then + mailbox.opened = true -- this session only + --[[ 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 +end + +---local Show list of servers / custom submenu off Profiles/Manage from the Titan (right click) menu. +local function BuildServerProfilesMenu() + local info = {}; + local servers = {}; + local player = nil; + local server = nil; + local s, e, ident; + local setonce = 0; + + if (TitanPanelRightClickMenu_GetDropdMenuValue() == MENU_SERVER) then + TitanPanelRightClickMenu_AddTitle(L["TITAN_PANEL_MENU_PROFILE_SERVERS"], + TitanPanelRightClickMenu_GetDropdownLevel()); + -- Normal profile per toon + for index, id in pairs(TitanSettings.Players) do + player, server = TitanUtils_ParseName(index) + + if TitanUtils_GetCurrentIndex(servers, server) == nil then + if server ~= TITAN_CUSTOM_PROFILE_POSTFIX then + table.insert(servers, server); + info = {}; + info.notCheckable = true + info.text = server; + info.value = MENU_CHAR .. server; + info.hasArrow = 1; + TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel()); + end + end + end + end +end + +---local Show alphabetical list of toons submenu off Profiles/Manage/ from the Titan right click menu. +local function BuildProfileMenu() + -- + local info = {}; + local setonce = 0; + + -- + -- Handle the profiles + -- + for idx = 1, #Titan_Global.players do + local index = Titan_Global.players[idx] + local player, server = TitanUtils_ParseName(index) + local off = (index == TitanSettings.Player) + or ((index == TitanAllGetVar("GlobalProfileUse")) and (TitanAllGetVar("GlobalProfileUse"))) + local par_val = TitanPanelRightClickMenu_GetDropdMenuValue() + local menu_val = string.gsub(par_val, MENU_CHAR, "") + + -- handle regular profiles here + if server == menu_val then + -- Set the label once + if setonce and setonce == 0 then + TitanPanelRightClickMenu_AddTitle(L["TITAN_PANEL_MENU_PROFILE_CHARS"], + TitanPanelRightClickMenu_GetDropdownLevel()); + setonce = 1; + end + info = {}; + info.disabled = off + info.notCheckable = true + info.text = player; + info.value = index; + info.hasArrow = 1; + TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel()); + end + end -- for players +end + +---First level of right click menu +---@param frame Button +local function BuildMainMenu(frame) + local info; + + TitanPanelRightClickMenu_AddTitle(TitanPlugins[TITAN_POST_ID].menuText); + TitanPanelRightClickMenu_AddSpacer(); + info = {}; + info.notCheckable = true + info.text = L["TITAN_PANEL_MENU_PROFILES"] .. " " .. L["TITAN_PANEL_MENU_CONFIGURATION"] + info.value = "ConfigProfile"; + info.func = function() + TitanUpdateConfig("init") + AceConfigDialog:Open("Titan Panel Addon Chars") + -- Settings.OpenToCategory(TITAN_PANEL_CONFIG.topic.profiles) + end + TitanPanelRightClickMenu_AddButton(info); + TitanPanelRightClickMenu_AddSpacer(); + + --[[ + TitanPanelRightClickMenu_AddSpacer(); + + info = {}; + info.text = TITAN_POST_MENU_CHAT; + info.value = "chat"; + info.func = TitanToggleVar(TITAN_POST_ID, "chat"); + info.keepShownOnClick = 1; + info.checked = TitanGetVar(TITAN_POST_ID, "chat"); + UIDropDownMenu_AddButton(info); + + TitanPanelRightClickMenu_AddSpacer(); + + info = {}; + info.notCheckable = true + info.text = "Servers"; + info.value = MENU_SERVER + info.hasArrow = 1; + -- lock this menu in combat + if InCombatLockdown() then + info.disabled = 1; + info.hasArrow = nil; + info.text = info.text .. " " + .. _G["GREEN_FONT_COLOR_CODE"] + .. L["TITAN_PANEL_MENU_IN_COMBAT_LOCKDOWN"]; + end + TitanPanelRightClickMenu_AddButton(info); + + TitanPanelRightClickMenu_AddSpacer(); +--]] + + TitanPanelRightClickMenu_AddControlVars(TITAN_POST_ID) +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 + --[[ + -- Level 2 + -- Server / Realm list + if (lev == 2) then + if (TitanPanelRightClickMenu_GetDropdMenuValue() == MENU_SERVER) then + BuildServerProfilesMenu() + end + return; + end + + -- Level 3 + -- Server / Realm list > Character on realm list + if (lev == 3) then + if string.find(TitanPanelRightClickMenu_GetDropdMenuValue(), MENU_CHAR) then + BuildProfileMenu() + end + return; + end +--]] +end + +local function sorted_index(table) + local index = {} + for key in pairs(table) do tinsert(index, key); end + sort(index) + return index +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") + + -- self:RegisterEvent("MAIL_SHOW") -- use MAIL_INBOX_UPDATE + -- self:RegisterEvent("MAIL_CLOSED") -- In retail, does NOT fire + + 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"); +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 expiry information to Titan Panel.\n" + .. "- New built-in Dec 2025.\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 = TITAN_POST_ICON_NEW, + 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, + ShowCount = 1, + ShowText = 1, + new = 0, + total = 0, + chat = 1, + } + }; + + -- Just these for now + self:RegisterEvent("VARIABLES_LOADED"); + self:RegisterEvent("PLAYER_ENTERING_WORLD"); +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 + local p = TitanPostDB[playerName] + local estr = "" + local last = "" + + if p.lastUpdate == 0 then + -- not opened mail yet + res = NOT_OPENED + else + if (p.mailCount > 0) then + if (p.nextExpiry < ExpiryWarn()) then -- add to list for user + local days = math.floor((p.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) + estr = days_str .. "\n" + else + -- no mail to warn about + estr = "" + end + else + -- empty + end + + last = MAIL_OPENED .. " : " .. FormatTS(p.lastUpdate, true) .. "\n" + res = estr .. last + end + else + res = NOT_USED + end + else + res = NOT_SHOWN + 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 = now + p.mailCount = 1 + p.mailReadNum = 0 + p.nextExpiry = math.floor(30 * SECONDS_PER_DAY) + now -- make timestamp + + 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 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.SimMailInboxUpdate() +--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) +-- +-- + + +-- 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 diff --git a/TitanPost/TitanPost.toc b/TitanPost/TitanPost.toc new file mode 100644 index 0000000..d4a0937 --- /dev/null +++ b/TitanPost/TitanPost.toc @@ -0,0 +1,11 @@ +## Interface: 120000, 110207, 50503, 11507 +## Title: Titan Panel [|cffeda55fPost|r] |cff00aa009.0.2.0|r +## Version: 9.0.2 +## Notes: Adds mail information to Titan Panel +## Author: Titan Panel Development Team (http://www.titanpanel.org) +## SavedVariables: TitanPostDB +## Dependencies: Titan +## OptionalDeps: +Localization.lua +TitanPost.lua + diff --git a/TitanPost/artwork/Mail.blp b/TitanPost/artwork/Mail.blp new file mode 100644 index 0000000000000000000000000000000000000000..44252f7b2d98f390e51682f7af6ee68c7b023b25 GIT binary patch literal 3902 zcmeH}dt6gj632fiE+SUCzE;<6v9)epU1=+VQgK16wJ7yb1)mkGSXad=1(l)@L_rK7 zsJx>P5hMyEK@h7D6BHpKkX}VmF)={}dBym^$TPPmK`OXlyMOev{bT3znR{mDJ99GU z-gD2*Os9pDi~tz*?{74kjCzeUCOVMlAYiCDFqx0G-6iam{{Y){zHnN!7%RSU!%DY}n6=gu zPV2nju*Ms+H!5Gk<-SORaZ+PtRftQajcKi7OCjRI%AOv`u36rzxXF-&2_FvKLM+L7200KjyiHW8Sg|%ySRIQjh&`_6ot*JDFJS7l!$sN8q?C9xgi% z<16ntEcaz$$?6o$U40gF+%94VgNtu>3Sl(j5-_qDc(;}D(n*6!yaZh0>chrPsAYvABjO|TnzR_9Yt_73lWjgh+rpx z8Iz1K)(M0qaBwIg6>*7d98Nq9|6|!Way%K4Noj~bnT}{q29BQQB0MDvA*s2DImt&{ zDxbu%aD;sxiRnc7c}UGjM{;%sk}|T9l9h{7X9Y<6Q2>5!4)_8gm9m8sWvYI9yT- zj^qLO#VQmQ7D7~1f`Y5X$S=K)%Tzfe*UM3Gtpbu8cTjpuj$4XyNGl%T%I#XneOo7 zQ#YdK(Nk1C)}rp|b5u9Bp#FI)8d`LCs%^rvwsz=rx?eve%5NMD4GG-C=qgeZJxe*0U`DSP2c~lkR=&`vv#A@(w{e3c7RufyTG# z4%vU6j0X<9^z;Ks9cawewKlcty%Jv`-LU%tv2*R&8&Fa@kxR;c5D0hHy!%#yA(GvRUj7g9~tUJVu})E^0ve+m^yU$ ztiQbdSq3-mSbm{cEYhzZZADVKLZRfaGPlf`Hth4MLuZ_!*aDeMCh6cBk@T)g#p72? zV;0&Dn=*C8qO3ZKrR}zgfILmM2!~>bVj*&#*nUTv1+wP9sh`$xh15d~c%rM;?k&lE4x3+VuTt zIsAH^Rwi;J@IK3pPMytwjVX|6_fjB8lG_M}?ZT6JIZNTaE$DP8tMTgu7=N+2k0 z$c?Pm*FVueIr2;%=&z6W|5())eEz0Jt7&N|Ez|SvGI|{Gw~y@}?BbD6G5NrE3H-rL z{h~Xir&c=|8GFKb#e2lBc+dD3-V5&Jz2TR<0~=a=txxi*yh%Fe?=9zd=fCm;_&@LM z(HP?Y`}_0S&g^LqzLxTba?L0HeY9DZjx3ph^ZIr1Cx$q6b@9QMeaV0PQ83qkONsn> z$n$oZKKJ6*16tQiw*#Wa=2p5aC;1`W&_p)?a*m3opYC#%HS6kl3gDq2^>pRevu(eq z%tYS(`$a0kYqj@P zN||%64nWjT3P>7-;zO$e&Zo**hRw5s*df{#nr!lU0sm#gu!6Y z455$=42Hd-{?&!?$~0IcwVV9ze&Zl_bJBF8!PNa^@9JuA|Iy3U3WXiU ze~hl=rX?maTs!OkVKM-T*Di~Ar*?8DSzAtcw&2528k$xriB7R!Fy;Hx$Gl5|qvB%O FKLclB_9g%T literal 0 HcmV?d00001 diff --git a/TitanPost/artwork/mail_here.mp3 b/TitanPost/artwork/mail_here.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..9de61cbbc760c6e72e26b51f530f04e30bddc33e GIT binary patch literal 18037 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 literal 0 HcmV?d00001 diff --git a/TitanXP/TitanXP.lua b/TitanXP/TitanXP.lua index cd5508f..685b472 100644 --- a/TitanXP/TitanXP.lua +++ b/TitanXP/TitanXP.lua @@ -30,9 +30,6 @@ XPTimer.last = 0 local trace = false local trace_update = false ---****** overload the 'time played' text to Chat - if XP requested the API call -local requesting - -- collect the various XP variables in one place local txp = { frame = {}, @@ -46,19 +43,36 @@ local txp = { levelTime = 0, sessionTime = 0, } + +--****** overload the 'time played' text to Chat - if XP requested the API call +local requesting + -- Save orignal output to Chat -local orig_ChatFrame_DisplayTimePlayed = ChatFrame_DisplayTimePlayed --- Override the output to Chat -ChatFrame_DisplayTimePlayed = function(...) +-- somewhere in 11.* (The World Within) this changed +local orig_ChatFrame_DisplayTimePlayed = nil +if Titan_Global.switch.chat_class then + orig_ChatFrame_DisplayTimePlayed = ChatFrameUtil.DisplayTimePlayed +else + orig_ChatFrame_DisplayTimePlayed = ChatFrame_DisplayTimePlayed +end + +local function TimePlayed(...) if requesting then -- XP requested time played, do not spam Chat requesting = false else -- XP did not request time played so output +---@diagnostic disable-next-line: need-check-nil orig_ChatFrame_DisplayTimePlayed(...) end end ---****** Override + +-- Override the output to Chat for the correct WoW version running +if Titan_Global.switch.chat_class then + ChatFrameUtil.DisplayTimePlayed = TimePlayed(...) +else + ChatFrame_DisplayTimePlayed = TimePlayed(...) +end -- ******************************** Functions ******************************* -- 1.7.9.5