Configuration
On this page(7)
SnProxyUtility ships with the following YAML files in plugins/snproxyutility/. config.yml and messages.yml are written on the first boot. The file of every other module is written the first time that module is enabled.
| File | Mode | Purpose |
|---|---|---|
config.yml | managed | Module switches, command aliases, update-configs, debug, api-events. |
messages.yml | managed | Every message the plugin sends and the state words. |
restart.yml | managed | Cron schedules, warnings, timezone. |
motd.yml | managed | MOTD lines, player counts, hover, version text, countdowns. |
queue.yml | managed | Global queue behavior. |
queues.yml | seedOnly | Your queued servers and priority tiers. |
blockcommands.yml | seedOnly | Your command blocker groups. |
Managed files get new keys merged on boot and on /snproxy reload while update-configs is true. Your values are kept. A merge that adds keys rewrites the file without its comments and saves the replaced text beside it as <file>.bak. SeedOnly files are written once and never merged again.
config.yml
# ============================================================
# SnProxyUtility - main configuration
# Managed by SnProxyUtility: keys added by a plugin update are merged
# into this file on boot and on /snproxy reload; your values are kept.
# Set update-configs: false to freeze every managed file except this one
# (config.yml is always merged).
#
# Each module has its own file:
# restart.yml - scheduled proxy restarts
# motd.yml - server list MOTD
# blockcommands.yml - command blocker groups
# queue.yml - global queue behaviour
# queues.yml - your queued servers and priority tiers
# messages.yml - every message the plugin sends
# ============================================================
# Merge new keys from plugin updates into the managed yml files.
update-configs: true
# Extra console logging (queue decisions, module reloads). Keep false in production.
debug: false
# ------------------------------------------------------------
# Public developer API.
# ------------------------------------------------------------
# Public developer API events (QueueJoinEvent, QueueLeaveEvent). When false,
# no API event is dispatched (zero cost) and a cancellable event can never
# block a queue join. The query API stays available either way.
api-events:
enabled: true
# ------------------------------------------------------------
# Modules - turn a whole feature on or off. A disabled module
# registers no listener, no command and no task.
# Changing a switch needs /snproxy reload or a proxy restart.
# ------------------------------------------------------------
modules:
# Cron-scheduled proxy restarts with countdown warnings (restart.yml).
restart: true
# Server list MOTD, player counts, hover and countdowns (motd.yml).
motd: true
# Per-group command whitelist that also hides tab completion (blockcommands.yml).
command-blocker: false
# Lane-based server queue (queue.yml + queues.yml).
queue: true
# ------------------------------------------------------------
# Commands - extra names for each command. The list replaces
# the shipped one and an empty list removes every alias.
# Changing an alias needs a proxy restart.
# ------------------------------------------------------------
commands:
admin:
# Aliases of /snproxy.
aliases: [spu]
queue:
# Aliases of /queue.
aliases: [joinqueue]
leave-queue:
# Aliases of /leavequeue.
aliases: [lq]messages.yml
# ============================================================
# SnProxyUtility - messages
# Managed by SnProxyUtility: keys added by a plugin update are merged
# into this file on boot and on /snproxy reload; your values are kept.
# Set update-configs: false in config.yml to freeze this file instead.
#
# Every line accepts & codes, &#RRGGBB and MiniMessage tags.
# {name} tokens are filled by the plugin; keep them in your text.
# A single line is sent with the prefix, unless it starts with [noprefix].
# A list sends each line as written, without the prefix.
# An empty string "" sends nothing.
# ============================================================
# Prepended to every single-line chat message.
prefix: "₢f2&lSnProxy &8» &7"
# ------------------------------------------------------------
# General - shared by every command.
# ------------------------------------------------------------
general:
# Sender lacks the permission of the command.
no-permission: "&cYou do not have permission to do that."
# A player-only command was run from the console.
player-only: "&cOnly players can use this command."
# {value} is the text the sender typed.
unknown-subcommand: "&cUnknown subcommand: &e{value}&c. Use &e/snproxy help&c."
# {usage} is the command syntax.
usage: "&cUsage: &e{usage}"
# /snproxy reload finished.
reload-done: "&aConfiguration reloaded."
# {module} is the module id from modules.<id> in config.yml.
module-disabled: "&cThe &e{module} &cmodule is disabled in config.yml."
# {server} is the server name the sender typed.
server-not-found: "&cNo server named &e{server}&c exists."
# ------------------------------------------------------------
# Help - lines of /snproxy help; each is shown only to senders allowed to run it.
# ------------------------------------------------------------
help:
# First line of the help.
header: "[noprefix]&8&m----------&r ₢f2&lSnProxy &8&m----------"
# Last line of the help.
footer: "[noprefix]&8&m----------------------------------"
# /snproxy reload
admin-reload: "[noprefix]₢f2/snproxy reload &7Reload every config file and module."
# /snproxy restart next
admin-restart-next: "[noprefix]₢f2/snproxy restart next &7Show when the next restart happens."
# /snproxy restart now
admin-restart-now: "[noprefix]₢f2/snproxy restart now &7Start the restart countdown now."
# /snproxy queue pause <server>
admin-queue-pause: "[noprefix]₢f2/snproxy queue pause <server> &7Stop sending players from a queue."
# /snproxy queue resume <server>
admin-queue-resume: "[noprefix]₢f2/snproxy queue resume <server> &7Resume sending players from a queue."
# /snproxy queue info <server>
admin-queue-info: "[noprefix]₢f2/snproxy queue info <server> &7Show the status, lanes and size of a queue."
# /queue <server>
queue-join: "[noprefix]₢f2/queue <server> &7Join the queue of a server."
# /leavequeue
queue-leave: "[noprefix]₢f2/leavequeue &7Leave your current queue."
# ------------------------------------------------------------
# Status - state words spliced into {status} placeholders.
# ------------------------------------------------------------
status:
# The server accepts players.
open: "&aOpen"
# The server only lets whitelisted players in.
whitelist: "&eWhitelist"
# The server has no free slot.
full: "&cFull"
# The server does not answer pings.
offline: "&7Offline"
# An admin stopped the queue with /snproxy queue pause.
paused: "&6Paused"
# ------------------------------------------------------------
# Queue - /queue, /leavequeue and the queue engine.
# {server} is the display-name of the queued server (queues.yml).
# {lane} and {position} locate a player: position 1 of each lane
# leaves with the next batch. {total} counts the whole queue.
# ------------------------------------------------------------
queue:
# The player joined a queue.
joined: "&7You joined the queue for {server}&7: lane &f{lane}&7, position &f{position}&7, &f{total} &7waiting."
# The player left their previous queue to join this one.
switched: "&7You switched to the queue for {server}&7: lane &f{lane}&7, position &f{position}&7, &f{total} &7waiting."
# /leavequeue took the player out of a queue.
left: "&7You left the queue for {server}&7."
# /leavequeue while not in any queue.
not-in-queue: "&cYou are not in any queue."
# /queue for the queue the player already waits in.
already-in-queue: "&cYou are already in the queue for {server}&c."
# /queue for a server without a queue. {server} is the name the player typed.
not-queued-server: "&cThe server &e{server} &chas no queue."
# A player with the bypass permission skips the queue of an open server.
bypassed: "&aSkipping the queue, sending you to {server}&a."
# /queue for the server the player is already on.
already-connected: "&cYou are already connected to {server}&c."
# The player's turn came: the connection to the server starts.
sending: "&aSending you to {server}&a..."
# The player failed to join max-attempts times in a row and now waits at the end of the queue.
moved-to-back: "&eYou could not join {server} &eafter several attempts and were moved to the back of the queue."
# Shown every second while waiting. {status} is a word of the status section.
action-bar: "₢f2{server} &8| &7Lane &f{lane} &8| &7Position &f{position} &8| &f{total} &7waiting &8| {status}"
# Sent to every queued player when an admin pauses their queue.
paused-notice: "&6The queue for {server} &6was paused by an admin."
# Sent to every queued player when an admin resumes their queue.
resumed-notice: "&aThe queue for {server} &ais moving again."
# Sent to every queued player when their server is removed from queues.yml by a reload.
removed: "&eThe queue for {server} &ewas closed; you are no longer queued."
# /queue typed without exactly one server name. {command} is the label the player typed.
usage: "&cUsage: &e/{command} <server>"
# A player kicked by a restarting or lost queued server was put back in its queue, ahead of normal entries.
auto-reconnect: "&eYou left {server} &ebecause it went down; you were queued to rejoin it: lane &f{lane}&e, position &f{position}&e, &f{total} &ewaiting."
# ------------------------------------------------------------
# Blocker - command blocker groups (blockcommands.yml).
# ------------------------------------------------------------
blocker:
# A player ran a command their group may not use. {command} is the command they typed.
blocked: "&cYou cannot use &e/{command}&c."
# ------------------------------------------------------------
# Restart - scheduled and manual proxy restarts (restart.yml).
# ------------------------------------------------------------
restart:
# Broadcast to every player at each warning second. {time} is the time left.
warning: "&eThe proxy restarts in &6{time}&e."
# Disconnect screen shown to every player when the proxy shuts down; one line per list entry, no prefix.
kick:
- "₢f2&lSnProxy"
- "&7The proxy is restarting. Please reconnect in a few minutes."
# /snproxy restart next. {date} is the restart date, {remaining} the time left.
next: "&7Next restart: &f{date} &8(&7in {remaining}&8)"
# /snproxy restart next while no restart is planned.
none-scheduled: "&cNo restart is scheduled."
# /snproxy restart now. {time} is the length of the countdown that just started.
started: "&eRestart countdown started. The proxy restarts in &6{time}&e."
# Units of the {time} and {remaining} placeholders. {value} is the amount; the singular form
# is used for exactly 1.
time:
day: "{value} day"
days: "{value} days"
hour: "{value} hour"
hours: "{value} hours"
minute: "{value} minute"
minutes: "{value} minutes"
second: "{value} second"
seconds: "{value} seconds"
# Text placed between two units, for example "1 minute 30 seconds".
separator: " "
# ------------------------------------------------------------
# Admin - /snproxy queue subcommands and usage hints.
# {server} is the display-name of the queued server (queues.yml).
# /snproxy restart reuses the restart section above.
# ------------------------------------------------------------
admin:
# /snproxy queue pause <server> stopped the queue.
paused: "&7The queue for {server} &7is now &6paused&7."
# /snproxy queue resume <server> restarted the queue.
resumed: "&7The queue for {server} &7is now &aresumed&7."
# /snproxy queue info <server>. One line per entry, sent without the prefix.
# {status} is a word of the status section, {lanes} the lane count, {size} the players waiting.
info:
- "&8&m--------&r ₢f2&lQueue &8- &r{server} &8&m--------"
- "&7Status: {status}"
- "&7Lanes: &f{lanes}"
- "&7Waiting: &f{size}"
# Syntax shown by general.usage when /snproxy restart gets no action.
usage-restart: "/snproxy restart <next|now>"
# Syntax shown by general.usage when /snproxy queue gets no action or no server.
usage-queue: "/snproxy queue <pause|resume|info> <server>"restart.yml
# ============================================================
# SnProxyUtility - restart module
# Managed by SnProxyUtility: keys added by a plugin update are merged
# into this file on boot and on /snproxy reload; your values are kept.
# Set update-configs: false in config.yml to freeze this file instead.
#
# The module is switched by modules.restart in config.yml. The proxy
# only shuts down: your host or start script must start it again.
# ============================================================
# Restart schedules as cron expressions: minute hour day-of-month month day-of-week.
# minute 0-59, hour 0-23, day-of-month 1-31, month 1-12, day-of-week 0-7 (0 and 7 are Sunday)
# * any value , list (1,3,5) - range (1-5) / step (*/5 is every 5 units)
# Examples:
# "0 3 * * *" every day at 03:00
# "0 3 * * 1" every Monday at 03:00
# "0 3,15 * * *" every day at 03:00 and 15:00
# "0 */6 * * *" every 6 hours
# "30 4 * * 0,6" Saturdays and Sundays at 04:30
# With several entries the nearest upcoming one wins. An invalid entry is skipped with a
# warning in the console. An empty list disables automatic restarts.
schedules:
- "0 3 * * *"
# Seconds before the restart at which every player is warned; one broadcast per value.
# A restart planned closer than the largest value starts its countdown at the remaining time.
warnings:
- 300
- 60
- 30
- 10
- 5
- 3
- 2
- 1
# Time zone the cron expressions are evaluated in, for example America/Argentina/Buenos_Aires.
# Blank uses the time zone of the machine the proxy runs on.
timezone: ""
# Java date pattern of the {date} placeholder in the restart messages. VV prints the zone id.
date-format: "yyyy-MM-dd HH:mm (VV)"
# /snproxy restart now starts its countdown at the largest warning not above this many seconds,
# or restarts at once when no warning fits. 0 always restarts at once.
now-max-seconds: 10motd.yml
# ============================================================
# SnProxyUtility - server list MOTD (module: motd)
# Managed by SnProxyUtility: keys added by a plugin update are merged
# into this file on boot and on /snproxy reload; your values are kept.
# Set update-configs: false in config.yml to freeze this file instead.
#
# Text accepts & codes, &#RRGGBB hex and MiniMessage tags, mixed freely.
# Examples: ₢f2&lBold hex, <gradient:#8354f2:#54c8f2>text</gradient>, <red>
#
# Placeholders for the MOTD lines, the hover lines and the version name:
# %online% online count after the players.online mode
# %max% max count after the players.max mode
# %real_online% actual online count, ignores every mode
# %countdown_<name>% the countdown of that name from the countdowns section
# ============================================================
# ------------------------------------------------------------
# MOTD - the two lines shown in the server list.
# ------------------------------------------------------------
motd:
# false leaves the MOTD of the proxy untouched.
enabled: true
# First line of the MOTD.
line1: "₢f2&lMy Network"
# Second line of the MOTD.
line2: "&7%online% players online"
# ------------------------------------------------------------
# Players - the counts and the tooltip of the player count.
# ------------------------------------------------------------
players:
online:
# REAL shows the actual count, STATIC always shows value, OFFSET shows the actual count plus value.
mode: REAL
# The count shown by STATIC, or the number added to the actual count by OFFSET (may be negative).
value: 0
max:
# REAL keeps the max the proxy reports, STATIC always shows value.
mode: REAL
# The max shown by STATIC.
value: 500
hover:
# false leaves the player sample of the proxy untouched.
enabled: true
# One entry per line of the tooltip; [] shows an empty tooltip. Hex and gradient colors need a 1.16+ client.
lines:
- "₢f2&lMy Network"
- "&7Players online: &f%online%&7/&f%max%"
# ------------------------------------------------------------
# Version - the version text shown in the server list.
# ------------------------------------------------------------
version:
# true replaces the version name and protocol reported to the client.
enabled: false
# The version text. Hex and gradient colors need a 1.16+ client.
name: "&cMaintenance"
# The protocol number reported. -1 shows name where the player count normally is, marked as
# incompatible, while every client can still join.
protocol: -1
# ------------------------------------------------------------
# Countdown defaults - inherited by every countdown below that does not set its own.
# ------------------------------------------------------------
countdown-defaults:
# IANA timezone id the date of a countdown is read in.
timezone: "UTC"
# %value% is replaced with the remaining amount.
formats:
# Shown while 2 or more whole days remain.
days: "%value% days"
# Shown while exactly 1 whole day remains.
day-singular: "1 day"
# Shown while 2 or more whole hours remain (less than a day).
hours: "%value% hours"
# Shown while exactly 1 whole hour remains.
hour-singular: "1 hour"
# Shown while 2 or more minutes remain (less than an hour, rounded up).
minutes: "%value% minutes"
# Shown during the final minute.
minute-singular: "1 minute"
# Shown once the date has passed.
expired: "Available now"
# ------------------------------------------------------------
# Countdowns - each entry becomes the placeholder %countdown_<name>%.
# The unit follows the remaining time: days, then hours, then minutes, then expired.
# Every entry needs a date; timezone and each format fall back to countdown-defaults.
# To add one, remove the leading # of the example lines and edit them:
# ------------------------------------------------------------
countdowns:
# opening:
# # Target date, written yyyy-MM-dd HH:mm:ss and kept in quotes.
# date: "2030-01-01 18:00:00"
# # Overrides countdown-defaults.timezone.
# timezone: "America/Argentina/Buenos_Aires"
# # Overrides any of the countdown-defaults.formats keys.
# formats:
# days: "%value% DAYS"
# expired: "OPEN NOW"queue.yml
# ============================================================
# SnProxyUtility - queue
# Managed by SnProxyUtility: keys added by a plugin update are merged
# into this file on boot and on /snproxy reload; your values are kept.
# Set update-configs: false in config.yml to freeze this file instead.
#
# Global queue behaviour. The queued servers and the priority
# tiers live in queues.yml, where a server can override lanes,
# send-interval-ticks and max-attempts.
# ============================================================
# ------------------------------------------------------------
# Sending - how players leave the queue.
# ------------------------------------------------------------
# Players sent together in each batch; the queue is shown as this many lanes.
lanes: 10
# Ticks between two batches (1 tick = 50 ms, so 5 sends a batch every 250 ms).
send-interval-ticks: 5
# Failed joins in a row before a player is moved to the back of the queue.
max-attempts: 3
# ------------------------------------------------------------
# Server status - when sending waits, with no penalty for anyone.
# ------------------------------------------------------------
# Seconds between status pings of each queued server; no answer within this time counts as offline.
ping-interval-seconds: 3
# Seconds between single-player join attempts while a server is whitelisted.
whitelist-probe-seconds: 2
# A rejection whose reason contains one of these words marks the server as whitelisted (case-insensitive).
whitelist-keywords:
- whitelist
- whitelisted
# A rejection whose reason contains one of these words marks the server as full until the next ping.
full-keywords:
- full
# ------------------------------------------------------------
# Entry points - how players get into a queue.
# ------------------------------------------------------------
# Queue players who connect straight to a queued server (/server, lobby menus) instead of connecting them.
intercept-direct-connect: true
# Re-queues players kicked from a queued server because it restarts or closes, ahead of normal players.
auto-reconnect:
# Turns auto-reconnect on or off.
enabled: true
# A kick whose reason contains one of these words triggers it (case-insensitive).
kick-keywords:
- restart
- restarting
- "server closed"
- "shutting down"
# Also triggers it when the connection to the server drops without a kick reason.
connection-lost: true
# ------------------------------------------------------------
# Feedback - what queued players see.
# ------------------------------------------------------------
# Action bar shown to players while they wait (queue.action-bar in messages.yml).
action-bar:
# Shows each queued player their lane, position and the server status every second.
enabled: truequeues.yml
# ============================================================
# SnProxyUtility - queued servers and priority tiers
# Seeded once: this file is yours and is never merged with plugin
# updates, so entries you delete stay deleted.
# Changes apply on /snproxy reload.
# ============================================================
# ------------------------------------------------------------
# Priorities - each entry is a tier. A player waits ahead of every
# player with a lower weight; equal weights keep join order. A player
# holding several tiers gets the highest weight; no tier = weight 0.
# When permission is left out it is snproxyutility.queue.priority.<tier>.
# ------------------------------------------------------------
priorities:
# Staff members.
staff:
# Permission that grants this tier.
permission: snproxyutility.queue.priority.staff
# Priority weight; higher waits ahead.
weight: 100
# Ranked players.
vip:
# Permission that grants this tier.
permission: snproxyutility.queue.priority.vip
# Priority weight; higher waits ahead.
weight: 10
# ------------------------------------------------------------
# Servers - each entry is a server name from velocity.toml that gets
# a queue. Every key is optional and falls back to queue.yml; a name
# Velocity does not know is skipped with a warning. With no entry,
# no server is queued and no connection is intercepted.
# Remove the leading # of the example to queue "skyblock".
# ------------------------------------------------------------
servers:
# skyblock:
# # Name shown in queue messages and on the action bar (& codes allowed).
# display-name: "₢f2SkyBlock"
# # Players sent per batch and lanes shown; overrides queue.yml.
# lanes: 10
# # Ticks between batches (1 tick = 50 ms); overrides queue.yml.
# send-interval-ticks: 5
# # Failed joins in a row before moving to the back; overrides queue.yml.
# max-attempts: 3blockcommands.yml
# ============================================================
# SnProxyUtility - command blocker groups
# Written once, the first time the command blocker is enabled, and never
# updated by the plugin again: this file is yours, and deleting a shipped
# group keeps it deleted. The "default" group below applies from then on.
# Changes apply with /snproxy reload.
#
# Each group lists the commands its members may run AND see in tab
# completion, proxy and backend commands alike. Anything not listed is
# blocked and hidden. The module is switched on with
# modules.command-blocker: true in config.yml (it ships off).
# ============================================================
#
# HOW A GROUP IS RESOLVED
# bypass: true - the group sees and runs everything (not inherited)
# inherit: <group> - adds every command of that group (one group, not a
# list; the chain is followed and cycles are safe)
# commands: - the group's own commands: one label each, without
# a leading / and without arguments
#
# A player's group is their LuckPerms primary group, matched without regard
# to case. Without LuckPerms every player is in "default". Players with the
# snproxyutility.commandblocker.bypass permission are never filtered.
#
# A namespaced command (plugin:command) is allowed only when that exact
# label is listed: allowing "home" does not allow "essentials:home".
#
# TWO SAFETY NETS, in this order:
# 1. A group with no entry here uses the "default" group's list.
# 2. If "default" is missing or empty, EVERY command is allowed, so a
# proxy that never configured this file is never locked.
#
# An EMPTY list is treated the same as no entry: "commands: []" does NOT
# mean "this group runs nothing", it falls back to "default". To restrict a
# group to almost nothing, list one harmless command.
#
# The plugin's own commands (/snproxy, /queue, /leavequeue and the aliases
# set in config.yml) are always allowed and visible, so a mistake here can
# never lock you out of /snproxy reload.
#
# LIMITATION: Velocity disconnects a player when a proxy plugin denies a
# command the client signed (/msg <player> <message>, /tell, /me... on
# 1.19.3+, any typed command on 1.19.1/1.19.2 with secure chat). Such a
# command is let through instead of kicking. It only happens while the
# player's tab list is stale (after /snproxy reload or a group change, until
# their next server switch or relog) and on 1.19.1/1.19.2. To close the gap,
# also block those commands on the backend.
# ============================================================
groups:
# Every player without a configured group.
default:
commands:
- help
- spawn
- lobby
- hub
- msg
- r
- tpa
- tpaccept
- tpdeny
- queue
- leavequeue
- lq
- joinqueue
# Staff: everything "default" has plus moderation commands.
mod:
inherit: default
commands:
- server
- glist
- kick
- ban
- tempban
- mute
- warn
- vanish
# Sees and runs every command.
admin:
bypass: true