Files
florian.berthold 5eaec81f02 chore: move addon into Chatter/ + add standard .gitignore
Matches the Exiles fork-layout convention (each addon in its own folder).
2026-05-25 10:59:27 +02:00

270 lines
7.2 KiB
Lua

Chatter = LibStub("AceAddon-3.0"):NewAddon("Chatter", "AceConsole-3.0", "AceHook-3.0") --, "AceHook-3.0", "AceTimer-3.0", "AceConsole-3.0", "AceEvent-3.0", "LibSink-2.0")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
local AceConfig = LibStub("AceConfig-3.0")
local AceConfigDialog = LibStub("AceConfigDialog-3.0")
local CreateFrame = _G.CreateFrame
local UIParent = _G.UIParent
local optFrame
local options = {
type = "group",
args = {
defaultArgs = {
type = "group",
name = L["Chatter"],
args = {
aceConfig = {
type = "execute",
name = L["Standalone Config"],
desc = L["Open a standalone config window. You might consider installing |cffffff00BetterBlizzOptions|r to make the Blizzard UI options panel resizable."],
func = function()
if InterfaceOptionsFrame and InterfaceOptionsFrame_OpenToCategory then
InterfaceOptionsFrame:Hide()
AceConfigDialog:SetDefaultSize("Chatter", 500, 550)
AceConfigDialog:Open("Chatter")
else
AceConfigDialog:SetDefaultSize("Chatter", 500, 550)
AceConfigDialog:Open("Chatter")
end
end
}
}
},
config = {
type = "execute",
guiHidden = true,
name = L["Configure"],
desc = L["Configure"],
func = Chatter.OpenConfig
},
modules = {
type = "group",
name = L["Modules"],
desc = L["Modules"],
args = {}
}
}
}
local defaults = {
profile = {
modules = {
["Disable Fading"] = false,
["Chat Autolog"] = false,
["Automatic Whisper Windows"] = false,
["Server Positioning"] = false,
}
}
}
--[[
Creating a prototype for a Decorate/UnDecorate function
Adding these in so after everything is loaded we can post decorate/undecorate the popup frames
--]]
local proto = {
Decorate = function(self,chatframe) end,
Popout = function(self,chatframe,srcChatFrame) end,
TempChatFrames = {},
AddTempChat = function(self,name) table.insert(self.TempChatFrames,name) end,
AlwaysDecorate = function(self,chatframe) end,
}
Chatter:SetDefaultModulePrototype(proto)
Chatter:SetDefaultModuleState(false)
local optionFrames = {}
local ACD3 = LibStub("AceConfigDialog-3.0")
function Chatter:OnInitialize()
self.db = LibStub("AceDB-3.0"):New("ChatterDB", defaults, "Default")
LibStub("AceConfigRegistry-3.0"):RegisterOptionsTable("Chatter", options)
LibStub("AceConfigRegistry-3.0"):RegisterOptionsTable("ChatterModules", options.args.modules)
optFrame = ACD3:AddToBlizOptions("Chatter", nil, nil, "defaultArgs")
for k, v in self:IterateModules() do
options.args.modules.args[k:gsub(" ", "_")] = {
type = "group",
name = (v.modName or k),
args = nil
}
local t
if v.GetOptions then
t = v:GetOptions()
t.settingsHeader = {
type = "header",
name = L["Settings"],
order = 12
}
end
t = t or {}
t.toggle = {
type = "toggle",
name = v.toggleLabel or (L["Enable "] .. (v.modName or k)),
width = "double",
desc = v.Info and v:Info() or (L["Enable "] .. (v.modName or k)),
order = 11,
get = function()
return Chatter.db.profile.modules[k] ~= false or false
end,
set = function(info, v)
Chatter.db.profile.modules[k] = v
if v then
Chatter:EnableModule(k)
-- L["Module"]
Chatter:Print(L["Enabled"], k, L["Module"])
else
Chatter:DisableModule(k)
Chatter:Print(L["Disabled"], k, L["Module"])
end
end
}
t.header = {
type = "header",
name = v.modName or k,
order = 9
}
if v.Info then
t.description = {
type = "description",
name = v:Info() .. "\n\n",
order = 10
}
end
options.args.modules.args[k:gsub(" ", "_")].args = t
end
local moduleList = {}
local moduleNames = {}
for k, v in pairs(options.args.modules.args) do
moduleList[v.name] = k
tinsert(moduleNames, v.name)
end
table.sort(moduleNames)
for _, name in ipairs(moduleNames) do
ACD3:AddToBlizOptions("ChatterModules", name, "Chatter", moduleList[name])
end
self:RegisterChatCommand("chatter", "OpenConfig")
self.db.RegisterCallback(self, "OnProfileChanged", "SetUpdateConfig")
self.db.RegisterCallback(self, "OnProfileCopied", "SetUpdateConfig")
self.db.RegisterCallback(self, "OnProfileReset", "SetUpdateConfig")
self:AddMenuHook(self, {
text = L["Chatter Settings"],
func = Chatter.OpenConfig,
notCheckable = 1
})
self:RawHook("FCF_Tab_OnClick", true)
self:RawHook("FCF_OpenTemporaryWindow",true)
end
do
local info = {}
local menuHooks = {}
function Chatter:AddMenuHook(module, hook)
menuHooks[module] = hook
end
function Chatter:RemoveMenuHook(module)
menuHooks[module] = nil
end
function Chatter:FCF_Tab_OnClick(...)
self.hooks.FCF_Tab_OnClick(...)
for module, v in pairs(menuHooks) do
local menu
if type(v) == "table" then
menu = v
else
menu = module[v](module, ...)
end
UIDropDownMenu_AddButton(menu)
end
end
end
function Chatter:FCF_OpenTemporaryWindow(chatType, chatTarget, sourceChatFrame, selectWindow)
local frame = self.hooks.FCF_OpenTemporaryWindow(chatType, chatTarget, sourceChatFrame, selectWindow)
if frame then
for k, v in self:IterateModules() do
if not frame.isDecorated then
v:AddTempChat(frame:GetName())
end
if v:IsEnabled() and not frame.isDecorated then
v:Decorate(frame)
end
if v:IsEnabled() then
v:Popout(frame,sourceChatFrame or DEFAULT_CHAT_FRAME)
end
v:AlwaysDecorate(frame)
end
frame.isDecorated = true
end
FCFDock_ForceReanchoring(GENERAL_CHAT_DOCK)
return frame
end
function Chatter:OpenConfig(input)
if InterfaceOptionsFrame and InterfaceOptionsFrame_OpenToCategory then
if input == "config" or not InterfaceOptionsFrame:IsResizable() then
options.args.defaultArgs.guiHidden = true
InterfaceOptionsFrame:Hide()
AceConfigDialog:SetDefaultSize("Chatter", 500, 550)
AceConfigDialog:Open("Chatter")
else
InterfaceOptionsFrame_OpenToCategory(Chatter.lastConfig)
options.args.defaultArgs.guiHidden = false
InterfaceOptionsFrame_OpenToCategory(optFrame)
end
else
LibStub("AceConfigDialog-3.0"):Open("Chatter")
end
end
do
local timer, t = nil, 0
local function update()
t = t + arg1
if t > 0.5 then
timer:SetScript("OnUpdate", nil)
Chatter:UpdateConfig()
end
end
function Chatter:SetUpdateConfig()
t = 0
timer = timer or CreateFrame("Frame", nil, UIParent)
timer:SetScript("OnUpdate", update)
end
end
function Chatter:UpdateConfig()
for k, v in self:IterateModules() do
if v:IsEnabled() then
v:Disable()
v:Enable()
end
end
end
function Chatter:OnEnable()
if not self.db.profile.welcomeMessaged then
self:Print(L["Welcome to Chatter! Type /chatter to configure."])
self.db.profile.welcomeMessaged = true
end
for k, v in self:IterateModules() do
if self.db.profile.modules[k] ~= false then
v:Enable()
end
end
if not options.args.Profiles then
options.args.Profiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.db)
self.lastConfig = ACD3:AddToBlizOptions("Chatter", L["Profiles"], "Chatter", "Profiles")
end
end
function Chatter:OnDisable()
end