Skip to main content

The Module System

XDiscordUltimate is built from 19 independent modules, each living under features.* in plugins/XDiscordUltimate/config.yml. Every module is toggled with enabled: true|false, declares its dependencies, and owns its own config section, Discord slash commands, and lifecycle.

Architecture at a Glance

  • Module — abstract base class. Each module implements getName, getDescription, enable, disable, onDiscordReady, getSlashCommands, handleSlashCommand, handleTextCommand, reload, reloadConfig, and isEnabled.
  • @DependsOn({"module-key"}) — declares a module’s dependencies. The manager verifies each dependency is enabled before enabling the module.
  • ModuleManager — registers modules, checks dependencies, enables them, and exposes lookups to the rest of the plugin.
The public API on ModuleManager:
MethodReturns
getModule(key)Module by string key
getModule(Class)Module by class
getModules()All registered modules
isModuleActive(key)Whether a module is enabled and loaded
reloadModules()Reload module state
reloadModuleConfigs()Re-read each module’s features.<key> section
Each module reads only its own features.<key> section and may register Discord slash commands and handle text commands.

Module Lifecycle

1

Register

ModuleManager discovers and registers every module.
2

Dependency check

For each module, @DependsOn is resolved. If a required module is disabled or missing, this module is skipped.
3

Enable

enable() runs once the bot is configured. The module reads its config and prepares state.
4

Discord ready

onDiscordReady() fires when JDA connects — modules register slash commands and start Discord-facing work here.
5

Disable

On shutdown or reload, disable() tears down listeners, scheduled tasks, and Discord hooks.

All 19 Modules

KeyWhat it does
chat-bridgeTwo-way chat between in-game and a Discord channel
server-loggingLogs server events to Discord
verificationLinks Discord accounts to Minecraft accounts
server-controlRuns restart/stop/kick/tps/list from Discord
admin-alertsDMs/mentions admins on TPS or RAM threshold breaches
ticketsSupport ticket system in Discord
moderationDiscord-side moderation tooling
bot-consoleRun server commands from Discord
announcementsIn-game titles plus optional Discord messages
player-statsTracks joins, messages, deaths, playtime, first/last seen
server-statusReports server status to Discord
booster-perksGrants a group + rewards to Discord server boosters
welcome-dmDMs new or newly-verified players
leaderboardAuto-updating leaderboard embed
activity-rolesAwards Discord roles by playtime
voice-channelsPlayer-count status channel + dynamic voice channels
economy-bridgeLinks Discord to in-game balances via Vault
server-ip/ip command posting the server address
whitelistDiscord-driven whitelist requests and approvals

Operator Tips

# List every module and whether it's active
/xdiscord modules

# Apply config changes without a full restart
/xdiscord reload
Enable verbose per-module logging with general.debug: true. This surfaces dependency resolution, enable/disable events, and command registration — invaluable when a module silently fails to load.
Disabling a module also disables its dependents. If another module declares @DependsOn({"verification"}) and you turn verification off, the dependent will not enable. Check /xdiscord modules after toggling to confirm the cascade.

Next Steps

Developer Module API

Build your own module on the Module base class.

Configuration

Full reference for every features.<key> section.