chore: flatten Altoholic-Addon/ wrapper + add standard .gitignore/.gitattributes

Each DataStore_* / Altoholic_* addon now lives at the repo root, matching
the Exiles fork-layout convention (one folder per addon, no wrapper dir).
This commit is contained in:
2026-05-25 10:59:24 +02:00
parent 7789489aec
commit bbe2492a5b
387 changed files with 2 additions and 0 deletions
+381
View File
@@ -0,0 +1,381 @@
local addonName = ...
_G[addonName] = LibStub("AceAddon-3.0"):NewAddon(addonName, "AceConsole-3.0", "AceEvent-3.0", "AceComm-3.0", "AceSerializer-3.0")
local addon = _G[addonName]
addon.Version = "v3.3.002b"
addon.VersionNum = 303002
local L = LibStub("AceLocale-3.0"):GetLocale(addonName)
local commPrefix = addonName
BINDING_HEADER_ALTOHOLIC = addonName;
BINDING_NAME_ALTOHOLIC_TOGGLE = "Toggle UI";
local options = {
type= "group",
args = {
search = {
type = "input",
name = L['search'],
usage = "<item name>",
desc = L["Search in bags"],
get = false,
set = "CmdSearchBags",
},
show = {
type = "execute",
name = L['show'],
desc = L["Shows the UI"],
func = function() AltoholicFrame:Show() end
},
hide = {
type = "execute",
name = L['hide'],
desc = L["Hides the UI"],
func = function() AltoholicFrame:Hide() end
},
toggle = {
type = "execute",
name = L['toggle'],
desc = L["Toggles the UI"],
func = function() addon:ToggleUI() end
},
},
}
local AddonDB_Defaults = {
global = {
Guilds = {
['*'] = { -- ["Account.Realm.Name"]
hideInTooltip = nil, -- true if this guild should not be shown in the tooltip counters
},
},
Characters = {
['*'] = { -- ["Account.Realm.Name"]
Friends = {},
SavedInstance = {}, -- raid timers
Calendar = {},
Timers = {}, -- goes in pair with Calendar, different table to prevent messing with Calendar, SavedInstance and ProfessionCooldowns, used for eggs among others
ConnectMMO = {}, -- Imported events come here
},
},
Sharing = {
Clients = {},
SharedContent = { -- lists the shared content
-- ["Account.Realm.Name"] = true means the char is shared,
-- ["Account.Realm.Name.Module"] = true means the module is shared for that char
},
Domains = {
['*'] = { -- ["Account.Realm"]
lastSharingTimestamp = nil, -- a date, the last time information from this realm/account was queried and successfully saved.
lastUpdatedWith = nil, -- last player with whom the account sharing took place
},
},
},
unsafeItems = {},
options = {
-- ** Misc options **
TabSummaryMode = 2,
lastContainerView = 1, -- default container view = bags+bank
-- ** General options **
RestXPMode = 0, -- display max rest xp in normal 100% mode or in level equivalent 150% mode (1) ?
AccSharingHandlerEnabled = 0, -- account sharing communication handler is disabled by default
GuildBankAutoUpdate = 0, -- can the guild bank tabs update requests be answered automatically or not.
GuildHandlerEnabled = 1, -- guild communication handler is enabled by default
UIScale = 1.0,
UITransparency = 1.0,
ClampWindowToScreen = 0,
-- ** Search options **
TotalLoots = 0, -- make at least one search in the loot tables to initialize these values
UnknownLoots = 0,
SearchAutoQuery = 0,
SortDescending = 0, -- display search results in the loot table in ascending (0) or descending (1) order ?
IncludeNoMinLevel = 1,
IncludeMailbox = 1,
IncludeGuildBank = 1,
IncludeRecipes = 1,
IncludeGuildSkills = 1, -- search other guild members' professions ? (via their profession links)
-- ** Mail options **
GuildMailWarning = 1, -- be informed when a guildie sends a mail to one of my alts
NameAutoComplete = 1,
-- ** Minimap options **
MinimapIconAngle = 180,
MinimapIconRadius = 78,
ShowMinimap = 1,
-- ** Tooltip options **
TooltipQuestStartItem = 1,
TooltipSource = 1,
TooltipCount = 1,
TooltipTotal = 1,
TooltipRecipeInfo = 1,
TooltipPetInfo = 1,
TooltipItemID = 0, -- display item id & item level in the tooltip (default: off)
TooltipGatheringNode = 1, -- display counters when mousing over a gathering node (default: on)
TooltipCrossFaction = 1, -- display counters for both factions on a pve server
TooltipMultiAccount = 1, -- display counters for all accounts on the same realm
TooltipGuildBank = 1,
TooltipGuildBankCount = 1, -- total count = alts + guildbank (1) or alts only (0)
TooltipGuildBankCountPerTab = 0, -- guild count = guild:count or guild (tab 1: x, tab2: y ..)
-- ** Calendar options **
WeekStartsMonday = 0,
WarningDialogBox = 0, -- use a dialog box for warnings (1), or default chat frame (0)
DisableWarnings = 0,
WarningType1 = "30|15|10|5|4|3|2|1", -- for profession cooldowns
WarningType2 = "30|15|10|5|4|3|2|1", -- for dungeon resets
WarningType3 = "30|15|10|5|4|3|2|1", -- for calendar events
WarningType4 = "30|15|10|5|4|3|2|1", -- for item timers (like mysterious egg)
},
LootSourceTooltip = { Alliance={db={}, version = 0}, Horde={db={}, version = 0}, },
},
}
-- ** LDB Launcher **
LibStub:GetLibrary("LibDataBroker-1.1"):NewDataObject(addonName, {
type = "launcher",
icon = "Interface\\Icons\\INV_Drink_13",
OnClick = function(clickedframe, button)
addon:ToggleUI()
end,
text = (Broker2FuBar) and addonName or nil, -- only for fubar, not for ldb
label = addonName,
})
local guildMembersVersion = {} -- hash table containing guild member info
-- Message types
local MSG_SEND_VERSION = 1 -- Send Altoholic's version
local MSG_VERSION_REPLY = 2 -- Reply
-- *** Utility functions ***
local function GuildBroadcast(messageType, ...)
local serializedData = addon:Serialize(messageType, ...)
addon:SendCommMessage(commPrefix, serializedData, "GUILD")
end
local function GuildWhisper(player, messageType, ...)
if DataStore:IsGuildMemberOnline(player) then
local serializedData = addon:Serialize(messageType, ...)
addon:SendCommMessage(commPrefix, serializedData, "WHISPER", player)
end
end
local function SaveVersion(sender, version)
guildMembersVersion[sender] = version
end
-- *** Guild Comm ***
local function OnAnnounceLogin(self, guildName)
GuildBroadcast(MSG_SEND_VERSION, addon.Version)
end
local function OnSendVersion(sender, version)
if sender ~= UnitName("player") then -- don't send back to self
GuildWhisper(sender, MSG_VERSION_REPLY, addon.Version) -- reply by sending my own version
end
SaveVersion(sender, version) -- .. and save it
end
local function OnVersionReply(sender, version)
SaveVersion(sender, version)
end
local GuildCommCallbacks = {
[MSG_SEND_VERSION] = OnSendVersion,
[MSG_VERSION_REPLY] = OnVersionReply,
}
function addon:OnInitialize()
addon.db = LibStub("AceDB-3.0"):New(addonName .. "DB", AddonDB_Defaults)
LibStub("AceConfig-3.0"):RegisterOptionsTable(addonName, options)
addon:RegisterChatCommand("Altoholic", "ChatCommand")
addon:RegisterChatCommand("Alto", "ChatCommand")
DataStore:SetGuildCommCallbacks(commPrefix, GuildCommCallbacks)
addon:RegisterMessage("DATASTORE_ANNOUNCELOGIN", OnAnnounceLogin)
addon:RegisterMessage("DATASTORE_GUILD_ALTS_RECEIVED")
addon:RegisterComm("AltoShare", "AccSharingHandler")
addon:RegisterComm(commPrefix, DataStore:GetGuildCommHandler())
addon:RegisterMessage("DATASTORE_BANKTAB_REQUESTED")
addon:RegisterMessage("DATASTORE_BANKTAB_REQUEST_ACK")
addon:RegisterMessage("DATASTORE_BANKTAB_REQUEST_REJECTED")
addon:RegisterMessage("DATASTORE_BANKTAB_UPDATE_SUCCESS")
addon:RegisterMessage("DATASTORE_PLAYER_EQUIPMENT_RECEIVED")
addon:RegisterMessage("DATASTORE_GUILD_BANKTABS_UPDATED")
addon:RegisterMessage("DATASTORE_GUILD_PROFESSION_RECEIVED")
addon:RegisterMessage("DATASTORE_GUILD_MEMBER_OFFLINE")
addon:RegisterMessage("DATASTORE_GUILD_MAIL_RECEIVED")
addon:RegisterMessage("DATASTORE_GLOBAL_MAIL_EXPIRY")
addon.Loots:setupLootTable()
end
function addon:GetGuildMemberVersion(member)
if guildMembersVersion[member] then -- version number of a main ?
return guildMembersVersion[member] -- return it immediately
end
-- check if member is an alt
local main = DataStore:GetNameOfMain(member)
if main and guildMembersVersion[main] then
return guildMembersVersion[main]
end
end
function addon:ChatCommand(input)
if not input then
LibStub("AceConfigDialog-3.0"):Open(addonName)
else
LibStub("AceConfigCmd-3.0").HandleCommand(addon, "Alto", "Altoholic", input)
end
end
addon.Guild = {}
addon.TradeSkills = {}
addon.TradeSkills.Recipes = {}
-- ** Tabs **
local tabList = {
"Summary",
"Characters",
"Search",
"GuildBank",
"Achievements",
}
local function SafeLoadAddOn(name)
if not IsAddOnLoaded(name) then
LoadAddOn(name)
end
end
local function ShowTab(name)
local tab = _G[addonName.."Tab" .. name]
if tab then
tab:Show()
end
end
local function HideTab(name)
local tab = _G[addonName.."Tab" .. name]
if tab then
tab:Hide()
end
end
addon.Tabs = {}
function addon.Tabs:HideAll()
for _, tabName in pairs(tabList) do
HideTab(tabName)
end
end
function addon.Tabs:OnClick(index)
PanelTemplates_SetTab(_G[addonName.."Frame"], index);
self:HideAll()
self.current = index
self.Columns.prefix = addonName.."Tab"..tabList[index].."_Sort"
if index == 5 then
SafeLoadAddOn(format("%s_%s", addonName, tabList[index])) -- make this part a bit more generic once we'll have more LoD parts
end
ShowTab(tabList[index])
end
addon.Tabs.Columns = {}
function addon.Tabs.Columns:Init()
local i = 1
local prefix = self.prefix or "AltoholicTabSummary_Sort"
local button = _G[ prefix .. i ]
local arrow = _G[ prefix .. i .. "Arrow"]
while button do
arrow:Hide()
button.ascendingSort = nil -- not sorted by default
button:Hide()
i = i + 1
button = _G[ prefix .. i ]
arrow = _G[ prefix .. i .. "Arrow"]
end
self.count = 0
self.prefix = prefix
end
function addon.Tabs.Columns:Add(title, width, func)
local prefix = self.prefix
self.count = self.count + 1
local button = _G[ prefix..self.count ]
if not title then -- no title ? count the column, but hide it
button:Hide()
return
end
button:SetText(title)
button:SetWidth(width)
button:SetScript("OnClick", function(self)
local prefix = addon.Tabs.Columns.prefix
local i = 1
local arrow = _G[ prefix .. i .. "Arrow"]
while arrow do -- hide all arrows
arrow:Hide()
i = i + 1
arrow = _G[ prefix .. i .. "Arrow"]
end
arrow = _G[ prefix .. self:GetID() .. "Arrow"]
arrow:Show() -- show selected arrow
if not self.ascendingSort then
self.ascendingSort = true
arrow:SetTexCoord(0, 0.5625, 1.0, 0); -- arrow pointing up
else
self.ascendingSort = nil
arrow:SetTexCoord(0, 0.5625, 0, 1.0); -- arrow pointing down
end
if func then
func(self)
end
end)
button:Show()
end
-- Allow ESC to close the main frame
tinsert(UISpecialFrames, "AltoholicFrame");
tinsert(UISpecialFrames, "AltoMsgBox");
function addon:CmdSearchBags(arg1, arg2)
-- arg 1 is a table, no idea of what it does, investigate later, only arg2 matters at this point
if string.len(arg2) == 0 then
DEFAULT_CHAT_FRAME:AddMessage("|cFF00FF9A" .. L["Altoholic:|r Usage = /altoholic search <item name>"])
return
end
if not (AltoholicFrame:IsVisible()) then
AltoholicFrame:Show();
end
AltoholicFrame_SearchEditBox:SetText(strlower(arg2))
addon.Search:FindItem();
end