Astral Realms Documentation Help

Configuration

AstralPunishments ships separate config files per module — velocity/ and paper/ each get their own copy, loaded independently on onEnable/loadConfiguration(). They point at the same database and schema, so either module can read punishments the other wrote.

database.properties

Both modules copy and load a standard HikariCP JDBC properties file — see the AstralCore database docs for the field reference. The shipped default in both modules points at the same schema:

jdbcUrl=jdbc:mariadb://localhost:3306/punishments?useSSL=false driverClassName=org.mariadb.jdbc.Driver dataSource.user=testuser dataSource.password=test623 poolName=AstralPunishments

The tables it expects (punishments, ip_history) are defined in velocity/src/main/resources/schema.sql — see Overview → Data model for the shape.

messages.yml (velocity)

Loaded via loadEnum("messages.yml", PunishmentMessages.class) into the velocity PunishmentMessages enum. Every key is a MiniMessage string; %target_name%, %reason%, %source% and %duration% are available wherever the corresponding punishment supplies them (see the command feedback table below).

Key

Used by

target-muted/target-muted-broadcast

/mute — operator feedback / network broadcast.

target-unmuted/target-unmuted-broadcast/target-not-muted

/unmute.

target-warned

/warn — operator feedback only (no broadcast, no disconnect).

target-kicked

Unused by any command path (kept for parity; see note below).

player-kicked/player-kicked-broadcast

/kick — screen shown to the disconnected player / network broadcast.

player-banned

Screen shown to a banned player, both on issue and at the BanListener login gate.

target-banned/target-banned-broadcast

/ban — operator feedback / network broadcast.

target-unbanned/target-unbanned-broadcast/target-not-banned

/unban.

player-ipbanned

Screen shown to an IP-banned player, both on issue and at the BanListener login gate.

target-ipbanned/target-ipbanned-broadcast

/ipban — operator feedback / network broadcast.

target-no-ip

/ipban when neither a live connection nor ip_history has an address for the target.

unexpected-error

Any command whose async pipeline fails (database, messaging).

player-not-online

/kick when the target isn't currently connected to any backend.

messages.yml (paper)

Loaded the same way on the paper side, backing the history GUI and pardon action. These ship in French (the velocity messages.yml above ships in English) — both are per-server, freely re-translatable.

Key

Used by

no-history

/history when the target has no punishment rows at all.

no-permission

Pardon action, when the clicking player lacks the type-specific unban/unmute node.

pardon-success

Pardon action, after a successful pardon.

already-pardoned

Pardon action, if the punishment was pardoned by someone else between opening the menu and clicking confirm.

cannot-pardon

Pardon action, for a KICK/WARN punishment (not a liftable type).

invalid-duration

/history <player> <duration> when the duration filter fails to parse.

error-occurred

Any async failure (database lookup, menu open).

display.yml

Maps each PunishmentType to the ItemStackWrapper (material / name / lore) used as its icon in the history GUI — loaded into PunishmentDisplayConfiguration (Map<PunishmentType, ItemStackWrapper>). The history rows copy-from this icon and append their own per-punishment lore.

icons: BAN: material: "IRON_BARS" name: "<bold><red>Bannissement" IPBAN: material: "ANVIL" name: "<bold><red>Bannissement IP" MUTE: material: "BOOK" name: "<bold><gold>Réduction au silence" KICK: material: "LEATHER_BOOTS" name: "<bold><yellow>Expulsion" WARN: material: "PAPER" name: "<bold><yellow>Avertissement"

Key

Type

Description

icons

Map<PunishmentType, ItemStackWrapper>

One entry required per PunishmentType value (BAN, IPBAN, MUTE, KICK, WARN) — a missing entry resolves to null and the history row's copy-from has nothing to copy.

history.yml, detail.yml, and confirm-pardon.yml under menus/punishments/ (registering the menu ids punishment-history, punishment-detail and punishment-confirm-pardon respectively) are copied out of the jar on first load (copyResource, since the menus/ folder isn't auto-extracted) and loaded by MenuService#load(). See Punishment History GUI for their content and click flow.

Last modified: 25 July 2026