Warring NationsWarring Nations MC 1.21.1.NEOFORGE.JAVA 21
Wiki/Reference/Commands: Discord

Commands: Discord

Exhaustive reference for every command the WN Discord addon exposes: 17 top-level namespaces across three separate surfaces (Discord slash commands, ! text commands, and in-game /discord commands), roughly 130 subcommands in total.

SERVER ADMINSMODPACK DEVS
At a glance

The / Discord slash surface registers 17 top-level command roots with roughly 130 subcommands total. The identical ! text-command surface shares that same registry. A separate in-game /discord command tree adds 1 root with 21 leaf/branch commands.

Three command surfaces

WN Discord exposes the same functionality across three distinct surfaces:

/ Discord slash commands

The bot's native Discord commands. 17 top-level namespaces, roughly 130 subcommands, registered by BuiltinSlashCommands.java and eight sibling files.

! text commands

Typed in a Discord channel. Not a separate implementation - every ! command dispatches through the exact same underlying command object as its / counterpart, with identical arguments and permission gates.

In-game /discord

A completely separate command surface: a Minecraft command tree rooted at /discord, registered in-game, unrelated to the two Discord-side surfaces above. 21 leaf/branch commands.

Permission-gate vocabulary

These terms recur through every table below.

TermMeaning
everyoneNo adminOnly, no hubOnly, no inline admin check. Anyone can run it, subject to any inline link/online requirement noted.
adminOnlyThe whole top-level command requires Discord staff (invokerIsAdmin()); Discord also hides it from non-staff in its own command picker.
hubOnlyThe command only ever registers/runs in the hub Discord guild, never a nation's own linked Discord server. Auto-defaults to true whenever adminOnly(true) is set, unless the code explicitly opts out.
inline invokerIsAdmin()A specific subcommand (not the whole parent command) checks admin status itself and refuses at runtime; the parent is not adminOnly, so Discord's UI still shows it to everyone, only running it is blocked.
requireLink pattern (inline)The handler checks the invoker's linked Minecraft account itself and prompts to link if absent, rather than a dispatcher-level flag.
ownerDiagnostic bypassAn adminOnly command additionally lets the mod author's own hardcoded Discord ID bypass the staff gate, only ever combined with commands that are strictly read-only.
in-game nation permissionGated on a delegable in-game nation role permission (e.g. DECLARE_WAR, MANAGE_DIPLOMACY, MANAGE_GOVERNMENT_PERMISSION), not a hardcoded "must be leader" check; any officer holding the right custom role passes too.
publicReplyThe command's replies post visibly in the channel instead of Discord's default ephemeral (private-to-invoker) reply. Off unless explicitly noted.
i
Reply visibility. Every / slash command reply is ephemeral (private to the invoker) by default; the only exception is /dashboard, which is built with publicReply(true). Every ! text command reply is always public in the channel it was typed in; where a handler would normally reply ephemerally, the text-command adapter instead sends a normal public message that @mentions the invoker.

! text commands

A ! text command is not a separate, independently-implemented command set. Every ! command is the exact same command object registered for the / surface, driven through a text-interaction adapter instead of a real Discord interaction. Argument parsing, subcommand resolution, and every permission gate run identically for both surfaces. The only two things that differ between ! and / for a given command are reply visibility (see above), and hubOnly enforcement: a hubOnly command is never published as a slash command to a nation's own linked Discord server, but ! dispatch is guild-agnostic by design, so the dispatcher re-checks hubOnly itself and silently treats the message as unrecognized (falls through to chat relay) if typed outside the hub guild.

Prefix and form

Prefix is configurable; a blank prefix disables text commands entirely. Both namespaced (!wn nation info) and bare (!nation info) forms route to the same lookup.

Argument mapping

Args map onto the command's declared options in order. Every option but the last takes one whitespace-delimited token; the last option, if a free-text string, greedily consumes the rest of the line (e.g. !nation rename My Nation needs no quotes). A non-last multi-word value must be quoted: !nations graph "United States of America" 2026-01-01.

Help and unrecognized input

Typing help, -h, or --help redirects to /help's own handler. A pre-namespace relocated command name (e.g. !online) gets a relocation hint instead of failing silently. A genuinely unrecognized command falls through to normal chat relay rather than erroring.

Every top-level namespace below is reachable via !, subject to the hubOnly rule.

Top-level ! commandSubcommandsReachable outside the hub guild?
!nation20Yes
!nation-settings12Yes
!nations8Yes
!diplomacy8Yes
!war12Yes
!account2-4 (2 conditional on link being enabled)Yes
!server3Yes
!whitelist6No, hubOnly
!staff8-9 (1 conditional)No, hubOnly
!config4No, hubOnly
!setup7No, hubOnly
!debug11No, hubOnly
!nationserver6Yes (adminOnly but explicitly not hubOnly)
!bets3Yes
!dashboard3Yes (posts a live navigable dashboard; replies still forced public per ! rule)
!gov14Yes
!help1Yes

/nation, act on and look up a nation

Permission: everyone (not adminOnly, not hubOnly). Every subcommand but info/activity checks the invoker's linked Minecraft account inline and prompts to link if absent. invite, kick, create, leave, and disband call the API directly and work even while offline; everything else bridges through a real in-game command execution and needs the linked player online.

SubcommandArgumentsPermissionDescription
infoname: string (autocomplete), optionaleveryoneShow a nation's status (yours if omitted)
activitynoneeveryone; members onlyYour nation's recent activity log
inviteplayer: word, requiredlink required; works offlineInvite a player
kickplayer: word, requiredlink required; works offlineRemove a member
promoteplayer: word, requiredlink required; onlinePromote a member one rank
demoteplayer: word, requiredlink required; onlineDemote a member one rank
acceptnation: string (autocomplete), optionallink required; onlineAccept a pending nation invite
declinenation: string (autocomplete), optionallink required; onlineDecline a pending nation invite
invitesnonelink required; onlineList your pending invites
createname: string, requiredlink required; works offlineFound a new nation
leavenonelink required; works offlineLeave your current nation
applynation: string (autocomplete), requiredlink required; onlineApply to join a nation
joinnation: string (autocomplete), requiredlink required; onlineInstantly join an open-policy nation
msgmessage: string, requiredlink required; onlineMessage your nation's private chat
renamename: word, requiredlink required; onlineRename your nation
transferplayer: word, requiredlink required; onlineHand leadership to another member
abdicatenonelink required; onlineStep down as leader
disbandconfirm: bool, required (must be true)link required; works offline; leader onlyDisband your nation (irreversible)
claimnonelink required; onlineClaim the chunk you're standing in
unclaimnonelink required; onlineUnclaim the chunk you're standing in

Examples

/nation info name:Ironhold
/nation invite player:Steve
/nation accept nation:Ironhold
!nation info Ironhold
!nation invite Steve

/nation-settings, configure your nation's settings, home, and applicants

Permission: everyone; every subcommand bridges to a real in-game command, so every one needs a linked account and the player online. Split from /nation purely because of Discord's 25-subcommand cap.

SubcommandArgumentsPermissionDescription
tagtag: word, requiredlink + onlineSet your nation's tag
motdtext: string, requiredlink + onlineSet your nation's members-only MOTD
descriptiontext: string, requiredlink + onlineSet your nation's public description
colorhex: word, requiredlink + onlineSet your nation's color
joinpolicypolicy: choice (open/application/invite_only), requiredlink + onlineSet who can join
allybuildtoggle: choice (on/off), requiredlink + onlineToggle allied build access to your claims
home-setnonelink + onlineSet your nation's home to your position
home-gononelink + onlineTeleport to your nation's home
home-clearnonelink + online; leader onlyClear your nation's home
applicantsnonelink + onlineList pending applications
acceptplayer: word, requiredlink + onlineAccept an applicant
declineplayer: word, requiredlink + onlineReject an applicant

/nations, browse, rank and compare every nation

Permission: everyone, fully public and read-only; every subcommand reads the Warring Nations API directly, no account link or online player needed at all.

SubcommandArgumentsPermissionDescription
listnoneeveryoneList every nation with member/claim counts (capped at 50)
rosternation: string (autocomplete), optionaleveryoneList a nation's members
villagesnation: string (autocomplete), optionaleveryoneList a nation's (or every) villages
leaderboardmetric: choice (claims/members), optional; chart: bool, optional; nation: string (autocomplete), optionaleveryoneTop-15 nations, or one nation's own standing
comparenation1, nation2: string (autocomplete), both requiredeveryoneDiplomatic status between two nations
historynation: string (autocomplete), required; chart: bool, optionaleveryoneA nation's past wars
graphnation: string (autocomplete), optional; from, to, gap: string, optionaleveryoneAnimated growth-over-time GIF
chunkx, z: integer, required; dimension: string, optionaleveryoneWho owns a chunk

/diplomacy, manage your nation's alliances and enemies

Permission: everyone; every subcommand bridges in-game (link + online required).

SubcommandArgumentsPermissionDescription
relationsnonelink + onlineYour nation's allies and enemies
requestnation: string (autocomplete), requiredlink + onlineSend an alliance request
acceptnation: string (autocomplete), requiredlink + onlineAccept an alliance request
declinenation: string (autocomplete), requiredlink + onlineDecline an alliance request
revokenation: string (autocomplete), requiredlink + onlineBreak an existing alliance
requestsnonelink + onlineList incoming alliance requests
enemynation: string (autocomplete), requiredlink + onlineDeclare a nation an enemy (flag, not war)
neutralnation: string (autocomplete), requiredlink + onlineReset relation to neutral

/war, declaring, tracking, rallying, and (staff) resolving wars

Permission: the parent is not adminOnly, a public namespace. approve/deny are the one exception: each has its own inline admin check (still visible to everyone in Discord's picker, but refused at runtime for non-staff). See war presets for the mechanics these commands act on.

SubcommandArgumentsPermissionDescription
listnoneeveryone; no link neededNations currently at war
declarenation: string (autocomplete), requiredlink + onlineDeclare war on a nation
statusnonelink + onlineYour nation's active wars
activenonelink + onlineServer-wide active-war board
historynonelink + onlineServer-wide recent concluded wars
statsplayer: word, optionaleveryone; no online requirementA player's lifetime war record
propose-peacenation: string (autocomplete), requiredlink + onlinePropose peace in an active war
accept-peacenonelink + onlineAccept a pending peace proposal
decline-peacenonelink + onlineDecline a pending peace proposal
rallymessage: string, optionallink + online; nation leader/co-leader onlyPost a rally call to the war channel
approveattacker: string (autocomplete), requiredinline admin check (staff only)Approve a pending war declaration
denyattacker: string (autocomplete), requiredinline admin check (staff only)Deny a pending war declaration

Examples

/war declare nation:Ashenreach
/war status
/war propose-peace nation:Ashenreach
!war declare Ashenreach
!war stats Steve

/account, your Discord to Minecraft identity

Permission: everyone. link/unlink are only registered when account linking is enabled server-side; whoami/whois always register (read-only). None uses a dispatcher-level requireLink flag, each checks the invoker's link status inline itself so /account link keeps working for someone with no link yet.

SubcommandArgumentsPermissionDescription
linknoneeveryone; conditional on link being enabledHow to link your Minecraft account
unlinknoneeveryone; conditional on link being enabled; must already be linkedUnlink Discord from Minecraft
whoaminoneeveryone; must be linkedYour own linked player + nation status
whoisplayer: word, requiredeveryoneLook up a player's nation + link status

/server, live server status

Permission: everyone, fully public.

SubcommandArgumentsPermissionDescription
onlinenoneeveryoneList players currently online (vanish-aware)
statusnoneeveryonePlayer count and uptime
pingnoneeveryoneDiscord gateway + game server responsiveness

/help, command reference / man page

Permission: everyone. Backed by two non-command interaction handlers (not directly invocable): a category-select handler and a Prev/Next pagination button handler for command lists too long for one page.

SubcommandArgumentsPermissionDescription
(bare)command: word, optional; subcommand: word, optionaleveryonePaginated category browser, or detailed usage for one command/subcommand

/bets, pari-mutuel betting on active wars

Permission: everyone (no adminOnly, no hubOnly).

SubcommandArgumentsPermissionDescription
activenoneeveryoneActive wars with bets, pot and odds per side
placebacked, opponent: string (autocomplete), required; amount: integer, requiredmust be linkedPlace a bet (works offline)
minecount: integer, optional (default 10, max 25)must be linkedYour own recent settled bets

/dashboard, live navigable dashboards

Permission: everyone; the top-level command is built with publicReply(true) - replies here post visibly to the channel, not ephemerally, because these are meant as shared multi-user surfaces.

SubcommandArgumentsPermissionDescription
nationname: string (autocomplete), requiredeveryoneLive nation dashboard (overview/wars/members/diplomacy/history tabs)
warnation1, nation2: string (autocomplete), both requiredeveryoneLive dashboard for the active war between two nations
searchnation: string (autocomplete), required; query: string, requiredeveryoneSearch a nation's activity log (redacted, since public)

The dashboards' interactive buttons/modals gate independently of the slash command itself. Navigation and tab selects need no permission. Propose peace/terms and Declare war need a linked account and the DECLARE_WAR nation permission for one of the warring nations (Declare war works offline). Propose alliance / Create bloc / Invite to bloc need a linked, online account with MANAGE_DIPLOMACY. Adjust treasury is Discord staff only (invokerIsAdmin(), re-checked at modal submit, logged to the op-audit-log channel) - across /bets, /dashboard, and /gov combined, this is the only Discord-staff gate; everything else in these three namespaces is gated on Minecraft-side account linkage and delegable in-game nation permissions. Appoint role needs MANAGE_ROLES, online; Appoint governor needs MANAGE_SETTINGS, online.

/gov, nation government entities, roles, and proposals

Permission: everyone (deliberately not adminOnly, since that would also force hubOnly and break usage on a nation's own server). Mutating actions gate on the same delegable in-game MANAGE_GOVERNMENT_PERMISSION nation permission.

SubcommandArgumentsPermissionDescription
entityid: word (UUID), requiredeveryone (read)One entity's kind, owner nation, parent
entitiesnation: string (autocomplete), requiredeveryone (read)A nation's government entities
membersid: word (UUID), requiredeveryone (read)An entity's members and roles
childrenid: word (UUID), requiredeveryone (read)An entity's child entities
statusid: word (UUID), required; policy: word, optionaleveryone (read)A proposal's status/outcome/live tally
create-entitynation: string (autocomplete), required; kind: word, required; name: string, required; parent: word (UUID), optionallink + can manage govCreate a new government entity
remove-entityid: word (UUID), requiredlink + can manage govRemove an entity and its children
grantid: word (UUID), required; role: word, required; player: user, optional; nation: string (autocomplete), optional (one of the two required)link + can manage govAppoint a player/nation to a role
revokesame shape as grantlink + can manage govRemove a player/nation from a role
openid: word (UUID), required; kind: word, required; deadline-minutes: integer, required (positive)must be linked only, membership enforced by the APIOpen a new proposal
voteid: word (UUID), required; choice: word, requiredmust be linked onlyCast/change your vote
resolveid: word (UUID), required; outcome: string, requiredlink + can manage govManually resolve a proposal
cancelid: word (UUID), requiredlink + can manage govCancel an open proposal with no outcome
procedureid: word (UUID), required; hook: word, requiredlink + can manage govRun a proposal's procedure-script hook

Examples

/gov entities nation:Ironhold
/gov create-entity nation:Ironhold kind:council name:High Council
/gov grant id:4f2e8b91-6a3d-4c7e-9b1a-2d5f8e0c1a7b role:Councilor player:Steve
/gov vote id:4f2e8b91-6a3d-4c7e-9b1a-2d5f8e0c1a7b choice:yes
Staff-only namespaces belowThe remaining six namespaces are all adminOnly + hubOnly (Discord staff, hub guild only unless noted otherwise), aimed at server admins and modpack developers running the bridge, not at players.

/whitelist, server access control

Permission: adminOnly + hubOnly (explicit) at the top level, staff-only, hub guild only.

SubcommandArgumentsPermissionDescription
listnoneadminOnly + hubOnlyList whitelisted players
addplayer: word, requiredadminOnly + hubOnlyAdd a player
removeplayer: word, requiredadminOnly + hubOnlyRemove a player
onnoneadminOnly + hubOnlyTurn the whitelist on
offnoneadminOnly + hubOnlyTurn the whitelist off
reloadnoneadminOnly + hubOnlyReload the whitelist from disk

/staff, staff-only intel and operations

Permission: adminOnly + hubOnly (explicit) at the top level. Dashboard/bridged subcommands additionally require the staff member be online and actually op'd in-game - Discord's adminOnly only controls Discord-side visibility, the in-game bridge re-checks separately.

SubcommandArgumentsPermissionDescription
dashboardnoneadminOnly + hubOnlyLive admin dashboard: pending approvals with approve/deny buttons
statsnoneadminOnly + hubOnly; must be linkedServer-wide nation/war/claim summary + chart
playerplayer: word, requiredadminOnly + hubOnly; bridged, onlinePlayer's nation membership + last-seen
inactivedays: integer, optional (default 30)adminOnly + hubOnly; bridged, onlineNations inactive N+ days
claimsnation: string (autocomplete), requiredadminOnly + hubOnlyA nation's claimed chunks (coordinates withheld on the public ! surface)
broadcastmessage: string, requiredadminOnly + hubOnlyServer-wide message to all players
resyncnoneadminOnly + hubOnlyForce an immediate Discord role sync
shutdownconfirm: bool, required; delay: integer, optional (default 10, max 300)adminOnly + hubOnlyGracefully stop the server after a countdown
routingnation: string (autocomplete), requiredadminOnly + hubOnly; conditional on per-nation channels/servers being enabledShow a nation's full channel-routing setup

/config, view and change wndiscord's settings live

Permission: adminOnly + hubOnly (explicit) at the top level, every subcommand inherits this, none has an additional inline check.

SubcommandArgumentsPermissionDescription
listcategory: string (autocomplete), optionaladminOnly + hubOnlyList every live-settable key, grouped by category
getkey: string (autocomplete), requiredadminOnly + hubOnlyShow one setting's value, default, type, allowed range
setkey: string (autocomplete), required; value: string, requiredadminOnly + hubOnlyChange a setting and write it to disk; logs the change with the invoker's Discord ID
reloadnoneadminOnly + hubOnlyRe-apply channel mappings and re-publish slash commands

/setup, guided walkthrough for configuring the bridge

Permission: adminOnly + hubOnly (explicit).

SubcommandArgumentsPermissionDescription
guidenoneadminOnly + hubOnlyStep-by-step setup status and what to fix next
ignore-addchannel: word, requiredadminOnly + hubOnlyBlock ! text commands in a channel
ignore-removechannel: word, requiredadminOnly + hubOnlyUn-block a channel
ignore-listnoneadminOnly + hubOnlyList ignored channels
restrict-addchannel: word, requiredadminOnly + hubOnlyAllow-list a channel for ! commands
restrict-removechannel: word, requiredadminOnly + hubOnlyRemove a channel from the allow-list
restrict-listnoneadminOnly + hubOnlyList restricted-to channels

/debug, diagnostic snapshots of the bridge, mods and server

Permission: adminOnly + hubOnly + ownerDiagnostic bypass (explicit) - the mod author's own Discord ID can run these even without staff permissions, defensible because every one of the 11 subcommands is strictly read-only.

SubcommandArgumentsPermissionDescription
overviewnoneadminOnly + hubOnly, owner bypassServer + bridge health at a glance
jvmnoneadminOnly + hubOnly, owner bypassJVM heap/GC/thread internals
worldnoneadminOnly + hubOnly, owner bypassPer-dimension chunk/entity counts, player latency
nationsnoneadminOnly + hubOnly, owner bypassWarring Nations data health
modsnoneadminOnly + hubOnly, owner bypassVersion/load status of WN-family mods
bridgenoneadminOnly + hubOnly, owner bypassDiscord-side status: gateway, channels, commands
nationserversnoneadminOnly + hubOnly, owner bypassPer-nation-server feature health
queuesnoneadminOnly + hubOnly, owner bypassQueue depths across subsystems
confignoneadminOnly + hubOnly, owner bypassEffective config health (never leaks secret values)
logsnoneadminOnly + hubOnly, owner bypassWarning/error counts + recent log entries (redacted when public)
crashlogscount: integer, optional (default 1, capped)adminOnly + hubOnly, owner bypassDMs the invoker the N most recent crash logs

/nationserver, manage this nation's own linked Discord server

Registered only when per-nation-servers is enabled server-side. Permission: adminOnly with an explicit hubOnly(false) - the one command that opts out of the adminOnly-to-hubOnly default, because its whole purpose is running inside a nation's own server, where "admin" means that nation's in-game leader/co-leader, not Discord staff. Every subcommand additionally re-checks at runtime that the invoking guild is actually a linked nation server; otherwise it no-ops with an error.

SubcommandArgumentsPermissionDescription
infononenation leader/co-leader; must be a linked nation guildThis server's link status and home channel
channelchannel: word, requirednation leader/co-leader; linked guildMove the deep feed to a different channel
stickernonenation leader/co-leader; linked guildUpload the nation's flag as this server's sticker
emojinonenation leader/co-leader; linked guildUpload the nation's flag as this server's emoji
unlinknonenation leader/co-leader; linked guildUnlink this nation from this Discord server
rolesyncdirection: word, required (off/push/pull/both)nation leader/co-leader; linked guild; pull/both further requires Manage Roles in-gameSet per-rank Discord role sync direction

In-game /discord commands

A completely separate command surface: a Minecraft command tree rooted at /discord, registered in-game (not through Discord at all). Three subcommands (reload, debug, config) are gated through this mod's own permission-node catalogue: nodes wndiscord.reload, wndiscord.debug, wndiscord.config, each defaulting to vanilla op level 2 with no permission plugin installed. A server running a permission plugin (LuckPerms, etc.) via NeoForge's permission API can grant or restrict each node independently, e.g. delegating /discord debug to a helper without also granting /discord config.

Full pathArgumentsPermissionDescription
/discordnoneany player, no checkSame as /discord status
/discord linknoneany player, no checkStarts the OAuth link flow for the invoking player; fails if disabled or already linked
/discord unlinknoneany player, no checkUnlinks the invoking player's account; fails if not linked
/discord statusnoneany player, no checkWhether the invoking player is linked to Discord
/discord reloadnonewndiscord.reload (op 2 default)Reloads config from disk
/discord debugnonewndiscord.debug (op 2 default)Same as /discord debug overview
/discord debug overviewnonewndiscord.debug (inherited)Chat diagnostic summary
/discord debug jvmnonewndiscord.debug (inherited)JVM heap/thread/GC diagnostics
/discord debug worldnonewndiscord.debug (inherited)Per-dimension chunk/entity/player counts
/discord debug bridgenonewndiscord.debug (inherited)Bridge health: gateway, channels, dispatch queue
/discord debug nationsnonewndiscord.debug (inherited)Warring Nations data health
/discord debug nationserversnonewndiscord.debug (inherited)Per-nation-server feature health
/discord debug filtersnonewndiscord.debug (inherited)Chat filter throughput stats
/discord config listnonewndiscord.config (op 2 default)Lists every live-config key/value
/discord config list <category>category: word, optionalwndiscord.config (inherited)Same, filtered to one category
/discord config get <key>key: word, requiredwndiscord.config (inherited)Shows one key's detail
/discord config set <key> <value>key: word, required; value: greedy string, requiredwndiscord.config (inherited)Sets a key, logs the change
/discord config reloadnonewndiscord.config (inherited, not wndiscord.reload)Reloads config from disk
/discord nationserver linknoneany player at the node level; handler requires nation leader/co-leaderStarts per-nation Discord server linking
/discord nationserver statusnoneany player, no checkWhether the player's nation has a linked server
/discord nationserver unlinknoneany player at the node level; handler requires leader/co-leaderUnlinks the per-nation Discord server

list, get, set under config, and nationserver's three children, carry no individual permission requirement of their own - they inherit the parent literal's permission predicate (for config) or have none at all beyond the in-handler leader/co-leader check (for nationserver).

Command counts

Verified against source.

SurfaceTop-level commandsSubcommands / leaf commands
! text commandsSame registry as /, 17 namespaces~130 subcommands (fewer inside a nation's own linked server, where hubOnly ones are unreachable)
/ slash commands17: nation, nation-settings, nations, diplomacy, war, account, server, whitelist, staff, help, config, setup, debug, nationserver, bets, dashboard, gov~130
In-game /discord1 root21 leaf/branch commands