Add installation script and enhance addon functionality
- Introduced `install_addon_sub.sh` to automate addon installation. - Improved argument normalization with a new `Norm` helper function. - Added debug command for enhanced diagnostics and collector status visibility. - Ensured global addon table initialization for flexible load order. - Marked modules as loaded for better debug tracking. - Fixed TOC path formatting for Windows compatibility. - Updated `.gitignore` rules for IDE folders.
This commit is contained in:
@@ -69,6 +69,7 @@ ENV/
|
|||||||
|
|
||||||
# IDE
|
# IDE
|
||||||
.idea/
|
.idea/
|
||||||
|
.idea/*
|
||||||
.vscode/
|
.vscode/
|
||||||
*.swp
|
*.swp
|
||||||
*.swo
|
*.swo
|
||||||
@@ -85,3 +86,4 @@ htmlcov/
|
|||||||
# Environment variables
|
# Environment variables
|
||||||
.env
|
.env
|
||||||
.env.local
|
.env.local
|
||||||
|
|
||||||
|
|||||||
@@ -6,8 +6,8 @@
|
|||||||
## SavedVariables: AscensionExporterSaved, AscensionExporterConfig
|
## SavedVariables: AscensionExporterSaved, AscensionExporterConfig
|
||||||
|
|
||||||
Core.lua
|
Core.lua
|
||||||
Util/Json.lua
|
Util\Json.lua
|
||||||
UI/ExportFrame.lua
|
UI\ExportFrame.lua
|
||||||
Collectors/Talents.lua
|
Collectors\Talents.lua
|
||||||
Collectors/Gear.lua
|
Collectors\Gear.lua
|
||||||
Collectors/Enchants.lua
|
Collectors\Enchants.lua
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
-- AscensionExporter - Mystic Enchants collector (from equipped item tooltips)
|
-- AscensionExporter - Mystic Enchants collector (from equipped item tooltips)
|
||||||
|
|
||||||
|
-- Ensure global addon table exists even if load order varies
|
||||||
|
AscensionExporter = _G.AscensionExporter or {}
|
||||||
|
_G.AscensionExporter = AscensionExporter
|
||||||
local AE = AscensionExporter
|
local AE = AscensionExporter
|
||||||
|
|
||||||
local SLOT_NAMES = {
|
local SLOT_NAMES = {
|
||||||
@@ -57,3 +60,6 @@ function AE.CollectMysticEnchants()
|
|||||||
table.sort(active, function(a,b) return a.name < b.name end)
|
table.sort(active, function(a,b) return a.name < b.name end)
|
||||||
return { perSlot = perSlot, active = active }
|
return { perSlot = perSlot, active = active }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Mark module as loaded for debug visibility
|
||||||
|
AE._loadedEnchants = true
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
-- AscensionExporter - Gear collector (equipped items only)
|
-- AscensionExporter - Gear collector (equipped items only)
|
||||||
|
|
||||||
|
-- Ensure global addon table exists even if load order varies
|
||||||
|
AscensionExporter = _G.AscensionExporter or {}
|
||||||
|
_G.AscensionExporter = AscensionExporter
|
||||||
local AE = AscensionExporter
|
local AE = AscensionExporter
|
||||||
|
|
||||||
local SLOT_NAMES = {
|
local SLOT_NAMES = {
|
||||||
@@ -114,3 +117,6 @@ function AE.CollectGear()
|
|||||||
end
|
end
|
||||||
return out
|
return out
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Mark module as loaded for debug visibility
|
||||||
|
AE._loadedGear = true
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
-- AscensionExporter - Talents collector (active spec only)
|
-- AscensionExporter - Talents collector (active spec only)
|
||||||
|
|
||||||
|
-- Ensure global addon table exists even if load order varies
|
||||||
|
AscensionExporter = _G.AscensionExporter or {}
|
||||||
|
_G.AscensionExporter = AscensionExporter
|
||||||
local AE = AscensionExporter
|
local AE = AscensionExporter
|
||||||
|
|
||||||
local function get_active_group()
|
local function get_active_group()
|
||||||
@@ -54,3 +57,6 @@ function AE.CollectTalents()
|
|||||||
|
|
||||||
return out
|
return out
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Mark module as loaded for debug visibility
|
||||||
|
AE._loadedTalents = true
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
-- AscensionExporter - Core
|
-- AscensionExporter - Core
|
||||||
local ADDON_NAME = ...
|
local ADDON_NAME = ...
|
||||||
local AE = {}
|
AscensionExporter = AscensionExporter or {}
|
||||||
AscensionExporter = AE
|
local AE = AscensionExporter
|
||||||
|
|
||||||
-- SavedVariables defaults
|
-- SavedVariables defaults
|
||||||
AscensionExporterConfig = AscensionExporterConfig or {}
|
AscensionExporterConfig = AscensionExporterConfig or {}
|
||||||
@@ -22,6 +22,15 @@ local function IsArray(t)
|
|||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- normalize simple string args (trim + lower)
|
||||||
|
local function Norm(s)
|
||||||
|
if s == nil then return nil end
|
||||||
|
s = tostring(s):lower()
|
||||||
|
s = s:match("^%s*(.-)%s*$") or s
|
||||||
|
if s == "" then return nil end
|
||||||
|
return s
|
||||||
|
end
|
||||||
|
|
||||||
-- Shims for safety
|
-- Shims for safety
|
||||||
local function SafeCall(fn, ...)
|
local function SafeCall(fn, ...)
|
||||||
local ok, r = pcall(fn, ...)
|
local ok, r = pcall(fn, ...)
|
||||||
@@ -31,6 +40,7 @@ end
|
|||||||
|
|
||||||
-- Export assembly
|
-- Export assembly
|
||||||
function AE:AssembleExport(which)
|
function AE:AssembleExport(which)
|
||||||
|
which = Norm(which)
|
||||||
local nowIso = date("!%Y-%m-%dT%H:%M:%SZ")
|
local nowIso = date("!%Y-%m-%dT%H:%M:%SZ")
|
||||||
local version, build, buildDate, toc = GetBuildInfo()
|
local version, build, buildDate, toc = GetBuildInfo()
|
||||||
|
|
||||||
@@ -142,7 +152,8 @@ function AE:ShowExport(text, titleText)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function AE:Export(which)
|
function AE:Export(which)
|
||||||
local data = self:AssembleExport(which)
|
local normWhich = Norm(which)
|
||||||
|
local data = self:AssembleExport(normWhich)
|
||||||
-- Prefer global encoder from Util/Json.lua; fallback to a tiny local encoder if missing
|
-- Prefer global encoder from Util/Json.lua; fallback to a tiny local encoder if missing
|
||||||
local function tiny_json_encode(v)
|
local function tiny_json_encode(v)
|
||||||
local tv = type(v)
|
local tv = type(v)
|
||||||
@@ -173,7 +184,7 @@ function AE:Export(which)
|
|||||||
local json = encoder(data)
|
local json = encoder(data)
|
||||||
|
|
||||||
local title = "Ascension Export"
|
local title = "Ascension Export"
|
||||||
if which and which ~= "all" then title = title .. " - " .. which end
|
if normWhich and normWhich ~= "all" then title = title .. " - " .. normWhich end
|
||||||
self:ShowExport(json, title .. " - Copy All (Ctrl+C)")
|
self:ShowExport(json, title .. " - Copy All (Ctrl+C)")
|
||||||
|
|
||||||
if AscensionExporterConfig.enableSavedVariables then
|
if AscensionExporterConfig.enableSavedVariables then
|
||||||
@@ -272,14 +283,14 @@ SlashCmdList["ASCX"] = function(msg)
|
|||||||
-- avoid referencing buttons that won't be present in the fallback window.
|
-- avoid referencing buttons that won't be present in the fallback window.
|
||||||
local hasButtons = type(_G.AscensionExporter_ShowExportFrame) == "function"
|
local hasButtons = type(_G.AscensionExporter_ShowExportFrame) == "function"
|
||||||
local prefix = hasButtons and "Use the buttons above or type:" or "Type one of the commands:"
|
local prefix = hasButtons and "Use the buttons above or type:" or "Type one of the commands:"
|
||||||
local help = prefix .. "\n/ascx export all|talents|gear|enchants|mdgear\n/ascx sv on|off (SavedVariables is currently " .. (AscensionExporterConfig.enableSavedVariables and "ON" or "OFF") .. ")\n"
|
local help = prefix .. "\n/ascx export all|talents|gear|enchants|mdgear\n/ascx sv on|off (SavedVariables is currently " .. (AscensionExporterConfig.enableSavedVariables and "ON" or "OFF") .. ")\n/ascx debug (show collector status)\n"
|
||||||
AE:ShowExport(help, "Ascension Export - Tools & Help")
|
AE:ShowExport(help, "Ascension Export - Tools & Help")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local cmd, rest = msg:match("^(%S+)%s*(.*)$")
|
local cmd, rest = msg:match("^(%S+)%s*(.*)$")
|
||||||
if cmd == "export" then
|
if cmd == "export" then
|
||||||
rest = rest ~= "" and rest or "all"
|
rest = Norm(rest) or "all"
|
||||||
if rest == "mdgear" or rest == "md" then
|
if rest == "mdgear" or rest == "md" then
|
||||||
local md = AE:GenerateMarkdownGear()
|
local md = AE:GenerateMarkdownGear()
|
||||||
AE:ShowExport(md, "Ascension Export - Markdown Gear - Copy All (Ctrl+C)")
|
AE:ShowExport(md, "Ascension Export - Markdown Gear - Copy All (Ctrl+C)")
|
||||||
@@ -289,6 +300,44 @@ SlashCmdList["ASCX"] = function(msg)
|
|||||||
DEFAULT_CHAT_FRAME:AddMessage("AscensionExporter: unknown export target '" .. tostring(rest) .. "'")
|
DEFAULT_CHAT_FRAME:AddMessage("AscensionExporter: unknown export target '" .. tostring(rest) .. "'")
|
||||||
end
|
end
|
||||||
return
|
return
|
||||||
|
elseif cmd == "debug" then
|
||||||
|
local lines = {}
|
||||||
|
local function add(msg)
|
||||||
|
table.insert(lines, msg)
|
||||||
|
end
|
||||||
|
add("AscensionExporter debug:")
|
||||||
|
add(string.format("- AddOn: %s", tostring(ADDON_NAME)))
|
||||||
|
add(string.format("- UI available: %s", type(_G.AscensionExporter_ShowExportFrame) == "function" and "yes" or "no"))
|
||||||
|
add(string.format("- JSON encoder: %s", type(_G.AscensionExporter_Json_Encode) == "function" and "yes" or "no"))
|
||||||
|
add(string.format("- Modules loaded flags: talents=%s gear=%s enchants=%s",
|
||||||
|
tostring(AE._loadedTalents or false), tostring(AE._loadedGear or false), tostring(AE._loadedEnchants or false)))
|
||||||
|
-- Talents
|
||||||
|
if type(AE.CollectTalents) == "function" then
|
||||||
|
local t = SafeCall(AE.CollectTalents) or {}
|
||||||
|
local n = #(t.selected or {})
|
||||||
|
add(string.format("Talents: OK, selected=%d", n))
|
||||||
|
else
|
||||||
|
add("Talents: MISSING function")
|
||||||
|
end
|
||||||
|
-- Gear
|
||||||
|
if type(AE.CollectGear) == "function" then
|
||||||
|
local g = SafeCall(AE.CollectGear) or {}
|
||||||
|
local n = #(g.slots or {})
|
||||||
|
add(string.format("Gear: OK, slots=%d", n))
|
||||||
|
else
|
||||||
|
add("Gear: MISSING function")
|
||||||
|
end
|
||||||
|
-- Enchants
|
||||||
|
if type(AE.CollectMysticEnchants) == "function" then
|
||||||
|
local e = SafeCall(AE.CollectMysticEnchants) or {}
|
||||||
|
local nps = #(e.perSlot or {})
|
||||||
|
local na = #(e.active or {})
|
||||||
|
add(string.format("MysticEnchants: OK, perSlot=%d, active=%d", nps, na))
|
||||||
|
else
|
||||||
|
add("MysticEnchants: MISSING function")
|
||||||
|
end
|
||||||
|
AE:ShowExport(table.concat(lines, "\n"), "Ascension Export - Debug")
|
||||||
|
return
|
||||||
elseif cmd == "sv" then
|
elseif cmd == "sv" then
|
||||||
if rest == "on" then
|
if rest == "on" then
|
||||||
AscensionExporterConfig.enableSavedVariables = true
|
AscensionExporterConfig.enableSavedVariables = true
|
||||||
@@ -305,12 +354,11 @@ SlashCmdList["ASCX"] = function(msg)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Basic event binding (not strictly necessary for slash-only usage)
|
-- Basic event binding
|
||||||
local f = CreateFrame("Frame")
|
local f = CreateFrame("Frame")
|
||||||
f:RegisterEvent("ADDON_LOADED")
|
f:RegisterEvent("ADDON_LOADED")
|
||||||
f:SetScript("OnEvent", function(_, event, addon)
|
f:SetScript("OnEvent", function(_, event, addon)
|
||||||
if event == "ADDON_LOADED" and addon == ADDON_NAME then
|
if event == "ADDON_LOADED" and addon == "AscensionExporter" then
|
||||||
-- init defaults if needed
|
|
||||||
AscensionExporterConfig.enableSavedVariables = AscensionExporterConfig.enableSavedVariables and true or false
|
AscensionExporterConfig.enableSavedVariables = AscensionExporterConfig.enableSavedVariables and true or false
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|||||||
Executable
+39
@@ -0,0 +1,39 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Installs/syncs the AscensionExporter addon into your WoW Ascension AddOns folder.
|
||||||
|
# Default target: /srv/add01/wow-ascension/Interface/AddOns
|
||||||
|
# Usage:
|
||||||
|
# scripts/install_addon_sub.sh [TARGET_ADDONS_DIR]
|
||||||
|
# Example:
|
||||||
|
# scripts/install_addon_sub.sh /srv/add01/wow-ascension/Interface/AddOns
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
REPO_ROOT="${SCRIPT_DIR}/.."
|
||||||
|
|
||||||
|
SRC="${REPO_ROOT}/AscensionExporter"
|
||||||
|
DEST_BASE="${1:-/srv/add01/wow-ascension/Interface/AddOns}"
|
||||||
|
DEST="${DEST_BASE}/AscensionExporter"
|
||||||
|
|
||||||
|
if [[ ! -d "${SRC}" ]]; then
|
||||||
|
echo "ERROR: Source addon folder not found at: ${SRC}" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Installing AscensionExporter from: ${SRC}"
|
||||||
|
echo "Target AddOns directory: ${DEST_BASE}"
|
||||||
|
|
||||||
|
mkdir -p "${DEST_BASE}"
|
||||||
|
|
||||||
|
if command -v rsync >/dev/null 2>&1; then
|
||||||
|
echo "Using rsync to copy files..."
|
||||||
|
rsync -a --delete "${SRC}/" "${DEST}/"
|
||||||
|
else
|
||||||
|
echo "rsync not found; using cp -a"
|
||||||
|
mkdir -p "${DEST}"
|
||||||
|
# Copy contents of SRC into DEST, preserving attributes
|
||||||
|
cp -a "${SRC}/." "${DEST}/"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Done. Addon installed to: ${DEST}"
|
||||||
|
echo "If needed, enable it on the character select screen and type /reload in-game."
|
||||||
Reference in New Issue
Block a user