Files
Questie-X/Modules/QuestieAnnounce.lua
T

188 lines
7.0 KiB
Lua

local Questie = _G.Questie
---@class QuestieAnnounce
local QuestieAnnounce = QuestieLoader:CreateModule("QuestieAnnounce")
local _QuestieAnnounce = {}
---@type QuestieDB
local QuestieDB = QuestieLoader:ImportModule("QuestieDB")
---@type QuestieLink
local QuestieLink = QuestieLoader:ImportModule("QuestieLink")
---@type l10n
local l10n = QuestieLoader:ImportModule("l10n")
--- COMPATIBILITY ---
local IsInGroup = QuestieCompat.IsInGroup
local IsInRaid = QuestieCompat.IsInRaid
local LE_PARTY_CATEGORY_INSTANCE = QuestieCompat.LE_PARTY_CATEGORY_INSTANCE
local itemCache = {} -- cache data since this happens on item looted it could happen a lot with auto loot
local alreadySentBandaid = {} -- TODO: rewrite the entire thing its a lost cause
local _GetAnnounceMarker
---@return string
_GetAnnounceMarker = function()
local locale = l10n:GetUILocale()
if IsInRaid() or IsInGroup() then
if locale == "ruRU" then
return "{звезда} Questie: ";
elseif locale == "frFR" then
return "{rt1} Questie : ";
else
return "{rt1} Questie: "
end
else
return ""
end
end
function QuestieAnnounce:AnnounceObjectiveToChannel(questId, itemId, objectiveText, objectiveProgress)
if _QuestieAnnounce:AnnounceEnabledAndPlayerInChannel() and Questie.db.profile.questAnnounceObjectives then
-- no hyperlink required here
local questLink = QuestieLink:GetQuestLinkStringById(questId);
local objective
if itemId then
local itemLink = select(2, GetItemInfo(itemId))
objective = objectiveProgress.." "..itemLink
else
objective = objectiveProgress.." "..objectiveText
end
local message = _GetAnnounceMarker() .. l10n("%s for %s!", objective, questLink)
_QuestieAnnounce:AnnounceToChannel(message)
end
end
local _has_seen_incomplete = {}
local _has_sent_announce = {}
function QuestieAnnounce:ObjectiveChanged(questId, text, numFulfilled, numRequired)
-- Announce completed objective
if (numRequired ~= numFulfilled) then
_has_seen_incomplete[text] = true
elseif _has_seen_incomplete[text] and not _has_sent_announce[text] then
_has_seen_incomplete[text] = nil
_has_sent_announce[text] = true
QuestieAnnounce:AnnounceObjectiveToChannel(questId, nil, text, tostring(numFulfilled) .. "/" .. tostring(numRequired))
end
end
function QuestieAnnounce:AnnounceQuestItemLootedToChannel(questId, itemId)
if _QuestieAnnounce:AnnounceEnabledAndPlayerInChannel() and Questie.db.profile.questAnnounceItems then
local questHyperLink = QuestieLink:GetQuestLinkStringById(questId);
local itemLink = select(2, GetItemInfo(itemId))
local message = _GetAnnounceMarker() .. l10n("Picked up %s which starts %s!", itemLink, questHyperLink)
_QuestieAnnounce:AnnounceToChannel(message)
return true
else
return false
end
end
function _QuestieAnnounce:AnnounceSelf(questId, itemId)
local questHyperLink = QuestieLink:GetQuestHyperLink(questId);
local itemLink = select(2, GetItemInfo(itemId));
Questie:Print(l10n("You picked up %s which starts %s!", itemLink, questHyperLink));
end
---@return boolean
function _QuestieAnnounce:AnnounceEnabledAndPlayerInChannel()
if Questie.db.profile.questAnnounceLocally == true then
return true -- we always want to print if this option is enabled
elseif Questie.db.profile.questAnnounceChannel == "both" then
return IsInRaid() or IsInGroup()
elseif Questie.db.profile.questAnnounceChannel == "raid" then
return IsInRaid()
elseif Questie.db.profile.questAnnounceChannel == "party" then
return IsInGroup() and not IsInRaid()
else
return false
end
end
function _QuestieAnnounce.GetChatMessageChannel()
if IsInRaid() then
return "RAID"
elseif IsInGroup(LE_PARTY_CATEGORY_INSTANCE) then
return "INSTANCE_CHAT"
else
return "PARTY"
end
end
function _QuestieAnnounce:AnnounceToChannel(message)
Questie:Debug(Questie.DEBUG_DEVELOP, "[QuestieAnnounce] raw msg: ", message)
if (not message) or alreadySentBandaid[message] or Questie.db.profile.questieShutUp then
return
end
alreadySentBandaid[message] = true
if IsInRaid() or IsInGroup() then
SendChatMessage(message, _QuestieAnnounce.GetChatMessageChannel())
elseif Questie.db.profile.questAnnounceLocally == true then
Questie:Print(message)
end
end
local playerNameCache
---@return string
local function _GetPlayerName()
playerNameCache = UnitName("player")
return playerNameCache
end
function QuestieAnnounce:ItemLooted(text, notPlayerName, _, _, playerName)
if (playerNameCache or _GetPlayerName()) == playerName or (string.len(playerName) == 0 and playerNameCache == notPlayerName) then
local itemId = tonumber(string.match(text, "item:(%d+)"))
if not itemId then return end
local startQuestId = itemCache[itemId]
-- startQuestId can have boolean false as value, need to compare to nil
-- check QueryItemSingle because this event can fire before db init is complete
if (startQuestId == nil) and QuestieDB.QueryItemSingle then
startQuestId = QuestieDB.QueryItemSingle(itemId, "startQuest")
-- filter 0 values away so itemCache value is a valid questId if it evaluates to true
-- we do "or false" here because nil would mean not cached
startQuestId = (startQuestId and startQuestId > 0) and startQuestId or false
itemCache[itemId] = startQuestId
end
if startQuestId then
if not QuestieAnnounce:AnnounceQuestItemLootedToChannel(startQuestId, itemId) then
_QuestieAnnounce:AnnounceSelf(startQuestId, itemId)
end
end
end
end
function QuestieAnnounce:AcceptedQuest(questId)
if (_QuestieAnnounce:AnnounceEnabledAndPlayerInChannel()) and Questie.db.profile.questAnnounceAccepted then
local questLink = QuestieLink:GetQuestLinkStringById(questId)
local message = _GetAnnounceMarker() .. l10n("Quest %s: %s", l10n('Accepted'), questLink or "no quest name")
_QuestieAnnounce:AnnounceToChannel(message)
end
end
function QuestieAnnounce:AbandonedQuest(questId)
if (_QuestieAnnounce:AnnounceEnabledAndPlayerInChannel()) and Questie.db.profile.questAnnounceAbandoned then
local questLink = QuestieLink:GetQuestLinkStringById(questId)
local message = _GetAnnounceMarker() .. l10n("Quest %s: %s", l10n('Abandoned'), questLink or "no quest name")
_QuestieAnnounce:AnnounceToChannel(message)
end
end
function QuestieAnnounce:CompletedQuest(questId)
if (_QuestieAnnounce:AnnounceEnabledAndPlayerInChannel()) and Questie.db.profile.questAnnounceCompleted then
local questLink = QuestieLink:GetQuestLinkStringById(questId)
local message = _GetAnnounceMarker() .. l10n("Quest %s: %s", l10n('Completed'), questLink or "no quest name")
_QuestieAnnounce:AnnounceToChannel(message)
end
end