Code format

This commit is contained in:
2025-05-06 22:00:50 +02:00
parent 4c3913ca3f
commit f1b1a384d4
7 changed files with 440 additions and 474 deletions

View File

@@ -1 +1,5 @@
C:/Users/Administrator/Seafile/Games-WoW/Ruski/Interface/AddOns/ActionBarSaverReloaded/Meta/.luacheckrc
globals = { "CykaPersistentData", "CreateFrame", "GetItemInfo" }
unused_args = false
max_line_length = 150
exclude_files = { "Meta/" }
global = false

View File

@@ -1 +1,11 @@
C:/Users/Administrator/Seafile/Games-WoW/Ruski/Interface/AddOns/ActionBarSaverReloaded/Meta/.luarc.json
{
"workspace": {
"library": [
"./Meta"
]
},
"diagnostics.disable": [
"unused-local",
"unused-vararg"
]
}

View File

@@ -1,268 +1,276 @@
local ADDON_LOADED, shared = ...
local typeMap = {
spell = "S",
item = "I",
macro = "M",
companion = "C",
equipmentset = "E",
summonmount = "U"
spell = "S",
item = "I",
macro = "M",
companion = "C",
equipmentset = "E",
summonmount = "U",
}
local inverseTypeMap = {
S = "spell",
I = "item",
M = "macro",
C = "companion",
E = "equipmentset",
U = "summonmount"
S = "spell",
I = "item",
M = "macro",
C = "companion",
E = "equipmentset",
U = "summonmount",
}
local function PickupEquipmentSet(setName)
local setIndex = 0
local setIndex = 0
for i = 1, C_EquipmentSet.GetNumEquipmentSets() do
local sn = C_EquipmentSet.GetEquipmentSetInfo(i)
for i = 1, C_EquipmentSet.GetNumEquipmentSets() do
local sn = C_EquipmentSet.GetEquipmentSetInfo(i)
if sn == setName then
setIndex = i
end
end
if sn == setName then setIndex = i end
end
C_EquipmentSet.PickupEquipmentSet(setIndex)
C_EquipmentSet.PickupEquipmentSet(setIndex)
end
local pickupActionButton = {
item = PickupItem,
spell = PickupSpell,
macro = PickupMacro,
companion = PickupSpell,
equipmentset = PickupEquipmentSet,
summonmount = C_MountJournal.Pickup
item = PickupItem,
spell = PickupSpell,
macro = PickupMacro,
companion = PickupSpell,
equipmentset = PickupEquipmentSet,
summonmount = C_MountJournal.Pickup,
}
local function RestoreActionButton(self, index, actionButton)
if GetActionInfo(index) then
PickupAction(index)
ClearCursor()
end
if GetActionInfo(index) then
PickupAction(index)
ClearCursor()
end
if not actionButton then
return true, nil
end
if not actionButton then return true, nil end
local aliases = ActionBarSaverReloaded.spellAliases[actionButton.id] or {}
table.insert(aliases, actionButton.id)
local aliases = ActionBarSaverReloaded.spellAliases[actionButton.id] or {}
table.insert(aliases, actionButton.id)
for _, id in ipairs(aliases) do
pickupActionButton[actionButton.type](id)
for _, id in ipairs(aliases) do
pickupActionButton[actionButton.type](id)
if GetCursorInfo() == actionButton.type then
PlaceAction(index)
return true, id
end
if GetCursorInfo() == actionButton.type then
PlaceAction(index)
return true, id
end
ClearCursor()
end
ClearCursor()
end
return false
return false
end
local function IsMacro(actionButton)
return actionButton and actionButton.type == "macro"
end
local function IsMacro(actionButton) return actionButton and actionButton.type == "macro" end
local function GetMacroDuplicates()
local t = {}
local duplicates = {}
local t = {}
local duplicates = {}
for i = 1, MAX_MACROS do
local macroName = GetMacroInfo(i)
for i = 1, MAX_MACROS do
local macroName = GetMacroInfo(i)
if macroName then
if not t[macroName] then
t[macroName] = 1
else
t[macroName] = t[macroName] + 1
duplicates[macroName] = t[macroName]
end
end
end
if macroName then
if not t[macroName] then
t[macroName] = 1
else
t[macroName] = t[macroName] + 1
duplicates[macroName] = t[macroName]
end
end
end
return duplicates
return duplicates
end
local function AddWarning(warnings, macroName, usages)
table.insert(warnings, string.format("Warning: Found %d macros named '%s'. Consider renaming them to avoid issues",
usages, macroName))
table.insert(
warnings,
string.format("Warning: Found %d macros named '%s'. Consider renaming them to avoid issues", usages, macroName)
)
end
function SaveSet(setName)
if not setName or setName == "" then
print("Set name cannot be empty")
return
end
if not setName or setName == "" then
print("Set name cannot be empty")
return
end
local duplicates = GetMacroDuplicates()
local set = {}
local warnings = {}
local duplicates = GetMacroDuplicates()
local set = {}
local warnings = {}
for i = 1, MAX_ACTION_BUTTONS do
local type, id = GetActionInfo(i)
for i = 1, MAX_ACTION_BUTTONS do
local type, id = GetActionInfo(i)
if type == "macro" then
-- use macro name as the ID
id = GetMacroInfo(id)
if duplicates[id] then
AddWarning(warnings, id, duplicates[id])
end
end
if type == "macro" then
-- use macro name as the ID
id = GetMacroInfo(id)
if duplicates[id] then AddWarning(warnings, id, duplicates[id]) end
end
if type and id then
set[i] = type and {
type = type,
id = id
}
end
end
if type and id then set[i] = type and {
type = type,
id = id,
} end
end
ActionBarSaverReloaded.sets[setName] = set
print(string.format("Saved set '%s'!", setName))
for _, warning in ipairs(warnings) do
print(warning)
end
ActionBarSaverReloaded.sets[setName] = set
print(string.format("Saved set '%s'!", setName))
for _, warning in ipairs(warnings) do
print(warning)
end
end
function RestoreSet(setName)
if not setName or setName == "" then
print("Set name cannot be empty")
return
end
if not setName or setName == "" then
print("Set name cannot be empty")
return
end
local set = ActionBarSaverReloaded.sets[setName]
local set = ActionBarSaverReloaded.sets[setName]
if not set then
print(string.format("No set with the name '%s' exists", setName))
return
end
if InCombatLockdown() then
print("Cannot restore sets while in combat")
return
end
if not set then
print(string.format("No set with the name '%s' exists", setName))
return
end
if InCombatLockdown() then
print("Cannot restore sets while in combat")
return
end
local duplicates = GetMacroDuplicates()
local messages = {}
local duplicates = GetMacroDuplicates()
local messages = {}
-- Start with an empty cursor
ClearCursor()
-- Start with an empty cursor
ClearCursor()
for i = 1, MAX_ACTION_BUTTONS do
local actionButton = set[i]
for i = 1, MAX_ACTION_BUTTONS do
local actionButton = set[i]
if IsMacro(actionButton) and duplicates[actionButton.id] then
AddWarning(messages, actionButton.id, duplicates[actionButton.id])
end
if IsMacro(actionButton) and duplicates[actionButton.id] then
AddWarning(messages, actionButton.id, duplicates[actionButton.id])
end
local succeeded, restoredID = RestoreActionButton(self, i, actionButton)
if not succeeded then
table.insert(messages, string.format("Error: Unable to restore %s with id [%s] to slot %d",
actionButton.type, actionButton.id or "", i))
elseif actionButton and restoredID ~= actionButton.id then
table.insert(messages,
string.format("Info: Restored spell %d (%s) in place of spell %d", restoredID, GetSpellInfo(restoredID),
actionButton.id))
end
end
local succeeded, restoredID = RestoreActionButton(self, i, actionButton)
if not succeeded then
table.insert(
messages,
string.format(
"Error: Unable to restore %s with id [%s] to slot %d",
actionButton.type,
actionButton.id or "",
i
)
)
elseif actionButton and restoredID ~= actionButton.id then
table.insert(
messages,
string.format(
"Info: Restored spell %d (%s) in place of spell %d",
restoredID,
GetSpellInfo(restoredID),
actionButton.id
)
)
end
end
print(string.format("Restored set '%s'", setName))
for _, warning in ipairs(messages) do
print(warning)
end
print(string.format("Restored set '%s'", setName))
for _, warning in ipairs(messages) do
print(warning)
end
end
function DeleteSet(setName)
if not setName or setName == "" then
print("Set name cannot be empty")
return
end
if not setName or setName == "" then
print("Set name cannot be empty")
return
end
if not ActionBarSaverReloaded.sets[setName] then
print(string.format("No set with the name '%s' exists", setName))
return
end
if not ActionBarSaverReloaded.sets[setName] then
print(string.format("No set with the name '%s' exists", setName))
return
end
ActionBarSaverReloaded.sets[setName] = nil
ActionBarSaverReloaded.sets[setName] = nil
print(string.format("Deleted set '%s'", setName))
print(string.format("Deleted set '%s'", setName))
end
function ListSets()
local sets = {}
for setName, foo in pairs(ActionBarSaverReloaded.sets) do
sets[#sets + 1] = setName
end
table.sort(sets)
local setsStr = table.concat(sets, ", ")
local sets = {}
for setName, foo in pairs(ActionBarSaverReloaded.sets) do
sets[#sets + 1] = setName
end
table.sort(sets)
local setsStr = table.concat(sets, ", ")
print(not (not setsStr or setsStr == "") and setsStr or "No sets found")
print(not (not setsStr or setsStr == "") and setsStr or "No sets found")
end
function AliasSpell(args)
if not args or args == "" then
print("Must provide args in the format 'spellID aliasID'")
return
end
local spellID, aliasID = string.match(args, "(%d+)%s+(%d+)")
if not args or args == "" then
print("Must provide args in the format 'spellID aliasID'")
return
end
local spellID, aliasID = string.match(args, "(%d+)%s+(%d+)")
spellID = tonumber(spellID)
aliasID = tonumber(aliasID)
spellID = tonumber(spellID)
aliasID = tonumber(aliasID)
if not (spellID and aliasID) then
print(string.format("Could not parse spellID and aliasID from '%s'", args))
return
end
if not (spellID and aliasID) then
print(string.format("Could not parse spellID and aliasID from '%s'", args))
return
end
local aliases = ActionBarSaverReloaded.spellAliases[spellID] or {}
local aliases = ActionBarSaverReloaded.spellAliases[spellID] or {}
for _, id in ipairs(aliases) do
if id == aliasID then
print(string.format("Spell %d is already aliased by %d", spellID, aliasID))
return
end
end
for _, id in ipairs(aliases) do
if id == aliasID then
print(string.format("Spell %d is already aliased by %d", spellID, aliasID))
return
end
end
table.insert(ActionBarSaverReloaded.spellAliases[spellID], aliasID)
print(string.format("Added %d as an alias for %d", aliasID, spellID))
table.insert(ActionBarSaverReloaded.spellAliases[spellID], aliasID)
print(string.format("Added %d as an alias for %d", aliasID, spellID))
end
function DeleteSpellAliases(spellID)
if not spellID or spellID == "" then
print("Must provide a valid spellID")
return
end
if not spellID or spellID == "" then
print("Must provide a valid spellID")
return
end
spellID = tonumber(spellID)
spellID = tonumber(spellID)
if not ActionBarSaverReloaded.spellAliases[spellID] then
print(string.format("No aliases to remove for spell with ID %d", spellID))
return
end
if not ActionBarSaverReloaded.spellAliases[spellID] then
print(string.format("No aliases to remove for spell with ID %d", spellID))
return
end
ActionBarSaverReloaded.spellAliases[spellID] = nil
ActionBarSaverReloaded.spellAliases[spellID] = nil
print(string.format("Removed all aliases for spell with ID %d", spellID))
print(string.format("Removed all aliases for spell with ID %d", spellID))
end
function ListAliases()
local aliases = ActionBarSaverReloaded.spellAliases
local aliases = ActionBarSaverReloaded.spellAliases
if Dict.isEmpty(aliases) then
print("No aliases found")
return
end
if Dict.isEmpty(aliases) then
print("No aliases found")
return
end
Dict.iter(ActionBarSaverReloaded.spellAliases, function(spellID, aliases)
print(string.format("Spell %d is aliased by: %s", spellID, table.concat(aliases, ", ")))
end)
Dict.iter(
ActionBarSaverReloaded.spellAliases,
function(spellID, aliases)
print(string.format("Spell %d is aliased by: %s", spellID, table.concat(aliases, ", ")))
end
)
end
---@param text string
@@ -270,30 +278,26 @@ end
---@param deliminer string
---@return string[]
local function Partition(text, size, deliminer)
local words = {}
for word in text:gmatch("[^" .. deliminer .. "]+") do
words[#words + 1] = word
end
local words = {}
for word in text:gmatch("[^" .. deliminer .. "]+") do
words[#words + 1] = word
end
local ret = {}
local currentChunk = ""
local ret = {}
local currentChunk = ""
for _, word in ipairs(words) do
if #currentChunk + #word + 1 <= size then
currentChunk = currentChunk .. deliminer .. word
else
if #currentChunk > 0 then
ret[#ret + 1] = currentChunk
end
currentChunk = word
end
end
for _, word in ipairs(words) do
if #currentChunk + #word + 1 <= size then
currentChunk = currentChunk .. deliminer .. word
else
if #currentChunk > 0 then ret[#ret + 1] = currentChunk end
currentChunk = word
end
end
if #currentChunk > 0 then
ret[#ret + 1] = currentChunk
end
if #currentChunk > 0 then ret[#ret + 1] = currentChunk end
return ret
return ret
end
local importingSet = nil
@@ -305,17 +309,17 @@ importExportFrame:EnableMouse(true)
importExportFrame:SetMovable(true)
importExportFrame:SetResizable(false)
importExportFrame:SetBackdrop({
bgFile = "Interface/Tooltips/UI-Tooltip-Background",
edgeFile = "Interface/Tooltips/UI-Tooltip-Border",
tile = true,
tileSize = 4,
edgeSize = 4,
insets = {
left = 4,
right = 4,
top = 4,
bottom = 4
}
bgFile = "Interface/Tooltips/UI-Tooltip-Background",
edgeFile = "Interface/Tooltips/UI-Tooltip-Border",
tile = true,
tileSize = 4,
edgeSize = 4,
insets = {
left = 4,
right = 4,
top = 4,
bottom = 4,
},
})
importExportFrame:SetBackdropColor(0, 0, 0, 0.8)
importExportFrame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1)
@@ -323,15 +327,9 @@ importExportFrame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1)
importExportFrame:SetMovable(true)
importExportFrame:EnableMouse(true)
importExportFrame:RegisterForDrag("LeftButton")
importExportFrame:SetScript("OnDragStart", function(self)
self:StartMoving()
end)
importExportFrame:SetScript("OnDragStop", function(self)
self:StopMovingOrSizing()
end)
importExportFrame:SetScript("OnShow", function(self)
self:SetScale(1)
end)
importExportFrame:SetScript("OnDragStart", function(self) self:StartMoving() end)
importExportFrame:SetScript("OnDragStop", function(self) self:StopMovingOrSizing() end)
importExportFrame:SetScript("OnShow", function(self) self:SetScale(1) end)
importExportFrame:Hide()
local importExportFrameTextBox = CreateFrame("EditBox", "ABSImportExportFrameTextBox", importExportFrame)
@@ -344,207 +342,179 @@ importExportFrameTextBox:SetMultiLine(true)
importExportFrameTextBox:SetAutoFocus(true)
importExportFrameTextBox:SetMaxLetters(1000000)
importExportFrameTextBox:SetScript("OnEscapePressed", function(self)
importExportFrame:Hide()
if importingSet then
local lines = {strsplit("\n", self:GetText())}
for _, line in ipairs(lines) do
line = strtrim(line)
if line ~= "" then
ImportSet(importingSet, line)
end
end
importingSet = nil
end
importExportFrame:Hide()
if importingSet then
local lines = { strsplit("\n", self:GetText()) }
for _, line in ipairs(lines) do
line = strtrim(line)
if line ~= "" then ImportSet(importingSet, line) end
end
importingSet = nil
end
end)
function ExportSet(setName)
local set = ActionBarSaverReloaded.sets[setName]
if not set then
print(string.format("No set with the name '%s' exists", setName))
return
end
local macros = {}
local stringified = {}
for slot, action in pairs(set) do
local typeChar = typeMap[action.type]
if not typeChar then
print(string.format("Unknown action type '%s' in set '%s'", action.type, setName))
return
end
stringified[#stringified + 1] = string.format("%s\\%s\\%s", tostring(slot), tostring(action.id),
tostring(typeChar))
if typeChar == "M" then
local _, _, macro = GetMacroInfo(action.id)
if macro then
macros[action.id] = macro
end
end
end
local set = ActionBarSaverReloaded.sets[setName]
if not set then
print(string.format("No set with the name '%s' exists", setName))
return
end
local macros = {}
local stringified = {}
for slot, action in pairs(set) do
local typeChar = typeMap[action.type]
if not typeChar then
print(string.format("Unknown action type '%s' in set '%s'", action.type, setName))
return
end
stringified[#stringified + 1] =
string.format("%s\\%s\\%s", tostring(slot), tostring(action.id), tostring(typeChar))
if typeChar == "M" then
local _, _, macro = GetMacroInfo(action.id)
if macro then macros[action.id] = macro end
end
end
local export = {}
for name, macro in pairs(macros) do
local content = B64.Encode(macro)
export[#export + 1] = string.format("Mž%sž%s", name, content)
end
export[#export + 1] = table.concat(stringified, "ž")
local str = table.concat(export, "\n")
importExportFrame:Show()
importExportFrameTextBox:SetText(str)
importExportFrameTextBox:SetFocus()
local export = {}
for name, macro in pairs(macros) do
local content = B64.Encode(macro)
export[#export + 1] = string.format("Mž%sž%s", name, content)
end
export[#export + 1] = table.concat(stringified, "ž")
local str = table.concat(export, "\n")
importExportFrame:Show()
importExportFrameTextBox:SetText(str)
importExportFrameTextBox:SetFocus()
end
function ParseAction(action)
if not action or action == "" then
return nil
end
action = strtrim(action)
local slot, id, typeChar = string.match(action, "([^\\]+)\\([^\\]+)\\([^\\]+)")
if not typeChar then
print(string.format("Unknown action type '%s' in set '%s'", tostring(typeChar), tostring(setName)))
return
end
local type = inverseTypeMap[typeChar]
if not type then
print(string.format("Unknown action type '%s' in set '%s'", tostring(typeChar), tostring(setName)))
return
end
if not action or action == "" then return nil end
action = strtrim(action)
local slot, id, typeChar = string.match(action, "([^\\]+)\\([^\\]+)\\([^\\]+)")
if not typeChar then
print(string.format("Unknown action type '%s' in set '%s'", tostring(typeChar), tostring(setName)))
return
end
local type = inverseTypeMap[typeChar]
if not type then
print(string.format("Unknown action type '%s' in set '%s'", tostring(typeChar), tostring(setName)))
return
end
slot = tonumber(slot)
slot = tonumber(slot)
if not slot then
print(string.format("Unknown slot '%s' in set '%s'", tostring(slot), tostring(setName)))
return
end
if not slot then
print(string.format("Unknown slot '%s' in set '%s'", tostring(slot), tostring(setName)))
return
end
if not id then
print(string.format("Unknown id '%s' in set '%s'", tostring(id), tostring(setName)))
return
end
if not id then
print(string.format("Unknown id '%s' in set '%s'", tostring(id), tostring(setName)))
return
end
return {
slot = slot,
id = id,
type = type
}
return {
slot = slot,
id = id,
type = type,
}
end
function ImportMacro(importString)
if not importString or importString == "" then
print("Must provide a valid macro string")
return
end
importString = strtrim(importString)
local name, content = string.match(importString, "^Mž([^ž]+)ž([^ž]+)")
if not name or not content then
print("Error: Invalid macro part format")
return
end
content = strtrim(content)
name = strtrim(name)
if not importString or importString == "" then
print("Must provide a valid macro string")
return
end
importString = strtrim(importString)
local name, content = string.match(importString, "^Mž([^ž]+)ž([^ž]+)")
if not name or not content then
print("Error: Invalid macro part format")
return
end
content = strtrim(content)
name = strtrim(name)
local reconstructed = B64.Decode(content)
local macroIdx = GetMacroIndexByName(name)
if macroIdx == 0 then
macroIdx = CreateMacro(name, "Inv_misc_questionmark", "")
macroIdx = GetMacroIndexByName(name)
end
EditMacro(macroIdx, name, nil, reconstructed)
print(string.format("Imported macro '%s' with index %d and content '%s'", name, macroIdx, reconstructed))
return
local reconstructed = B64.Decode(content)
local macroIdx = GetMacroIndexByName(name)
if macroIdx == 0 then
macroIdx = CreateMacro(name, "Inv_misc_questionmark", "")
macroIdx = GetMacroIndexByName(name)
end
EditMacro(macroIdx, name, nil, reconstructed)
print(string.format("Imported macro '%s' with index %d and content '%s'", name, macroIdx, reconstructed))
return
end
function ImportSet(setName, str)
if not setName or setName == "" then
print("Must provide a valid set name")
return
end
if not setName or setName == "" then
print("Must provide a valid set name")
return
end
if string.find(str, "^Mž") then
ImportMacro(str)
return
end
local set = ActionBarSaverReloaded.sets[setName] or {}
-- if set then
-- print(string.format("Set '%s' already exists", setName))
-- return
-- end
if string.find(str, "^Mž") then
ImportMacro(str)
return
end
local set = ActionBarSaverReloaded.sets[setName] or {}
-- if set then
-- print(string.format("Set '%s' already exists", setName))
-- return
-- end
str = strtrim(str)
local data = {strsplit("ž", str)}
for _, action in ipairs(data) do
local paction = ParseAction(action)
if paction then
set[paction.slot] = {
type = paction.type,
id = paction.id
}
end
end
str = strtrim(str)
local data = { strsplit("ž", str) }
for _, action in ipairs(data) do
local paction = ParseAction(action)
if paction then set[paction.slot] = {
type = paction.type,
id = paction.id,
} end
end
-- /dump ActionBarSaverReloaded.sets["havoc"]
-- /dump ActionBarSaverReloaded.sets["havoc2"]
ActionBarSaverReloaded.sets[setName] = set
print(string.format("Imported set '%s'", setName))
-- /dump ActionBarSaverReloaded.sets["havoc"]
-- /dump ActionBarSaverReloaded.sets["havoc2"]
ActionBarSaverReloaded.sets[setName] = set
print(string.format("Imported set '%s'", setName))
end
function ImportSetDialogue(setName)
if not setName or setName == "" then
print("Must provide a valid set name")
return
end
importingSet = setName
importExportFrameTextBox:SetText("")
importExportFrame:Show()
importExportFrameTextBox:SetFocus()
if not setName or setName == "" then
print("Must provide a valid set name")
return
end
importingSet = setName
importExportFrameTextBox:SetText("")
importExportFrame:Show()
importExportFrameTextBox:SetFocus()
end
function PrintUsage()
print("ABS Slash commands")
print("/abs save <set> - Saves your current action bar setup under the given <set>")
print("/abs restore <set> - Restores the saved <set>")
print("/abs delete <set> - Deletes the saved <set>")
print("/abs list - Lists all saved sets")
print("/abs alias <spellID> <aliasID> - Adds an alias with <aliasID> to <spellID>")
print("/abs unalias <spellID> - Removes all aliases associated with <spellID>")
print("/abs aliases - List all spell aliases")
print("/abs export <set> - Brings up a dialog to export the given <set>")
print("/abs import <set> - Brings up a dialog to import the given <set>")
print("ABS Slash commands")
print("/abs save <set> - Saves your current action bar setup under the given <set>")
print("/abs restore <set> - Restores the saved <set>")
print("/abs delete <set> - Deletes the saved <set>")
print("/abs list - Lists all saved sets")
print("/abs alias <spellID> <aliasID> - Adds an alias with <aliasID> to <spellID>")
print("/abs unalias <spellID> - Removes all aliases associated with <spellID>")
print("/abs aliases - List all spell aliases")
print("/abs export <set> - Brings up a dialog to export the given <set>")
print("/abs import <set> - Brings up a dialog to import the given <set>")
end
SlashCmdList["ABS"] = function(argv)
local args = {strsplit(" ", argv)}
local cmd = args[1]
local args = { strsplit(" ", argv) }
local cmd = args[1]
if cmd == "save" then
SaveSet(args[2])
end
if cmd == "restore" then
RestoreSet(args[2])
end
if cmd == "delete" then
DeleteSet(args[2])
end
if cmd == "list" then
ListSets()
end
if cmd == "alias" then
AliasSpell(args[2], args[3])
end
if cmd == "unalias" then
DeleteSpellAliases(args[2])
end
if cmd == "aliases" then
ListAliases()
end
if cmd == "export" then
ExportSet(args[2])
end
if cmd == "import" then
ImportSetDialogue(args[2])
end
if cmd == "save" then SaveSet(args[2]) end
if cmd == "restore" then RestoreSet(args[2]) end
if cmd == "delete" then DeleteSet(args[2]) end
if cmd == "list" then ListSets() end
if cmd == "alias" then AliasSpell(args[2], args[3]) end
if cmd == "unalias" then DeleteSpellAliases(args[2]) end
if cmd == "aliases" then ListAliases() end
if cmd == "export" then ExportSet(args[2]) end
if cmd == "import" then ImportSetDialogue(args[2]) end
if cmd == "" or not cmd then
PrintUsage()
end
if cmd == "" or not cmd then PrintUsage() end
end
SLASH_ABS1 = "/abs"

66
B64.lua
View File

@@ -1,46 +1,42 @@
if not B64 then
B64 = {}
end
if not B64 then B64 = {} end
local encode, decode = {}, {
[strbyte("=")] = false
[strbyte("=")] = false,
}
for value = 0, 63 do
local char = strsub('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', value + 1, value + 1)
encode[value] = char
decode[strbyte(char)] = value
local char = strsub("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", value + 1, value + 1)
encode[value] = char
decode[strbyte(char)] = value
end
local t = {}
function B64.Encode(str)
local j = 1
for i = 1, strlen(str), 3 do
local a, b, c = strbyte(str, i, i + 2)
t[j] = encode[bit.rshift(a, 2)]
t[j + 1] = encode[bit.band(bit.lshift(a, 4) + bit.rshift(b or 0, 4), 0x3F)]
t[j + 2] = b and encode[bit.band(bit.lshift(b, 2) + bit.rshift(c or 0, 6), 0x3F)] or "="
t[j + 3] = c and encode[bit.band(c, 0x3F)] or "="
j = j + 4
end
return table.concat(t, "", 1, j - 1)
local j = 1
for i = 1, strlen(str), 3 do
local a, b, c = strbyte(str, i, i + 2)
t[j] = encode[bit.rshift(a, 2)]
t[j + 1] = encode[bit.band(bit.lshift(a, 4) + bit.rshift(b or 0, 4), 0x3F)]
t[j + 2] = b and encode[bit.band(bit.lshift(b, 2) + bit.rshift(c or 0, 6), 0x3F)] or "="
t[j + 3] = c and encode[bit.band(c, 0x3F)] or "="
j = j + 4
end
return table.concat(t, "", 1, j - 1)
end
function B64.Decode(str)
local j = 1
if strlen(str) % 4 ~= 0 then
str = str .. string.rep("=", 4 - strlen(str) % 4)
end
assert(strlen(str) % 4 == 0, format("invalid data length: %d", strlen(str)))
for i = 1, strlen(str), 4 do
local ba, bb, bc, bd = strbyte(str, i, i + 3)
local a, b, c, d = decode[ba], decode[bb], decode[bc], decode[bd]
assert(a ~= nil, format("invalid data at position %d: '%s'", i, ba))
assert(b ~= nil, format("invalid data at position %d: '%s'", i + 1, bb))
assert(c ~= nil, format("invalid data at position %d: '%s'", i + 2, bc))
assert(d ~= nil, format("invalid data at position %d: '%s'", i + 3, bd))
t[j] = strchar(bit.lshift(a, 2) + bit.rshift(b, 4))
t[j + 1] = c and strchar(bit.band(bit.lshift(b, 4) + bit.rshift(c, 2), 0xFF)) or ""
t[j + 2] = d and strchar(bit.band(bit.lshift(c, 6) + d, 0xFF)) or ""
j = j + 3
end
return table.concat(t, "", 1, j - 1)
local j = 1
if strlen(str) % 4 ~= 0 then str = str .. string.rep("=", 4 - strlen(str) % 4) end
assert(strlen(str) % 4 == 0, format("invalid data length: %d", strlen(str)))
for i = 1, strlen(str), 4 do
local ba, bb, bc, bd = strbyte(str, i, i + 3)
local a, b, c, d = decode[ba], decode[bb], decode[bc], decode[bd]
assert(a ~= nil, format("invalid data at position %d: '%s'", i, ba))
assert(b ~= nil, format("invalid data at position %d: '%s'", i + 1, bb))
assert(c ~= nil, format("invalid data at position %d: '%s'", i + 2, bc))
assert(d ~= nil, format("invalid data at position %d: '%s'", i + 3, bd))
t[j] = strchar(bit.lshift(a, 2) + bit.rshift(b, 4))
t[j + 1] = c and strchar(bit.band(bit.lshift(b, 4) + bit.rshift(c, 2), 0xFF)) or ""
t[j + 2] = d and strchar(bit.band(bit.lshift(c, 6) + d, 0xFF)) or ""
j = j + 3
end
return table.concat(t, "", 1, j - 1)
end

View File

@@ -4,9 +4,7 @@ local ADDON_NAME, shared = ...
local frame = CreateFrame("Frame")
frame:RegisterEvent("ADDON_LOADED")
frame:SetScript("OnEvent", function(self, event, addon)
if addon ~= ADDON_NAME then
return
end
if addon ~= ADDON_NAME then return end
KeybindSaverReloaded = KeybindSaverReloaded or {}
KeybindSaverReloaded.sets = KeybindSaverReloaded.sets or {}
@@ -39,15 +37,9 @@ importExportFrame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1)
importExportFrame:SetMovable(true)
importExportFrame:EnableMouse(true)
importExportFrame:RegisterForDrag("LeftButton")
importExportFrame:SetScript("OnDragStart", function(self)
self:StartMoving()
end)
importExportFrame:SetScript("OnDragStop", function(self)
self:StopMovingOrSizing()
end)
importExportFrame:SetScript("OnShow", function(self)
self:SetScale(1)
end)
importExportFrame:SetScript("OnDragStart", function(self) self:StartMoving() end)
importExportFrame:SetScript("OnDragStop", function(self) self:StopMovingOrSizing() end)
importExportFrame:SetScript("OnShow", function(self) self:SetScale(1) end)
importExportFrame:Hide()
local importingSet = nil
@@ -64,14 +56,11 @@ importExportFrameTextBox:SetScript("OnEscapePressed", function(self)
importExportFrame:Hide()
if importingSet then
local text = self:GetText()
if text and text ~= "" then
ImportSet(importingSet, text)
end
if text and text ~= "" then ImportSet(importingSet, text) end
importingSet = nil
end
end)
local function SaveSet(setName)
if not setName or setName == "" then
print("Set name cannot be empty")
@@ -83,12 +72,10 @@ local function SaveSet(setName)
for i = 1, numBindings do
local command, category, key1, key2 = GetBinding(i)
if key1 or key2 then
set[command] = {
key1 = key1,
key2 = key2,
}
end
if key1 or key2 then set[command] = {
key1 = key1,
key2 = key2,
} end
end
KeybindSaverReloaded.sets[setName] = set
@@ -112,12 +99,8 @@ local function RestoreSet(setName)
-- Restore saved bindings
for command, keys in pairs(set) do
if keys.key1 then
SetBinding(keys.key1, command)
end
if keys.key2 then
SetBinding(keys.key2, command)
end
if keys.key1 then SetBinding(keys.key1, command) end
if keys.key2 then SetBinding(keys.key2, command) end
end
-- Save the changes
@@ -164,12 +147,8 @@ local function ExportSet(setName)
local export = {}
for command, keys in pairs(set) do
if keys.key1 then
table.insert(export, string.format("%s:%s", command, keys.key1))
end
if keys.key2 then
table.insert(export, string.format("%s:%s", command, keys.key2))
end
if keys.key1 then table.insert(export, string.format("%s:%s", command, keys.key1)) end
if keys.key2 then table.insert(export, string.format("%s:%s", command, keys.key2)) end
end
local exportStr = table.concat(export, "\n")
@@ -190,9 +169,7 @@ local function ImportSet(setName, importStr)
for _, line in ipairs(lines) do
local command, key = strsplit(":", line)
if command and key then
if not set[command] then
set[command] = {}
end
if not set[command] then set[command] = {} end
if not set[command].key1 then
set[command].key1 = key
else

View File

@@ -3,13 +3,11 @@ local ADDON_NAME, shared = ...
local frame = CreateFrame("Frame")
frame:RegisterEvent("ADDON_LOADED")
frame:SetScript("OnEvent", function(self, event, addon)
if addon ~= ADDON_NAME then
return
end
if addon ~= ADDON_NAME then return end
ActionBarSaverReloaded = ActionBarSaverReloaded or {}
ActionBarSaverReloaded.spellAliases = ActionBarSaverReloaded.spellAliases or {}
ActionBarSaverReloaded.sets = ActionBarSaverReloaded.sets or {}
ActionBarSaverReloaded = ActionBarSaverReloaded or {}
ActionBarSaverReloaded.spellAliases = ActionBarSaverReloaded.spellAliases or {}
ActionBarSaverReloaded.sets = ActionBarSaverReloaded.sets or {}
end)
-- function ABS:OnInitialize()

View File

@@ -1 +1,12 @@
C:/Users/Administrator/Seafile/Games-WoW/Ruski/Interface/AddOns/ActionBarSaverReloaded/Meta/stylua.toml
syntax = "All" # Specify a disambiguation for the style of Lua syntax being formatted. Possible options: All (default), Lua51, Lua52, Lua53, Lua54, LuaJIT, Luau, CfxLua
column_width = 120 # Approximate line length for printing. Used as a guide for line wrapping - this is not a hard requirement: lines may fall under or over the limit.
line_endings = "Windows" # Line endings type. Possible options: Unix (LF) or Windows (CRLF)
indent_type = "Tabs" # Indent type. Possible options: Tabs or Spaces
indent_width = 4 # Character size of single indentation. If indent_type is set to Tabs, this option is used as a heuristic to determine column width only.
quote_style = "AutoPreferDouble" # Quote style for string literals. Possible options: AutoPreferDouble, AutoPreferSingle, ForceDouble, ForceSingle. AutoPrefer styles will prefer the specified quote style, but fall back to the alternative if it has fewer string escapes. Force styles always use the specified style regardless of escapes.
call_parentheses = "Always" # Whether parentheses should be applied on function calls with a single string/table argument. Possible options: Always, NoSingleString, NoSingleTable, None, Input. Always applies parentheses in all cases. NoSingleString omits parentheses on calls with a single string argument. Similarly, NoSingleTable omits parentheses on calls with a single table argument. None omits parentheses in both cases. Note: parentheses are still kept in situations where removal can lead to obscurity (e.g. foo "bar".setup -> foo("bar").setup, since the index is on the call result, not the string). Input removes all automation and preserves parentheses only if they were present in input code: consistency is not enforced.
space_after_function_names = "Never" # Specify whether to add a space between the function name and parentheses. Possible options: Never, Definitions, Calls, or Always
collapse_simple_statement = "Always" # Specify whether to collapse simple statements. Possible options: Never, FunctionOnly, ConditionalOnly, or Always
[sort_requires]
enabled = false