-
Notifications
You must be signed in to change notification settings - Fork 0
AddonChatter and SlashHelp Chat Utilities
ESO addons frequently need to:
- Print status messages to the chat window.
- Display debug information during development.
- Provide slash command help.
- Maintain consistent colors and formatting.
- Label their addon's chat messages with an addon identifier (as a prefix).
addonChatter centralizes these tasks so every addon does not need its own chat wrapper.
| Purpose | Function |
|---|---|
| User-visible messages | systemMessage() |
| Frequent developer tracing | d() |
| Explicit debug messages | debugMsg() |
| Turn debugging on | enableDebug() |
| Turn debugging off | disableDebug() |
| Toggle debugging | toggleDebug() |
| Display command help | slashHelp() |
addonChatteris designed so debug statements can remain in addon code while having almost no cost when debugging is disabled.
addonChatter is a lightweight chat message and debug output helper for ESO addons.
It provides:
- Consistent addon message prefixes.
- Colored normal messages.
- Colored debug messages.
- Runtime enabling and disabling of debug output.
- Slash command help display formatting.
addonChatter avoids repeated debug condition checks by replacing the debug function with an empty function when debugging is disabled.
Creates a new addon chat handler.
local chat = sfutil.addonChatter:New(addonName)| Parameter | Description |
|---|---|
addonName |
Name displayed in the chat message prefix. |
A new addonChatter object.
local chat = sfutil.addonChatter:New("MyAddon")The object is initialized with:
| Property | Default |
|---|---|
namecolor |
sfutil.hex.goldenrod |
normalcolor |
sfutil.hex.mocassin |
debugcolor |
sfutil.hex.ltskyblue |
isdbgon |
false |
Displays a normal addon message in ESO chat.
The message automatically receives the addon prefix and normal message color.
chat:systemMessage(...)chat:systemMessage("Settings loaded.")Output:
[MyAddon] Settings loaded.
Displays a debug message if debugging is enabled.
Debug messages are discarded without formatting or chat output.
chat:debugMsg(...)chat:debugMsg("Loading profile:", profileName)Enables debug output.
After calling this function:
chat.d(...)will output debug messages.
chat:enableDebug()
chat:debugMsg("Debug mode enabled.")Disables debug output.
Debug messages are discarded while disabled.
chat:disableDebug()Toggles the current debug state.
If debugging is enabled, it is disabled.
If debugging is disabled, it is enabled.
chat:toggleDebug()Returns the current debug state.
local enabled = chat:isDebugEnabled()| Value | Meaning |
|---|---|
true |
Debug output enabled. |
false |
Debug output disabled. |
if chat:isDebugEnabled() then
chat:debugMsg("Verbose logging active.")
endReturns the debug state as a string.
local state = chat:getDebugState()Either:
"true"
or
"false"
This is useful when displaying the state in chat or UI controls.
addonChatter supports customizing the colors used for:
- Addon prefix text.
- Normal messages.
- Debug messages.
sfutil.addonChatter:setNormalColor(hexColor)
Changes the color used for normal messages.
chat:setNormalColor(sfutil.hex.white)sfutil.addonChatter:setDebugColor(hexColor)
Changes the color used for debug messages.
chat:setDebugColor(sfutil.hex.orange)The prefix color is set during initialization but can be changed by rebuilding the prefix
chat.prefix = sfutil.initSystemMsgPrefix(
"MyAddon",
color
)The object contains a shortcut debug function:
chat.d(...)When debugging is disabled:
chat.d(...)does nothing.
When debugging is enabled:
chat.d(...)outputs a colored debug message.
This allows performance-sensitive code to avoid repeatedly checking the debug state.
Example:
chat.d("Current value:", value)instead of:
if chat:isDebugEnabled() then
chat:debugMsg("Current value:", value)
endA common addon pattern is:
local chat = sfutil.addonChatter:New("MyAddon")
chat:systemMessage("Initialized.")
chat:enableDebug()
chat.d("Loading saved variables.")For production releases:
chat:disableDebug()No additional checks are required because debug calls become no-ops.
addonChatter uses a function replacement technique for debug output:
Disabled:
self.d = function(...)
endEnabled:
self.d = function(...)
-- output message
endThis avoids a conditional check every time a debug message is generated.
This makes addonChatter suitable for addons where debug calls remain in production code but should have minimal runtime overhead.
addonChatter avoids unnecessary debug checks by replacing the debug function itself.
Disabled:
chat.d = function()
endEnabled:
chat.d = function(...)
-- send debug message
endThis makes it inexpensive to leave debug statements in production code.
Most addons register a primary slash command:
/myaddon
The command handler checks the requested subcommand:
/myaddon help
/myaddon reset
/myaddon debug
When no valid command is supplied, display help using slashHelp().
slashHelp() displays a formatted list of addon slash commands in the ESO chat window.
It provides a simple way for an addon to present its available commands to users without each addon needing to implement its own formatting, coloring, and chat output handling.
Typical uses include:
- Responding to a
/addon helpcommand. - Displaying available addon commands.
- Providing in-game command documentation.
- Keeping command descriptions consistent with addon chat formatting.
chat:slashHelp(title, cmdstable)| Parameter | Type | Description |
|---|---|---|
title |
string | Title displayed above the command list. |
cmdstable |
table | Table containing slash command definitions. |
The command table should contain entries in the following format:
{
command,
description
}Example:
local commands =
{
{"/myaddon help", "Display available commands"},
{"/myaddon reset", "Reset settings"},
{"/myaddon debug", "Toggle debug mode"},
}Each entry contains:
| Index | Description |
|---|---|
[1] |
Slash command text. |
[2] |
Description displayed to the user. |
local chat = sfutil.addonChatter:New("MyAddon")
local commands =
{
{"/myaddon help", "Show this help message"},
{"/myaddon reload", "Reload saved variables"},
{"/myaddon reset", "Restore defaults"},
}
chat:slashHelp("MyAddon Commands", commands)Output:
[MyAddon] MyAddon Commands
/myaddon help = Show this help message
/myaddon reload = Reload saved variables
/myaddon reset = Restore defaults
The description field may contain an ESO string ID instead of a text string.
Example:
local commands =
{
{"/myaddon help", SI_MYADDON_HELP},
{"/myaddon reset", SI_MYADDON_RESET},
}When the description is a number, slashHelp() automatically converts it using:
GetString(description)This allows command descriptions to support localization.
A typical addon implementation:
local HELP_COMMANDS =
{
{"/myaddon help", "Show available commands"},
{"/myaddon debug", "Toggle debug messages"},
{"/myaddon reset", "Reset settings"},
}
SLASH_COMMANDS["/myaddon"] = function(command)
if command == "help" then
chat:slashHelp(
"MyAddon Commands",
HELP_COMMANDS
)
elseif command == "debug" then
chat:toggleDebug()
elseif command == "reset" then
ResetSettings()
else
chat:slashHelp(
"MyAddon Commands",
HELP_COMMANDS
)
end
endUsers can then enter:
/myaddon help
to display the command list.
slashHelp() performs the following operations:
- Displays the supplied title using
systemMessage(). - Iterates through the command table.
- Formats each command entry.
- Applies command and description colors.
- Sends each line to ESO chat.
Conceptually:
for _, command in pairs(cmdstable) do
display(
command[1],
command[2]
)
endEach command line is formatted as:
command = description
The command portion uses the command color:
sfutil.hex.tealThe description uses the normal message color:
self.normalcolorDefine the command list once and reuse it:
local COMMANDS =
{
{"/myaddon help", SI_MYADDON_HELP},
{"/myaddon config", SI_MYADDON_CONFIG},
{"/myaddon reset", SI_MYADDON_RESET},
}Then:
chat:slashHelp(
"MyAddon Commands",
COMMANDS
)This keeps the slash command implementation and user documentation synchronized.
All help output uses the same addon prefix and color scheme.
Command descriptions can use ESO string IDs.
Adding a new command only requires adding another table entry.
Example:
{
"/myaddon export", "Export settings"
}No additional formatting code is required.
###Localization Support
Descriptions may use ESO string IDs.
Example:
local commands =
{
{
"/myaddon help",
SI_MYADDON_HELP
}
}When a description is numeric, slashHelp() automatically calls:
GetString(description)This allows command descriptions to be translated.
local HELP_COMMANDS =
{
{"/myaddon help", "Show help"},
{"/myaddon debug", "Toggle debug mode"},
{"/myaddon reset", "Reset settings"},
}
SLASH_COMMANDS["/myaddon"] =
function(command)
if command == "help" then
chat:slashHelp(
"MyAddon Commands",
HELP_COMMANDS
)
elseif command == "debug" then
chat:toggleDebug()
else
chat:slashHelp(
"MyAddon Commands",
HELP_COMMANDS
)
end
end-
slashHelp()expects each command entry to contain at least two values. - The command table may contain any number of entries.
- Descriptions may be normal strings or ESO string IDs.
- Commands are displayed in the iteration order returned by
pairs(). If a fixed display order is required, use an array andipairs()instead.