Placeholders
AstralPunishments registers three placeholder namespaces on the paper module — punishment, alt and ip — all ComplexPlaceholders. None is globally registered: an instance only becomes resolvable once the matching record is placed into scope, which happens when MenuService wraps the rows it fetched and opens a staff menu with them. For the placeholder syntax itself (%a_b_c%, chaining, $e(...)) see Placeholders.
The punishment namespace is also used outside the menus: the mute messages (chat-muted/command-muted) render %punishment_reason% and %punishment_remaining%.
punishment_*
Placeholder | Type | Description |
|---|
%punishment_id%
| UUID
| The punishment's uniqueId. |
%punishment_type%
| PunishmentType
| BAN, IPBAN, MUTE, KICK, or WARN.
|
%punishment_icon%
| ItemStackWrapper
| The type's icon from display.yml (display().icons().get(type)). |
%punishment_player%
| MinecraftPlayerPlaceholder
| The target, chainable into any player_*-style sub-key. |
%punishment_operatorId%
| UUID
| The issuing operator's id, or null for console. |
%punishment_operatorName%
| String | The issuing operator's name, or "Console" if null. |
%punishment_reason%
| String | The punishment's reason, or "Aucune" (French for "none") if unset. |
%punishment_createdAt%
| TimePlaceholder
| When the punishment was issued — chain _format for a rendered date/time. |
%punishment_expiresAt%
| TimePlaceholder
| When it expires, or null if isPermanent(). |
%punishment_duration%
| String | "Permanent", or the human-readable span between createdAt and expiresAt (DurationParser.toHumanReadable).
|
%punishment_remaining%
| String | "Permanent", or the human-readable time left before it lapses — for messages shown to the punished player.
|
%punishment_status%
| String | "Révoquée" (pardoned) / "Expirée" (lapsed) / "Active" — French, mirroring the paper messages.yml locale.
|
%punishment_active%
| boolean | The raw active column. |
%punishment_expired%
| boolean | isExpired() — active is true but past expiresAt.
|
%punishment_permanent%
| boolean | isPermanent() — expiresAt is null or -1.
|
%punishment_pardonable%
| boolean | true only when active && !expired and type is BAN, IPBAN, MUTE or WARN — gates the Pardon button in the detail menu. A KICK is never pardonable.
|
%punishment_removedById%
| UUID
| Who pardoned it, or null if still active/never pardoned. |
%punishment_removedByName%
| String | Pardoner's name, or "Inconnu" ("unknown") if null. |
%punishment_removedAt%
| TimePlaceholder
| When it was pardoned, or null if never pardoned. |
%punishment_removedReason%
| String | The pardon reason, or "Aucune" if unset. |
alt_*
One linked account, per row of the alts menu. A bare %alt% resolves to the account's UUID.
Placeholder | Type | Description |
|---|
%alt_id%
| UUID
| The account's id — what the row's [lookup] hub … action takes. |
%alt_player%
| MinecraftPlayerPlaceholder
| The account, chainable into any player_*-style sub-key (head, name, …). |
%alt_name%
| String | Last known name, or "Inconnu" when unknown. |
%alt_lastSeen%
| TimePlaceholder
| When the address was last shared — chain _format for a rendered date. |
%alt_sharedIps%
| int | How many addresses this account shares with the looked-up one. |
%alt_banned%
| boolean | Whether the account is banned right now. |
%alt_muted%
| boolean | Whether it is muted right now. |
%alt_status%
| String | A short summary of the two for inline display ("Banni & Muet", …). |
ip_*
One recorded address, per row of the IP-history menu. A bare %ip% resolves to the address.
Placeholder | Type | Description |
|---|
%ip_address%
| String | The address. |
%ip_name%
| String | The name last seen on it, or "Inconnu". |
%ip_firstSeen%
| TimePlaceholder
| First connection from it — chain _format. |
%ip_lastSeen%
| TimePlaceholder
| Most recent connection from it. |
Where these are consumed
File | Usage |
|---|
menus/punishments/history.yml
| Row icon (copy-from: "%parameter_punishment_icon%"), lore (reason, operatorName, createdAt_format, duration, status), and the click action [open-menu] punishment-detail:punishment=%parameter_punishment%:.... |
menus/punishments/detail.yml
| Full info block; view-requirements gating the Retrait (revocation) block on %parameters_punishment_active% == false and the Pardon button on %parameters_punishment_pardonable% == true. |
menus/punishments/confirm-pardon.yml
| Confirmation summary; [pardon-punishment] %parameters_punishment_id% %parameters_target_uuid% action. |
menus/punishments/lookup.yml
| Hub buttons; %parameters_historyCount%/_altCount%/_ipCount% and [lookup] <section> %parameters_target_uuid%. |
menus/punishments/alts.yml
| Rows from the alts taint, rendered through %parameter_alt_*%; [lookup] hub %parameter_alt_id%. |
menus/punishments/iphistory.yml
| Rows from the ips taint, rendered through %parameter_ip_*%. |
menus/punishments/list.yml
| Rows from the punishments taint; [lookup] hub %parameter_punishment_player_uuid%, plus %parameters_heading%/_subheading%/_icon%/_count%. |
messages.yml (paper)
| chat-muted/command-muted read %punishment_reason% and %punishment_remaining%.
|
See Punishment History GUI for how punishment enters menu scope via the punishments layout taint vs. the parameters_punishment open-parameter, and the [pardon-punishment] action that consumes %punishment_id% directly.
Last modified: 25 September 2026