Files
Questie-X/Modules/QuestieSlash.lua
T

255 lines
10 KiB
Lua

---@class QuestieSlash
local QuestieSlash = QuestieLoader:CreateModule("QuestieSlash")
---@type QuestieOptions
local QuestieOptions = QuestieLoader:ImportModule("QuestieOptions")
---@type QuestieJourney
local QuestieJourney = QuestieLoader:ImportModule("QuestieJourney")
---@type QuestieQuest
local QuestieQuest = QuestieLoader:ImportModule("QuestieQuest")
---@type QuestieTracker
local QuestieTracker = QuestieLoader:ImportModule("QuestieTracker")
---@type QuestieSearch
local QuestieSearch = QuestieLoader:ImportModule("QuestieSearch")
---@type QuestieMap
local QuestieMap = QuestieLoader:ImportModule("QuestieMap")
---@type QuestieLib
local QuestieLib = QuestieLoader:ImportModule("QuestieLib")
---@type QuestieDB
local QuestieDB = QuestieLoader:ImportModule("QuestieDB")
---@type l10n
local l10n = QuestieLoader:ImportModule("l10n")
---@type QuestieCombatQueue
local QuestieCombatQueue = QuestieLoader:ImportModule("QuestieCombatQueue")
function QuestieSlash.RegisterSlashCommands()
Questie:RegisterChatCommand("questieclassic", QuestieSlash.HandleCommands)
Questie:RegisterChatCommand("questie", QuestieSlash.HandleCommands)
end
function QuestieSlash.HandleCommands(input)
input = string.trim(input, " ");
local commands = {}
for c in string.gmatch(input, "([^%s]+)") do
table.insert(commands, c)
end
local mainCommand = commands[1]
local subCommand = commands[2]
-- /questie
if mainCommand == "" or not mainCommand then
QuestieCombatQueue:Queue(function()
QuestieOptions:OpenConfigWindow();
end)
if QuestieJourney:IsShown() then
QuestieJourney.ToggleJourneyWindow();
end
return ;
end
-- /questie help || /questie ?
if mainCommand == "help" or mainCommand == "?" then
print(Questie:Colorize(l10n("Questie Commands"), "yellow"));
print(Questie:Colorize("/questie - " .. l10n("Toggles the Config window"), "yellow"));
print(Questie:Colorize("/questie toggle - " .. l10n("Toggles showing questie on the map and minimap"), "yellow"));
print(Questie:Colorize("/questie tomap [<npcId>/<npcName>/reset] - " .. l10n("Adds manual notes to the map for a given NPC ID or name. If the name is ambiguous multipe notes might be added. Without a second command the target will be added to the map. The 'reset' command removes all notes"), "yellow"));
print(Questie:Colorize("/questie minimap - " .. l10n("Toggles the Minimap Button for Questie"), "yellow"));
print(Questie:Colorize("/questie journey - " .. l10n("Toggles the My Journey window"), "yellow"));
print(Questie:Colorize("/questie tracker [show/hide/reset] - " .. l10n("Toggles the Tracker. Add 'show', 'hide', 'reset' to explicit show/hide or reset the Tracker"), "yellow"));
print(Questie:Colorize("/questie flex - " .. l10n("Flex the amount of quests you have completed so far"), "yellow"));
print(Questie:Colorize("/questie doable [questID] - " .. l10n("Prints whether you are eligibile to do a quest"), "yellow"));
print(Questie:Colorize("/questie version - " .. l10n("Prints Questie and client version info"), "yellow"));
print(Questie:Colorize("/questie learn [toggle/stats/clear/export] - " .. l10n("Self-learning database: toggle on/off, view stats, clear data, or export"), "yellow"));
print(Questie:Colorize("/questie route [off/single/all/tsp] - " .. l10n("Toggle quest route optimization. off=disable, single=single quest, all=all tracked, tsp=TSP approximation"), "yellow"));
return;
end
-- /questie toggle
if mainCommand == "toggle" then
Questie.db.profile.enabled = (not Questie.db.profile.enabled)
QuestieQuest:ToggleNotes(Questie.db.profile.enabled);
-- Close config window if it's open to avoid desyncing the Checkbox
QuestieOptions:HideFrame();
return;
end
if mainCommand == "reload" then
QuestieQuest:SmoothReset()
return
end
-- /questie minimap
if mainCommand == "minimap" then
Questie.db.profile.minimap.hide = not Questie.db.profile.minimap.hide;
if Questie.db.profile.minimap.hide then
Questie.minimapConfigIcon:Hide("Questie");
else
Questie.minimapConfigIcon:Show("Questie");
end
return;
end
-- /questie journey (or /questie journal, because of a typo)
if mainCommand == "journey" or mainCommand == "journal" then
QuestieJourney.ToggleJourneyWindow();
QuestieOptions:HideFrame();
return;
end
if mainCommand == "tracker" then
if subCommand == "show" then
QuestieTracker:Enable()
elseif subCommand == "hide" then
QuestieTracker:Disable()
elseif subCommand == "reset" then
QuestieTracker:ResetLocation()
else
QuestieTracker:Toggle()
end
return
end
if mainCommand == "tomap" then
if not subCommand then
subCommand = UnitName("target")
end
if subCommand ~= nil then
if subCommand == "reset" then
QuestieMap:ResetManualFrames()
return
end
local conversionTry = tonumber(subCommand)
if conversionTry then -- We've got an ID
subCommand = conversionTry
local result = QuestieSearch:Search(subCommand, "npc", "int")
if result then
for npcId, _ in pairs(result) do
QuestieMap:ShowNPC(npcId)
end
end
return
elseif type(subCommand) == "string" then
local result = QuestieSearch:Search(subCommand, "npc")
if result then
for npcId, _ in pairs(result) do
QuestieMap:ShowNPC(npcId)
end
end
return
end
end
end
if mainCommand == "flex" then
local questCount = 0
for _, _ in pairs(Questie.db.char.complete) do
questCount = questCount + 1
end
if GetDailyQuestsCompleted then
questCount = questCount - GetDailyQuestsCompleted() -- We don't care about daily quests
end
SendChatMessage(l10n("has completed a total of %d quests", questCount) .. "!", "EMOTE")
return
end
if mainCommand == "version" then
local gameType = ""
if Questie.IsWotlk then
gameType = "Wrath"
elseif Questie.IsSoD then -- seasonal checks must be made before non-seasonal for that client, since IsEra resolves true in SoD
gameType = "SoD"
elseif Questie.IsEra then
gameType = "Era"
end
Questie:Print("Questie " .. QuestieLib:GetAddonVersionString() .. ", Client " .. GetBuildInfo() .. " " .. gameType .. ", Locale " .. GetLocale())
return
end
if mainCommand == "doable" or mainCommand == "eligible" or mainCommand == "eligibility" then
if not subCommand then
print(Questie:Colorize("[Questie] ", "yellow") .. "Usage: /questie " .. mainCommand .. " <questID>")
do return end
elseif QuestieDB.QueryQuestSingle(tonumber(subCommand), "name") == nil then
print(Questie:Colorize("[Questie] ", "yellow") .. "Invalid quest ID")
return
end
Questie:Print("[Eligibility] " .. tostring(QuestieDB.IsDoableVerbose(tonumber(subCommand), false, true, false)))
return
end
-- /questie learn [toggle/stats/clear/export]
if mainCommand == "learn" then
local QuestieLearner = QuestieLoader:ImportModule("QuestieLearner")
if not QuestieLearner then
Questie:Print("QuestieLearner module not loaded")
return
end
if subCommand == "toggle" or not subCommand then
local settings = QuestieLearner:GetSettings()
settings.enabled = not settings.enabled
Questie:Print("Learning " .. (settings.enabled and "|cff00ff00enabled|r" or "|cffff0000disabled|r"))
elseif subCommand == "stats" then
local npcCount, questCount, itemCount, objectCount = QuestieLearner:GetStats()
Questie:Print("Learned data: " .. npcCount .. " NPCs, " .. questCount .. " quests, " .. itemCount .. " items, " .. objectCount .. " objects")
elseif subCommand == "clear" then
QuestieLearner:ClearAllData()
elseif subCommand == "export" then
local exportText = QuestieLearner:ExportData()
if exportText and #exportText > 0 then
Questie:Print("Export data printed to chat. Copy from Lua errors or use /dump")
print(exportText)
else
Questie:Print("No learned data to export")
end
else
Questie:Print("Usage: /questie learn [toggle/stats/clear/export]")
end
return
end
-- /questie route [off/single/all/tsp]
if mainCommand == "route" then
local QuestieRouteOptimizer = QuestieLoader:ImportModule("QuestieRouteOptimizer")
if not QuestieRouteOptimizer or not QuestieRouteOptimizer.SetMode then
Questie:Print("QuestieRouteOptimizer module not loaded")
return
end
local ROUTE_MODE_OFF = 1
local ROUTE_MODE_SINGLE_QUEST = 2
local ROUTE_MODE_ALL_TRACKED = 3
local ROUTE_MODE_TSP_APPROXIMATION = 4
if subCommand == "off" or not subCommand then
QuestieRouteOptimizer:SetMode(ROUTE_MODE_OFF)
Questie:Print("Quest route " .. l10n("disabled"))
elseif subCommand == "single" then
QuestieRouteOptimizer:SetMode(ROUTE_MODE_SINGLE_QUEST)
Questie:Print("Quest route " .. l10n("set to single quest mode"))
elseif subCommand == "all" then
QuestieRouteOptimizer:SetMode(ROUTE_MODE_ALL_TRACKED)
Questie:Print("Quest route " .. l10n("set to all tracked quests mode"))
elseif subCommand == "tsp" then
QuestieRouteOptimizer:SetMode(ROUTE_MODE_TSP_APPROXIMATION)
Questie:Print("Quest route " .. l10n("set to TSP approximation mode"))
else
Questie:Print("Usage: /questie route [off/single/all/tsp]")
end
return
end
print(Questie:Colorize("[Questie] ", "yellow") .. l10n("Invalid command. For a list of options please type: ") .. Questie:Colorize("/questie help", "yellow"));
end