diff --git a/.dockerignore b/.dockerignore
index cfc9551..19e463e 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -1,3 +1,5 @@
*/logs
+src/librelogin.db
+
src/plugins/luckperms/libs
diff --git a/.gitattributes b/.gitattributes
index 7c32d5f..f9dd441 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1 +1,2 @@
*.jar filter=lfs diff=lfs merge=lfs -text
+src/plugins/librelogin/forbidden-passwords.txt filter=lfs diff=lfs merge=lfs -text
diff --git a/.gitignore b/.gitignore
index cfc9551..93198c2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,7 @@
*/logs
+src/plugins/librelogin/lib
+src/plugins/librelogin/LICENSE.txt
+src/librelogin.db
+
src/plugins/luckperms/libs
diff --git a/Dockerfile b/Dockerfile
index 6f1b08b..3f8967c 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -21,12 +21,26 @@ ENV PROXY_SECRET=change_me
ENV SERVERS=lobby="lobby:25565";survival="survival:25565"
ENV TRY=lobby;survival
+ENV LIBRELOGIN_LIMBOS=limbo
+ENV LIBRELOGIN_LOBBIES=lobby
+ENV LIBRELOGIN_DB_HOST=127.0.0.1
+ENV LIBRELOGIN_DB_PORT=3306
+ENV LIBRELOGIN_DB_NAME=coreprotect_db
+ENV LIBRELOGIN_DB_USERNAME=coreprotect
+ENV LIBRELOGIN_DB_PASSWORD=0000
+
ENV LUCKPERMS_DB_HOST=127.0.0.1
ENV LUCKPERMS_DB_PORT=3306
ENV LUCKPERMS_DB_NAME=luckperms
ENV LUCKPERMS_DB_USERNAME=luckperms
ENV LUCKPERMS_DB_PASSWORD=0000
+ENV SKINSRESTORER_DB_HOST=127.0.0.1
+ENV SKINSRESTORER_DB_PORT=3306
+ENV SKINSRESTORER_DB_NAME=skinsrestorer_db
+ENV SKINSRESTORER_DB_USERNAME=skinsrestorer
+ENV SKINSRESTORER_DB_PASSWORD=0000
+
WORKDIR ${WORKDIR_PATH}/config
EXPOSE 25565/tcp
@@ -34,13 +48,38 @@ EXPOSE 25565/tcp
# TODO: Make awk commands sapn multiple lines
# TODO: Use one call to awk to perform substitutions
CMD \
+ # Add proxy secret
+ sed -i "s/_PROXY_SECRET_/${PROXY_SECRET}/g" forwarding.secret && \
+ # Substitute librelogin database path
+ sed -i "s~../../librelogin.db~../../../..${DATA_PATH}/librelogin.db~g" plugins/librelogin/config.conf && \
+ # Add servers to velocity.toml
+ awk -v servers_str="${SERVERS}" '{ count=split(servers_str,servers_arr,";"); servers_fmt_str = ""; for (i = 1; i <= count; i++) servers_fmt_str = servers_fmt_str servers_arr[i] "\n"; sub(/_SERVERS_/,servers_fmt_str); print }' velocity.toml > velocity.toml.tmp && mv -T -f velocity.toml.tmp velocity.toml && \
+ # Add try servers to velocity.toml
+ awk -v try_str="${TRY}" '{ count=split(try_str,try_arr,";"); try_fmt_str = ""; for (i = 1; i <= count; i++) try_fmt_str = try_fmt_str "\"" try_arr[i] "\"" ",\n "; sub(/_TRY_/,try_fmt_str); print }' velocity.toml > velocity.toml.tmp && mv -T -f velocity.toml.tmp velocity.toml && \
+
+ # Add limbo servers to librelogin config
+ awk -v limbos_str="${LIBRELOGIN_LIMBOS}" '{ count=split(limbos_str,limbos_arr,";"); limbos_fmt_str = ""; for (i = 1; i <= count; i++) limbos_fmt_str = limbos_fmt_str limbos_arr[i] ",\n "; sub(/_LIBRELOGIN_LIMBOS_/,limbos_fmt_str); print }' plugins/librelogin/config.conf > plugins/librelogin/config.conf.tmp && mv -T -f plugins/librelogin/config.conf.tmp plugins/librelogin/config.conf && \
+ # Add lobby servers to librelogin config
+ awk -v lobbies_str="${LIBRELOGIN_LOBBIES}" '{ count=split(lobbies_str,lobbies_arr,";"); lobbies_fmt_str = ""; for (i = 1; i <= count; i++) lobbies_fmt_str = lobbies_fmt_str lobbies_arr[i] ",\n "; sub(/_LIBRELOGIN_LOBBIES_/,lobbies_fmt_str); print }' plugins/librelogin/config.conf > plugins/librelogin/config.conf.tmp && mv -T -f plugins/librelogin/config.conf.tmp plugins/librelogin/config.conf && \
+ # Add database info to librelogin config
+ sed -i "s/_LIBRELOGIN_DB_HOST_/${LIBRELOGIN_DB_HOST}/g" plugins/librelogin/config.conf && \
+ sed -i "s/_LIBRELOGIN_DB_PORT_/${LIBRELOGIN_DB_PORT}/g" plugins/librelogin/config.conf && \
+ sed -i "s/_LIBRELOGIN_DB_NAME_/${LIBRELOGIN_DB_NAME}/g" plugins/librelogin/config.conf && \
+ sed -i "s/_LIBRELOGIN_DB_USERNAME_/${LIBRELOGIN_DB_USERNAME}/g" plugins/librelogin/config.conf && \
+ sed -i "s/_LIBRELOGIN_DB_PASSWORD_/${LIBRELOGIN_DB_PASSWORD}/g" plugins/librelogin/config.conf && \
+
+ # Add database info to luckperms config
sed -i "s/_LUCKPERMS_DB_HOST_/${LUCKPERMS_DB_HOST}/g" plugins/luckperms/config.yml && \
sed -i "s/_LUCKPERMS_DB_PORT_/${LUCKPERMS_DB_PORT}/g" plugins/luckperms/config.yml && \
sed -i "s/_LUCKPERMS_DB_NAME_/${LUCKPERMS_DB_NAME}/g" plugins/luckperms/config.yml && \
sed -i "s/_LUCKPERMS_DB_USERNAME_/${LUCKPERMS_DB_USERNAME}/g" plugins/luckperms/config.yml && \
sed -i "s/_LUCKPERMS_DB_PASSWORD_/${LUCKPERMS_DB_PASSWORD}/g" plugins/luckperms/config.yml && \
- # Add proxy secret
- sed -i "s/_PROXY_SECRET_/${PROXY_SECRET}/g" forwarding.secret && \
- awk -v servers_str="${SERVERS}" '{ count=split(servers_str,servers_arr,";"); servers_fmt_str = ""; for (i = 1; i <= count; i++) servers_fmt_str = servers_fmt_str servers_arr[i] "\n"; sub(/_SERVERS_/,servers_fmt_str); print }' velocity.toml > velocity.toml.tmp && mv -T -f velocity.toml.tmp velocity.toml &&\
- awk -v try_str="${TRY}" '{ count=split(try_str,try_arr,";"); try_fmt_str = ""; for (i = 1; i <= count; i++) try_fmt_str = try_fmt_str "\"" try_arr[i] "\"" ",\n "; sub(/_TRY_/,try_fmt_str); print }' velocity.toml > velocity.toml.tmp && mv -T -f velocity.toml.tmp velocity.toml && \
+
+ # Add database info to skinsrestorer config
+ sed -i "s/_SKINSRESTORER_DB_HOST_/${SKINSRESTORER_DB_HOST}/g" plugins/skinsrestorer/config.yml && \
+ sed -i "s/_SKINSRESTORER_DB_PORT_/${SKINSRESTORER_DB_PORT}/g" plugins/skinsrestorer/config.yml && \
+ sed -i "s/_SKINSRESTORER_DB_NAME_/${SKINSRESTORER_DB_NAME}/g" plugins/skinsrestorer/config.yml && \
+ sed -i "s/_SKINSRESTORER_DB_USERNAME_/${SKINSRESTORER_DB_USERNAME}/g" plugins/skinsrestorer/config.yml && \
+ sed -i "s/_SKINSRESTORER_DB_PASSWORD_/${SKINSRESTORER_DB_PASSWORD}/g" plugins/skinsrestorer/config.yml && \
+
java -Xms${MEMORY} -Xmx${MEMORY} -XX:+UseG1GC -XX:G1HeapRegionSize=4M -XX:+UnlockExperimentalVMOptions -XX:+ParallelRefProcEnabled -XX:+AlwaysPreTouch -XX:MaxInlineLevel=15 -jar *.jar
diff --git a/src/plugins/LibreLogin.jar b/src/plugins/LibreLogin.jar
new file mode 100644
index 0000000..37bf722
--- /dev/null
+++ b/src/plugins/LibreLogin.jar
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3df848d4058e63f37cf9fe997542fd49c84374440d116a34ac4052278aa77e4f
+size 499667
diff --git a/src/plugins/SkinsRestorer.jar b/src/plugins/SkinsRestorer.jar
new file mode 100644
index 0000000..0355bc9
--- /dev/null
+++ b/src/plugins/SkinsRestorer.jar
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5d20c55e6bc86959a401dc4dbdbed08bcb5e229e664a26b21032dc65c9a54411
+size 5448256
diff --git a/src/plugins/bStats/config.txt b/src/plugins/bStats/config.txt
index 26b99c8..9a83263 100644
--- a/src/plugins/bStats/config.txt
+++ b/src/plugins/bStats/config.txt
@@ -3,7 +3,7 @@
# bStats enabled, but if you're not comfortable with this, you can turn this setting off.
# There is no performance penalty associated with having metrics enabled, and data sent to
# bStats is fully anonymous.
-enabled=true
+enabled=false
server-uuid=67e70847-637e-4e8e-9e51-8d843191551f
log-errors=false
log-sent-data=false
diff --git a/src/plugins/librelogin/config.conf b/src/plugins/librelogin/config.conf
new file mode 100644
index 0000000..223deb7
--- /dev/null
+++ b/src/plugins/librelogin/config.conf
@@ -0,0 +1,241 @@
+# !!THIS FILE IS WRITTEN IN THE HOCON FORMAT!!
+# The hocon format is very similar to JSON, but it has some extra features.
+# You can find more information about the format on the sponge wiki:
+# https://docs.spongepowered.org/stable/en/server/getting-started/configuration/hocon.html
+# ----------------------------------------------------------------------------------------
+# LibreLogin Configuration
+# ----------------------------------------------------------------------------------------
+# This is the configuration file for LibreLogin.
+# You can find more information about LibreLogin on the github page:
+# https://github.com/kyngs/LibreLogin
+
+# !!!THIS ONLY AFFECTS PAPER!!!
+# Verifies whether the IP the players had used when authenticating to Mojang matches the IP they are connecting from. Disabling this may break LibreLogin if the server is running under a reverse proxy/VPN.
+allow-proxy-connections=true
+# Commands that are allowed while the user is not authorized.
+allowed-commands-while-unauthorized=[
+ login,
+ register,
+ "2fa",
+ "2faconfirm",
+ l,
+ log,
+ reg,
+ resetpassword,
+ confirmpasswordreset
+]
+# Should we automatically register all players with a premium nickname?
+# !!CRACKED PLAYERS WILL NOT BE ABLE TO REGISTER PREMIUM USERNAMES!!
+auto-register=false
+# This section is used for MySQL database configuration.
+database {
+ properties {
+ mysql {
+ # The name of the database.
+ database=_LIBRELOGIN_DB_NAME_
+ # The host of the database.
+ host=_LIBRELOGIN_DB_HOST_
+ # The JDBC URL of the database. Don't touch this if you don't know what you're doing. (Using jdbc:mariadb also works for pure mysql)
+ jdbc-url="jdbc:mariadb://%host%:%port%/%database%?autoReconnect=true&zeroDateTimeBehavior=convertToNull"
+ # The maximum lifetime of a database connection in milliseconds. Don't touch this if you don't know what you're doing.
+ max-life-time=600000
+ # The password of the database.
+ password="_LIBRELOGIN_DB_PASSWORD_"
+ # The port of the database.
+ port=_LIBRELOGIN_DB_PORT_
+ # The user of the database.
+ user=_LIBRELOGIN_DB_USERNAME_
+ }
+ postgresql {
+ # The name of the database.
+ database=librelogin
+ # The host of the database.
+ host=localhost
+ # The maximum lifetime of a database connection in milliseconds. Don't touch this if you don't know what you're doing.
+ max-life-time=600000
+ # The password of the database.
+ password=""
+ # The port of the database.
+ port=5432
+ # The user of the database.
+ user=root
+ }
+ sqlite {
+ # Path to SQLite database file. Relative to plugin datafolder.
+ path="../../librelogin.db"
+ }
+ }
+ # The type of the database. Built-in types:
+ # librelogin-mysql - MySQL database, you must fill out the mysql section below.
+ # librelogin-postgresql - PostgreSQL database, you must fill out the postgresql section below.
+ # librelogin-sqlite - SQLite database, default file is "database.db", you can change it in the sqlite section below.
+ type=librelogin-mysql
+}
+# Should we enable debug mode? This will print out debug messages to the console.
+debug=false
+# The default crypto provider. This is used for hashing passwords. Available Providers:
+# SHA-256 - Older, not recommended. Kept for compatibility reasons.
+# SHA-512 - More safer than SHA-256, but still not recommended. Kept for compatibility reasons.
+# BCrypt-2A - Newer, more safe, recommended
+# Argon-2ID - Newest, should be safer than BCrypt-2A, however, it can slow down the server.
+default-crypto-provider=BCrypt-2A
+# !!THIS OPTION IS IRRELEVANT WHEN USING PAPER!! Should we fallback players to lobby servers if the server they are on shutdowns? If set to false, they will be kicked.
+fallback=false
+# By default, when choosing available lobby/limbos LibreLogin will rule out all the servers which are full.
+# Sometimes this may not work as expected. In such case, you can enable this option, which will ignore the max players field obtained by pinging the backend server.
+ignore-max-players-from-backend-ping=false
+# Sets the maximum amount of accounts that can be registered from the same IP address.
+# Set to zero or less to disable.
+# !!THIS IS NOT RECOMMENDED!! Due to the lack of IPv4 addresses, sometimes even entire villages share the same IP address.
+ip-limit=-1
+# The authentication servers/worlds, players should be sent to, when not authenticated. On Paper, players will be spawned on the world spawn. THIS SERVERS MUST BE REGISTERED IN THE PROXY CONFIG. IN CASE OF PAPER, THE WORLDS MUST EXIST.
+limbo=[
+ _LIBRELOGIN_LIMBOS_
+]
+# !!THIS OPTION IS IRRELEVANT WHEN USING PAPER!! Defines port(s) that limbo server can be bounded to.
+limbo-port-range="30000-40000"
+# !!WHEN USING PAPER, PUT ALL WORLDS UNDER "root"!!
+# On Paper, players will be spawned on the world spawn.
+#
+# The servers/worlds player should be sent to when they are authenticated. THE SERVERS MUST BE REGISTERED IN THE PROXY CONFIG. IN CASE OF PAPER, THE WORLDS MUST EXIST.
+# The configuration allows configuring forced hosts; the servers/worlds in "root" are used when players do not connect from a forced host. Use § instead of dots.
+# See: https://github.com/kyngs/LibrePremium/wiki/Configuring-Servers
+lobby {
+ root=[
+ _LIBRELOGIN_LOBBIES_
+ ]
+}
+mail {
+ # The email to use as a sender in the From field.
+ email="email@something.com"
+ # Should we enable the email password recovery feature?
+ enabled=false
+ # The host of the SMTP server.
+ host="smtp.gmail.com"
+ # The password used to login to the SMTP server. We highly recommend you use a unique one-time password for this.
+ password=password
+ # The port of the SMTP server.
+ port=587
+ # The sender of the email.
+ sender="LibreLogin Network"
+ # The username used to login to the SMTP server.
+ username=username
+}
+# Kick the player, if the password was incorrect more or equal times. -1 means disabled
+max-login-attempts=3
+# This is used for migrating the database from other plugins.
+# Please see the wiki for further information: https://github.com/kyngs/LibreLogin/wiki/Database-Migration
+migration {
+ old-database {
+ mysql {
+ # The name of the database.
+ database=librelogin
+ # The host of the database.
+ host=localhost
+ # The JDBC URL of the database. Don't touch this if you don't know what you're doing. (Using jdbc:mariadb also works for pure mysql)
+ jdbc-url="jdbc:mariadb://%host%:%port%/%database%?autoReconnect=true&zeroDateTimeBehavior=convertToNull"
+ # The maximum lifetime of a database connection in milliseconds. Don't touch this if you don't know what you're doing.
+ max-life-time=600000
+ # The password of the database.
+ password=""
+ # The port of the database.
+ port=3306
+ # The table of the old database.
+ table=user-data
+ # The user of the database.
+ user=root
+ }
+ postgresql {
+ # The name of the database.
+ database=librelogin
+ # The host of the database.
+ host=localhost
+ # The maximum lifetime of a database connection in milliseconds. Don't touch this if you don't know what you're doing.
+ max-life-time=600000
+ # The password of the database.
+ password=""
+ # The port of the database.
+ port=5432
+ # The table of the old database.
+ table=user-data
+ # The user of the database.
+ user=root
+ }
+ sqlite {
+ # Path to SQLite database file. Relative to plugin datafolder.
+ path="user-data.db"
+ }
+ }
+ # Migrate the database on the next startup.
+ on-next-startup=false
+ # The type of the migration. Available Types:
+ # jpremium-mysql - Can convert from MySQL JPremium SHA256, SHA512 and BCrypt
+ # authme-mysql - Can convert from MySQL AuthMe BCrypt and SHA256
+ # authme-sqlite - Can convert from SQLite AuthMe BCrypt and SHA256
+ # authme-postgresql - Can convert from PostgreSQL AuthMe BCrypt and SHA256
+ # aegis-mysql - Can convert from MySQL Aegis BCrypt
+ # dba-mysql - Can convert from MySQL DynamicBungeeAuth, which was configured to use SHA-512
+ # nlogin-sqlite - Can convert from SQLite NLogin SHA512
+ # nlogin-mysql - Can convert from MySQL NLogin SHA512
+ # loginsecurity-mysql - Can convert from MySQL LoginSecurity BCrypt
+ # loginsecurity-sqlite - Can convert from SQLite LoginSecurity BCrypt
+ # fastlogin-sqlite - Can convert from SQLite FastLogin, !!YOU MUST RUN CONVERSION FROM AUTHME FIRST!!
+ # fastlogin-mysql - Can convert from MySQL FastLogin, !!YOU MUST RUN CONVERSION FROM AUTHME FIRST!!
+ # limboauth-mysql - Can convert from MySQL LimboAuth BCrypt and SHA256
+ # authy-mysql - Can convert from MySQL Authy SHA256
+ # authy-sqlite - Can convert from SQLite Authy SHA256
+ # logit-mysql - Can convert from MySQL LogIt SHA256
+ # librelogin-mysql - Can convert from MySQL LibreLogin, useful for migrating to a different database
+ # librelogin-sqlite - Can convert from SQLite LibreLogin, useful for migrating to a different database
+ type=authme-sqlite
+}
+# Time to reset login attempts. The amount of time the player should have waited for their login attempts to expire. On every rejoin, login attempts are reset.
+milliseconds-to-refresh-login-attempts=10000
+# This specifies how often players should be notified when not authenticated. Set to negative to disable.
+# This includes (but is not limited to):
+# - Message in chat
+# - Title
+milliseconds-to-refresh-notification=10000
+# The minimum length of a password. Set to negative to disable.
+minimum-password-length=-1
+# The minimum length the player's name can have. Only applies to new players, set to 0 or lower to disable.
+minimum-username-length=-1
+# Sets which method should be used for creating fixed UUID when a new player is created.
+# See the wiki for further information: https://github.com/kyngs/LibreLogin/wiki/UUID-Creators
+# Available Creators:
+# RANDOM - Generates a random UUID
+# CRACKED - Generates a UUID based on the player's name, the same method as if the server was in offline mode
+# MOJANG - If the player exists in the Mojang's database, it will be used. Otherwise, CRACKED will be used.
+new-uuid-creator=CRACKED
+# !!THIS OPTION IS IRRELEVANT WHEN USING PAPER!! Should we ping servers to check if they are online, and get their player count? If you disable this, the pinging servers message will still appear in the console, even though the servers will not be pinged.
+ping-servers=false
+# Sets the strategy for resolving profile conflicts. Available strategies:
+# BLOCK - Kick both players with the message key "kick-name-mismatch". An admin must resolve the conflict manually.
+# USE_OFFLINE - Use the offline profile. When both of the players attempt to join, they will be provided with a login screen and will be able to login with the offline player's password. The online player will have to change their nickname to a available one in order to recover their account. Beware, that there's a 30 days cool down for changing nicknames.
+# OVERWRITE - Overwrite the offline profile's data with the online profile's data. This will irreversibly delete the offline player's data. !!USE WITH CAUTION; PLAYERS CAN AND WILL ABUSE THIS!!
+profile-conflict-resolution-strategy=BLOCK
+# Should we remember the last server/world a player was on? This is not recommended for large networks.
+remember-last-server=false
+# The config revision number. !!DO NOT TOUCH THIS!!
+revision=8
+# Sets the login/register time limit in seconds. Set to negative to disable.
+seconds-to-authorize=300
+# Defines a time in seconds after a player's session expires. Default value is one week (604800 seconds). Set to zero or less to disable sessions.
+session-timeout=21600
+# This section is used for 2FA configuration.
+# !! YOU MUST HAVE PROTOCOLIZE INSTALLED FOR THIS TO WORK !!
+#
+# You can find more information on the wiki: https://github.com/kyngs/LibreLogin/wiki/2FA
+totp {
+ # The delay in milliseconds until player is given a map to scan the QR code. Increase this value if the map disappears too quickly.
+ delay=5000
+ # Should we enable TOTP-Based Two-Factor Authentication? If you don't know what this is, this is the 2FA used in applications like Google Authenticator etc.
+ # I heavily suggest you to read this wiki page: https://github.com/kyngs/LibreLogin/wiki/2FA
+ enabled=false
+ # The label to be displayed in the 2FA app. Change this to your network name.
+ label=Bebrashield
+}
+# Whether or not to use action bar when player is awaiting authentication.
+use-action-bar=false
+# Whether or not to use titles when player is awaiting authentication.
+use-titles=false
diff --git a/src/plugins/librelogin/forbidden-passwords.txt b/src/plugins/librelogin/forbidden-passwords.txt
new file mode 100644
index 0000000..9019882
--- /dev/null
+++ b/src/plugins/librelogin/forbidden-passwords.txt
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b84d2b3b7caebc4e978e157cef36327c58918c01b0dc29e11ec6762c13af8cde
+size 8743966
diff --git a/src/plugins/librelogin/messages.conf b/src/plugins/librelogin/messages.conf
new file mode 100644
index 0000000..3a4670c
--- /dev/null
+++ b/src/plugins/librelogin/messages.conf
@@ -0,0 +1,329 @@
+# !!THIS FILE IS WRITTEN IN THE HOCON FORMAT!!
+# The hocon format is very similar to JSON, but it has some extra features.
+# You can find more information about the format on the sponge wiki:
+# https://docs.spongepowered.org/stable/en/server/getting-started/configuration/hocon.html
+# ----------------------------------------------------------------------------------------
+# LibreLogin Messages
+# ----------------------------------------------------------------------------------------
+# This file contains all of the messages used by the plugin, you are welcome to fit it to your needs.
+# The messages can be written both in the legacy format and in the MiniMessage format. For example, the following message is completely valid: &aReloaded!
+# You can find more information about LibreLogin on the github page:
+# https://github.com/kyngs/LibreLogin
+
+# This actionbar is displayed when the player is prompted to login. Make sure that you have use-action-bar set to true in the configuration.
+action-bar-login="&e/login &b"
+# This actionbar is displayed when the player is prompted to register. Make sure that you have use-action-bar set to true in the configuration.
+action-bar-register="&e/register &b"
+# This section contains autocompletes for commands. It is pretty large, so most people leave the defaults.
+# !!DO NOT TRANSLATE @players!! It is used to hint out all players online.
+autocomplete {
+ # This hint is displayed when the player starts typing the /2fa-confirm command.
+ "2fa-confirm"=code
+ # This hint is displayed when the player starts typing the /changepassword command.
+ change-password="oldPassword newPassword"
+ # This hint is displayed when the player starts typing the /confirmpasswordreset command.
+ confirm-password-reset="code newPassword newPassword"
+ # This hint is displayed when the player starts typing the /librelogin email test command.
+ email-test=address
+ # This hint is displayed when the player starts typing the /login command.
+ login=password
+ # This hint is displayed when the player starts typing the /premium command.
+ premium=password
+ # This hint is displayed when the player starts typing the /register command.
+ register="password password"
+ # This hint is displayed when the player starts typing the /resetpassword command.
+ reset-password=""
+ # This hint is displayed when the player starts typing the /setemail command.
+ set-email="address password"
+ # This hint is displayed when the player starts typing the /librelogin user 2fa-off command.
+ user-2fa-off="@players"
+ # This hint is displayed when the player starts typing the /librelogin user alts command.
+ user-alts="@players"
+ # This hint is displayed when the player starts typing the /librelogin user cracked command.
+ user-cracked="@players"
+ # This hint is displayed when the player starts typing the /librelogin user delete command.
+ user-delete="@players"
+ # This hint is displayed when the player starts typing the /librelogin user emailoff command.
+ user-email-off="@players"
+ # This hint is displayed when the player starts typing the /librelogin user info command.
+ user-info="@players"
+ # This hint is displayed when the player starts typing the /librelogin user login command.
+ user-login="@players"
+ # This hint is displayed when the player starts typing the /librelogin user migrate command.
+ user-migrate="@players newName"
+ # This hint is displayed when the player starts typing the /librelogin user pass-change command.
+ user-pass-change="@players newPassword"
+ # This hint is displayed when the player starts typing the /librelogin user premium command.
+ user-premium="@players"
+ # This hint is displayed when the player starts typing the /librelogin user register command.
+ user-register="@players password"
+ # This hint is displayed when the player starts typing the /librelogin user setemail command.
+ user-set-email="@players email"
+ # This hint is displayed when the player starts typing the /librelogin user unregister command.
+ user-unregister="@players"
+ # This hint is displayed when the player starts typing the /verifyemail command.
+ verify-email=code
+}
+# This email is sent to the player when they request to reset their password. You can insert any HTML code into this message.
+email-password-reset-content="Hello %name%! \nYou (from IP %ip%) have requested to reset your password on %server%. \nIf you did not request this, please ignore this email. \nTo confirm this action, please run the following command in-game: \n
/confirmpasswordreset %code%
\n"
+# This is the subject of the email sent to the player when they request to reset their password.
+email-password-reset-subject="Reset your password on %server%"
+# This email is sent to the player when they request to add a recovery email. You can insert any HTML code into this message.
+email-verification-content="Hello %name%! \nYou have requested to add a recovery email on %server%. \nIf you did not request this, please ignore this email. \nTo confirm this action, please run the following command in-game: \n
/verifyemail %code%
\n"
+# This is the subject of the email sent to the player when they request to add a recovery email.
+email-verification-subject="Verify your email on %server%"
+# This message is displayed when the player tries to authorize again.
+error-already-authorized="You are already authorized!"
+# This message is displayed when the player tries to register again.
+error-already-registered="You are already registered!"
+# This message is displayed when the configuration file is corrupted.
+error-corrupted-configuration="Configuration is corrupted, old one is going to be kept. Cause: %cause%"
+# This message is displayed when the messages.conf file is corrupted.
+error-corrupted-messages="Messages are corrupted, old ones are going to be kept. Cause: %cause%"
+# This message is displayed when the player tries to register with a password that is too short or forbidden.
+error-forbidden-password="The password is too short and/or is not allowed!"
+# This message is displayed when the player is executing a command, but they are coming from Floodgate.
+error-from-floodgate="You can't use this command from Floodgate!"
+# This message is displayed when the player uses a command with invalid syntax.
+error-invalid-syntax="Usage: {command}{syntax}"
+# This message is displayed when the player tries to send a mail, but it fails to send.
+error-mail-not-sent="Failed to send email, perhaps you typed your address wrong? If you are sure that you typed it correctly, please contact an administrator."
+# This message is displayed when the player tries to send mail too fast.
+error-mail-throttle="You are sending emails too fast! Please wait a bit."
+# This message is displayed when the player tries to run /premiumconfirm, before running /premium.
+error-no-confirm="Please use /premium first!"
+# This message is displayed when the player tries to recover their password, but they don't have a recovery email set.
+error-no-email="You don't have a recovery email set!"
+# This message is displayed when the player tries to run /mailconfirm, before running /mail.
+error-no-mail-confirm="Please use /setemail first!"
+# This message is displayed when the player tries to change password without having one.
+error-no-password="You don't have a password. You can try using /cracked to disable autologin, and then register."
+# This message is displayed when the player tries to run /resetpasswordconfirm, before running /resetpassword.
+error-no-password-reset="Please use /resetpassword first!"
+# This message is displayed when the player does not have permission to use a command.
+error-no-permission="You do not have permission to use this command!"
+# This message is displayed when the player tries to use a command that requires authorization.
+error-not-authorized="Please authorize first!"
+# This message is displayed when someone attempts to use a feature that is not available on MultiProxy.
+error-not-available-on-multi-proxy="This feature is not available on MultiProxy!"
+# This message is displayed when the player tries to enable autologin, but they already have it enabled.
+error-not-cracked="You have autologin enabled, disable it using /cracked!"
+# This message is displayed when the player tries to enable autologin, but their account does not exist in the Mojang database.
+error-not-paid="This account does not exist in the Mojang database!"
+# This message is displayed when the player tries to disable autologin, but they do not have it enabled.
+error-not-premium="You do not have autologin enabled, enable it using /premium !"
+# This message is displayed when the player tries to login, when they are not registered.
+error-not-registered="Please register first!"
+# This message is displayed when someone tries to move account to an occupied username.
+error-occupied-user="This username is already occupied!"
+# This message is displayed when the player tries to login with corrupted password.
+error-password-corrupted="Your password is corrupted, please contact an administrator!"
+# This message is displayed when the player tries to register with different passwords.
+error-password-not-match="Passwords do not match!"
+# This message is displayed when someone attempts to reset password while it is disabled.
+error-password-resetting-disabled="Password resetting is disabled!"
+# This message is displayed when the player tries to register with a password that is too long.
+error-password-too-long="The password is too long!"
+# This message is displayed when the player tries to authorize with wrong password.
+error-password-wrong="Wrong password!"
+# This message is displayed when someone attempts to refer an authenticated player.
+error-player-authorized="This player is already authenticated!"
+# This message is displayed when someone attempts to refer an unregistered player.
+error-player-not-registered="This player is not registered!"
+# This message is displayed when someone attempts to refer an offline player.
+error-player-offline="This player is offline!"
+# This message is displayed when someone attempts to refer an online player.
+error-player-online="This player is online!"
+# This message is displayed when the Mojang API is rate limiting us, therefore we cannot verify whether there is an account with the given username.
+error-premium-throttled="The Mojang API is rate limiting our server, please try the command again in a while!"
+# This message is displayed when there was an unknown issue while communicating with Mojang, therefore we cannot verify whether there is an account with the given username.
+# The error will be printed to the console
+error-premium-unknown="There was an unknown error while communicating with the mojang API, please check console for further details!"
+# This message is displayed when the player tries to send commands too fast.
+error-throttle="You are sending commands too fast! Please wait a bit."
+# This message is displayed when an unknown error occurs.
+error-unknown="An unknown error occurred! Check console for further information."
+# This message is displayed when the player uses an unknown command.
+error-unknown-command="Unknown command!"
+# This message is displayed when someone attempts to refer an unknown user.
+error-unknown-user="This user does not exist!"
+# This message is displayed when the player tries to verify their email with a wrong verification code.
+error-wrong-mail-verify="Wrong verification code!"
+# This message is displayed when the player tries to reset their password with a wrong password reset code.
+error-wrong-password-reset="Wrong password reset code!"
+# This message is displayed when the player executes /librelogin about.
+# !! Clearing this message, or somehow making the command unexecutable is not only cringe, but also considered a violation of the license. !!
+info-about="This server is running FOSS authentication plugin, LibreLogin.\nVersion: %version%\nAuthors: kyngs, and other contributors\nSource: https://github.com/kyngs/LibreLogin\nLicense: Mozilla Public License 2.0"
+# This message is displayed when the player has alts.
+info-alts="There are %count% players with the same IP address:"
+# This message is displayed when the player has alts.
+info-alts-entry="- %name% (last seen: %last_seen%)"
+# This message is displayed when something has been deleted.
+info-deleted="Deleted!"
+# This message is displayed when something is being deleted.
+info-deleting="Deleting..."
+# This message is displayed when something is disabling.
+info-disabling="Disabling..."
+# This message is displayed when a user executes /librelogin dump.
+info-dumped="Dump saved to %file%!"
+# This message is displayed when a user executes /librelogin dump.
+info-dumping="Creating dump..."
+# This message is displayed when something has been edited.
+info-edited="Edited!"
+# This message is displayed when something is being edited.
+info-editing="Editing..."
+# This message is displayed when something is enabling.
+info-enabling="Enabling..."
+# This message is displayed when the player is kicked from a server.
+info-kick="You have been kicked from the server for the following reason: %reason%"
+# This message is displayed when the player logs in.
+info-logged-in="Logged in!"
+# This message is displayed when the player attempts to log in.
+info-logging-in="Logging in..."
+# This message is displayed when the user executes a command that sends an email.
+info-mail-sending="Sending email..."
+# This message is displayed when the user verifies their email.
+info-mail-verified="Email verified! You can now reset your password if you forget it."
+# This message is displayed when the player has no alts.
+info-no-alts="There are no other players with the same IP address."
+# This message is displayed when the player resets their password.
+info-password-reset="Password reset! You can now log in with your new password."
+# This message is displayed when the player logs in automatically because they have enabled /premium.
+info-premium-logged-in="You have been logged in automatically!"
+# This message is displayed when the player registers.
+info-registered="Registered!"
+# This message is displayed when the player attempts to register.
+info-registering="Registering..."
+# This message is displayed when something has been reloaded.
+info-reloaded="Reloaded!"
+# This message is displayed when something is being reloaded.
+info-reloading="Reloading..."
+# This message is displayed when the user executes a command that sends a reset email.
+info-reset-password-mail-sent="Password reset email sent! If you don't see anything in your inbox, check your spam folder. You have 10 minutes to reset your password."
+# This message is displayed when the player attempts to reset their password.
+info-resetting-password="Resetting password..."
+# This message is displayed when the user executes a command that sends an email.
+info-sending-email="Sending email..."
+# This message is displayed when the user executes a command that sends an email.
+info-sent-email="Email sent!"
+# This message is displayed when the player logs in automatically because of a valid session.
+info-session-logged-in="You have been logged in automatically!"
+# This message is displayed when the player's information is requested.
+info-user="UUID: %uuid%\nPremium UUID: %premium_uuid%\nLast Seen: %last_seen%\nJoined: %joined%\n2FA: %2fa%\nEMail: %email%\nIP: %ip%\nLast Authenticated: %last_authenticated%"
+# This message is displayed when the user executes a command that sends a verification email.
+info-verification-mail-sent="Verification email sent! If you don't see anything in your inbox, check your spam folder. You have 10 minutes to verify your email."
+# This message is displayed when the player enables 2FA.
+kick-2fa-enabled="Two-factor has been enabled! Please reconnect."
+# This message is displayed when the player is already connected, but tries to join from another location.
+kick-already-connected="You are already connected!"
+# This message is displayed when the player is kicked because they authorize with wrong password.
+kick-error-password-wrong="Wrong password!"
+# This message is displayed when the player's username is not allowed.
+# See https://github.com/kyngs/LibreLogin/wiki/Name-Validation for more information.
+kick-illegal-username="You have illegal characters in your username or/and your username is longer than 16 characters!"
+# This message is displayed when the player's username is not in the correct case.
+# See https://github.com/kyngs/LibreLogin/wiki/Name-Validation for more information.
+kick-invalid-case-username="Please, change your username to &c%username%"
+# This message is displayed when the player's IP has reached the maximum amount of accounts.
+# See the configuration key "ip-limit" for more information.
+kick-ip-limit="You have reached the maximum amount of accounts per IP!"
+# This occurs, when there is a profile conflict.
+# See https://github.com/kyngs/LibreLogin/wiki/Profile-Conflicts for more information.
+kick-name-mismatch="Oh no! It looks like an premium user with activated auto login changed their nickname to %nickname%, therefore there are 2 colliding accounts. Please contact support immediately."
+# This message is displayed when the player is kicked because there is not any limbo available.
+kick-no-limbo="There's no available limbo to connect you to. Please try again later. If you're the server administrator, please install NanoLimboPlugin."
+# This message is displayed when the player is kicked because there is not any server available.
+kick-no-lobby="There's no available lobby to connect you to. Please try again later."
+# This message is displayed when the player's username is already taken.
+kick-occupied-username="Please, change your username to &c%username%"
+# This message is displayed when the Mojang API is rate limiting us, therefore we cannot verify whether there is an account with the given username.
+kick-premium-error-throttled="The Mojang API is rate limiting our server, please try joining again in a while!"
+# This message is displayed when there was an unknown issue while communicating with Mojang, therefore we cannot verify whether there is an account with the given username.
+# The error will be printed to the console
+kick-premium-error-undefined="There was some issue while communicating with Mojang, if the problem persists, contact the server administrators!"
+# This message is displayed when the player disables autologin, they need to be kicked.
+kick-premium-info-disabled="Autologin disabled!"
+# This message is displayed when the player enables autologin, they need to be kicked.
+kick-premium-info-enabled="Autologin enabled!"
+# This message is displayed when the player's username is too short.
+# See the configuration key "minimum-username-length" for more information.
+kick-short-username="Your username is too short! The minimum length is %length% letters."
+# This message is displayed when the player takes too long to authorize. (You can specify this time limit in the config file)
+kick-time-limit="You took too long to authorize!"
+# This message is displayed when the player is prompted to confirm autologin.
+prompt-confirm="You are about to enable premium autologin, please take note, that you &4WILL NOT&r be able to connect to your account from cracked client. You can turn this off later by using /cracked. To confirm this action, you have 5 minutes to run /confirmpremium"
+# This message is displayed when the player is prompted to login.
+prompt-login="Please login using: &e/login &b [2fa_code]"
+# This message is displayed when the player is prompted to register.
+prompt-register="Please register using: &e/register &b"
+# The config revision number. !!DO NOT TOUCH THIS!!
+revision=3
+# This subtitle is displayed when the player is prompted to login. Make sure that you have use-titles set to true in the configuration.
+sub-title-login="&e/login &b"
+# This subtitle is displayed when the player is prompted to register. Make sure that you have use-titles set to true in the configuration.
+sub-title-register="&e/register &b"
+# This section contains syntax for commands. It is pretty large, so most people leave the defaults.
+syntax {
+ # This message is displayed when the player attempts to confirm 2FA with wrong syntax.
+ "2fa-confirm"=""
+ # This message is displayed when the player attempts to change password with wrong syntax.
+ change-password=""
+ # This message is displayed when the player attempts to confirm password reset with wrong syntax.
+ confirm-password-reset=""
+ # This message is displayed when the player attempts to test email with wrong syntax.
+ email-test=""
+ # This message is displayed when the player attempts to login with wrong syntax.
+ login=" [2fa_code]"
+ # This message is displayed when the player attempts to enable premium autologin with wrong syntax.
+ premium=""
+ # This message is displayed when the player attempts to register with wrong syntax.
+ register=""
+ # This message is displayed when the player attempts to reset password with wrong syntax.
+ reset-password=""
+ # This message is displayed when the player attempts to set email with wrong syntax.
+ set-email=" "
+ # This message is displayed when the player attempts to disable 2FA for other user with wrong syntax.
+ user-2fa-off=""
+ # This message is displayed when the player attempts to get alts of other user with wrong syntax.
+ user-alts=""
+ # This message is displayed when the player attempts to disable premium autologin for other user with wrong syntax.
+ user-cracked=""
+ # This message is displayed when the player attempts to delete user with wrong syntax.
+ user-delete=""
+ # This message is displayed when the player attempts to disable EMail for other user with wrong syntax.
+ user-email-off=""
+ # This message is displayed when the player attempts to get user info with wrong syntax.
+ user-info=""
+ # This message is displayed when the player attempts to login other user with wrong syntax.
+ user-login=""
+ # This message is displayed when the player attempts to migrate user with wrong syntax.
+ user-migrate=""
+ # This message is displayed when the player attempts to change password for other user with wrong syntax.
+ user-pass-change=""
+ # This message is displayed when the player attempts to enable premium autologin for other user with wrong syntax.
+ user-premium=""
+ # This message is displayed when the player attempts to register other user with wrong syntax.
+ user-register=""
+ # This message is displayed when the player attempts to set EMail for other user with wrong syntax.
+ user-set-email=""
+ # This message is displayed when the player attempts to unregister user with wrong syntax.
+ user-unregister=""
+ # This message is displayed when the player attempts to verify email with wrong syntax.
+ verify-email=""
+}
+# This title is displayed when the player is prompted to login. Make sure that you have use-titles set to true in the configuration.
+title-login="&6&lLogin"
+# This title is displayed when the player is prompted to register. Make sure that you have use-titles set to true in the configuration.
+title-register="&6&lRegister"
+# This message is displayed when player has begun the 2FA enable procedure.
+totp-generating="Generating 2FA code..."
+# This message is displayed when the player attempts to finish the 2FA process, but they are not in the process of enabling 2FA.
+totp-not-awaiting="You are currently not in the process of enabling 2FA! Please type /2fa to begin the process."
+# This message is displayed when the player tries to authorize without providing a 2FA code.
+totp-not-provided="You must provide a 2FA code! Use /login <2FA code>, if you lost your code, contact the admins."
+# This message is displayed when the player is prompted to scan the 2FA QR code.
+totp-show-info="Please scan the QR code on the map into your 2FA app. For example, Google Authenticator or Authy.\nWhen you are complete, please execute the /2faconfirm command to finish the process.\nDisconnect to abort."
+# This message is displayed when the player tries to authorize, or finish the 2FA enablement, with a wrong 2FA code.
+totp-wrong="Wrong 2FA code!"
+# This message is displayed when the player attempts to enable 2FA with an old client.
+totp-wrong-version="You must connect with client version %low% - %high%, in order to enable 2FA. You can then connect back with old version again."
diff --git a/src/plugins/skinsrestorer/config.yml b/src/plugins/skinsrestorer/config.yml
new file mode 100644
index 0000000..f19ebae
--- /dev/null
+++ b/src/plugins/skinsrestorer/config.yml
@@ -0,0 +1,370 @@
+##################################
+# SkinsRestorer config #
+##################################
+
+# We from SRTeam thank you for using our plugin!
+
+# We recommend you read the official installation guide before asking for help:
+# https://skinsrestorer.net/docs/installation
+
+# We have prepared a few resources to help you configure the plugin:
+# General help: https://skinsrestorer.net/docs/configuration
+# Commands and permissions: https://skinsrestorer.net/docs/configuration/commands-permissions
+# Translations and messages: https://skinsrestorer.net/docs/configuration/locale-translations
+
+# If you encounter issues, you can do the following:
+# Read the troubleshooting guide: https://skinsrestorer.net/docs/troubleshooting
+# For advanced help or other, go to our Discord Server: https://skinsrestorer.net/discord
+
+# (?) Step by step installation guide: https://skinsrestorer.net/docs/installation
+
+# (!) IF YOU ARE USING A PROXY (BungeeCord, Waterfall or Velocity), YOU NEED TO INSTALL SKINSRESTORER ON THE PROXY AND ALL SERVERS! (!)
+# (!) YOU ALSO NEED TO CONFIGURE YOUR SERVERS TO DETECT THE PROXY! (!)
+# (!) AND YOU ALSO NEED TO PUT THE SAME CONFIG FILE IN ALL PROXIES AND SERVERS! (!)
+# (!) You can find detailed proxy instructions here: https://skinsrestorer.net/docs/installation
+
+##########
+# Locale #
+##########
+
+# Translation & message options here
+# To learn more about translations and how to make custom translations, visit: https://skinsrestorer.net/docs/configuration/locale-translations
+messages:
+ # A locale code for the locale you want to use by default for messages and commands.
+ # Has to be a string separated by an underscore.
+ locale: en
+ # A locale code for the messages and commands sent to the console.
+ # This is useful if you want to use a different locale for the console than for players.
+ # We recommend keeping this at the default value because we mostly only provide support in English.
+ # Has to be a string separated by an underscore.
+ consoleLocale: en
+ # Disable the message prefix in SkinsRestorer messages.
+ disablePrefix: true
+ # Every message sent by the plugin will use the players client locale if a translation is available.
+ # If disabled, the config locale will be used instead.
+ perIssuerLocale: true
+ # How dates are formatted by the plugin in messages. Format is explained here:
+ # https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/format/DateTimeFormatter.html
+ dateFormat: dd MMMM yyyy
+
+############
+# Database #
+############
+
+# Settings for databases skin storage (recommended for large networks with a lot of skins)
+# [!] Make sure you have the correct permissions set for your MySQL user. [!]
+# [!] Make sure to fill in database.connectionOptions if you're using certificate / ssl authentication. [!]
+# [!] If you're not using ssl, change sslMode=trust to sslMode=disable [!]
+database:
+ enabled: true
+ host: _SKINSRESTORER_DB_HOST_
+ port: _SKINSRESTORER_DB_PORT_
+ database: _SKINSRESTORER_DB_NAME_
+ username: _SKINSRESTORER_DB_USERNAME_
+ password: '_SKINSRESTORER_DB_PASSWORD_'
+ maxPoolSize: 10
+ tablePrefix: sr_
+ connectionOptions: sslMode=disabled&serverTimezone=UTC
+
+############
+# Commands #
+############
+
+# Control behaviour of commands.
+# To learn more about commands and permissions, visit: https://skinsrestorer.net/docs/configuration/commands-permissions
+commands:
+ # For all player commands to work by default, you need to give players the permission 'skinsrestorer.player'.
+ # This option allows you to force the default permission (skinsrestorer.player) to be given to all players.
+ # A value of 'false' will disable this behaviour, and players will need to be given the permission explicitly.
+ # This is because some platforms (like BungeeCord) do not have a default permission system.
+ # If your platform supports default permissions, this option is ignored.
+ forceDefaultPermissions: true
+ # Players cooldown in seconds when changing skins (set to 0 to disable).
+ # SkinErrorCooldown is used when an error or invalid url occurs.
+ # Can be bypassed with 'skinsrestorer.bypasscooldown'.
+ skinChangeCooldown: 30
+ # Players cooldown in seconds when getting skulls (set to 0 to disable).
+ # SkullErrorCooldown is used when an error or invalid url occurs.
+ # Can be bypassed with 'skinsrestorer.bypasscooldown'.
+ skullGetCooldown: 30
+ skinErrorCooldown: 5
+ skullErrorCooldown: 5
+ # When enabled, only websites from the list below is allowed to be set using /skin url
+ # [?] this is useful if you host your own image server.
+ restrictSkinUrls:
+ enabled: false
+ list:
+ - https://i.imgur.com
+ - http://i.imgur.com
+ - https://storage.googleapis.com
+ - http://storage.googleapis.com
+ - https://cdn.discordapp.com
+ - http://cdn.discordapp.com
+ - https://textures.minecraft.net
+ - http://textures.minecraft.net
+ # Skins in this list will be disabled, so users can't set them.
+ # Can be bypassed with 'skinsrestorer.bypassdisabled'.
+ disabledSkins:
+ enabled: false
+ list:
+ - steve
+ - owner
+ # To enable per skin permissions you must agree to these rules:
+ # - Do not monetize players being able to use their own skin
+ # - Do not force players to steve skins and make them pay to use their own skin
+ # - You can charge them for custom skins, but not their own skin
+ # If you agree, set this to: 'I will follow the rules'
+ perSkinPermissionsConsent: ''
+ # Allows the usage of per-skin permission.
+ # Example: skinsrestorer.skin.xknat OR skinsrestorer.skin.Pistonmaster
+ # with "skinsrestorer.ownskin" players can run /skin set .
+ # [!] Only enable if you have set up permissions properly and know what you are doing.
+ # [!] This option only works if 'commands.perSkinPermissionsConsent' is consented to.
+ perSkinPermissions: false
+ # How many commands to store in the player's command history.
+ # This is used for the /skin undo command.
+ # Use 0 to disable storing command history.
+ maxHistoryLength: 0
+ # How many favourites a player may have.
+ # This is used for the /skin favourite command.
+ # Use 0 to disable storing favourites.
+ maxFavouriteLength: 0
+ customHelp:
+ # Override the automatically generated translated help message with a custom one.
+ # This is useful if you want to have a custom help message for your server.
+ # This only affects the base help message when running /skin with no parameters, not the error/subcommand help messages.
+ enabled: false
+ # The custom help message to send to the player when running /skin with no parameters.
+ message:
+ - Skin plugin Help
+ - ---------------------
+ - /skin set - Set your skin
+ #
+ # This option will disable the /skin command from being registered on the server.
+ # Do not disable this unless you are overriding the /skin command with a different plugin or you don't want the skin command.
+ # Requires a server restart to take effect.
+ disableSkinCommand: false
+ #
+ # This option will disable the /skull command from being registered on the server.
+ # Do not disable this unless you are overriding the /skull command with a different plugin or you don't want the skull command.
+ # Requires a server restart to take effect.
+ disableSkullCommand: false
+ #
+ # This option will disable the /skins command from being registered on the server.
+ # Do not disable this unless you are overriding the /skins command with a different plugin or you don't want the GUI command.
+ # Requires a server restart to take effect.
+ disableGUICommand: false
+
+# Control what skins appear in the /skins GUI
+gui:
+ # Control what skin is displayed when a player does not have permission for a skin.
+ # This is the end part of the skin texture URL.
+ # You can obtain the texture URL from /sr info skin
+ notUnlockedSkin: c10591e6909e6a281b371836e462d67a2c78fa0952e910f32b41a26c48c1757c
+ # Control custom skins in the /skins GUI
+ custom:
+ # Whether custom skins are enabled in the /skins GUI
+ enabled: true
+ # Order of custom skins relative to the other skin types
+ index: 0
+ # Whether only specific custom skins are allowed in the /skins GUI
+ onlyShowList: false
+ # Specific custom skins to show in the /skins GUI
+ list:
+ - xknat
+ - pistonmaster
+ # Control player skins in the /skins GUI
+ players:
+ # Whether player skins are enabled in the /skins GUI
+ enabled: false
+ # Order of player skins relative to the other skin types
+ index: 1
+ # Whether only specific player skins are allowed in the /skins GUI
+ onlyShowList: false
+ # Specific player skins to show in the /skins GUI
+ list:
+ - 7dcfc130-344a-4719-9fbe-3176bc2075c6
+ - b1ae0778-4817-436c-96a3-a72c67cda060
+ # Control recommended skins in the /skins GUI
+ recommendations:
+ # Whether recommended skins are enabled in the /skins GUI
+ enabled: true
+ # Order of recommended skins relative to the other skin types
+ index: 2
+ # Whether only specific recommended skins are allowed in the /skins GUI
+ onlyShowList: false
+ # Specific recommended skins to show in the /skins GUI
+ list:
+ - vampire
+ - space-suit
+
+###########
+# Storage #
+###########
+
+# Here you can design the plugin the way you want it.
+
+# Enable or disable default skins
+# applyForPremium: false will only put a skin on skinless/steve players.
+# If there is more than one, the plugin will choose a random one.
+# [?] Supports custom & url.png skins, read SkinFile Generator below.
+storage:
+ defaultSkins:
+ enabled: true
+ applyForPremium: false
+ list:
+ - https://www.minecraftskins.com/uploads/skins/2023/03/01/capibara-argentina-21381625.png
+ - https://www.minecraftskins.com/uploads/skins/2023/03/29/spreen-capybara-roblox-21465206.png
+ - https://www.minecraftskins.com/uploads/skins/2023/03/25/capibara-joel-the-last-of-us-21452836.png
+ - https://www.minecraftskins.com/uploads/skins/2023/09/30/capibara-aquino-con-m-22011245.png
+ - https://www.minecraftskins.com/uploads/skins/2023/09/13/capibara-21971363.png
+ - https://www.minecraftskins.com/uploads/skins/2024/06/05/capibara-22586063.png
+ - https://www.minecraftskins.com/uploads/skins/2024/06/26/capibara-22641362.png
+ - https://www.minecraftskins.com/uploads/skins/2024/09/23/skin-de-yago-22783245.png
+ - https://www.minecraftskins.com/uploads/skins/2024/10/08/capibara-halloween-22809600.png
+ - https://www.minecraftskins.com/uploads/skins/2024/10/26/capibara-detective---iammacohs16-twich-22841125.png
+ - https://www.minecraftskins.com/uploads/skins/2025/01/15/capibara-whatc-22999242.png
+ #
+ # Enable this will require players to run "/skin update" to update their skin.
+ disallowAutoUpdateSkin: false
+ # Time that skins are stored in the database before we request again (in minutes).
+ # [?] A value of 0 will always trigger a request to the Mojang API.
+ # [!] Lowering this value will increase the amount of requests which could be a problem on large servers.
+ skinExpiresAfter: 525600
+ # How long we should cache the UUIDs of players (in minutes).
+ # [?] A value of 0 will always trigger a request to the Mojang API.
+ # [!] Lowering this value will increase the amount of requests which could be a problem on large servers.
+ uuidExpiresAfter: 525600
+
+#########
+# Proxy #
+#########
+
+# Change proxy specific settings here.
+proxy:
+ # Disable all SkinsRestorer commands on specific backend servers.
+ # [!] This only works & is relevant if you're using proxies like BungeeCord / Velocity
+ notAllowedCommandServers:
+ # Whether to enable the backend server command blocking feature.
+ enabled: true
+ # Block players from executing SkinsRestorer commands before having joined a server.
+ ifNoServerBlockCommand: true
+ # When false means servers in the list are NOT allowed to execute SkinsRestorer commands, true means ONLY servers in the list are allowed to execute SkinsRestorer commands.
+ allowList: false
+ # List of servers where SkinsRestorer commands are allowed/disallowed depending on the 'allowList' setting.
+ list:
+ - limbo
+
+##########
+# Server #
+##########
+
+# Change server specific settings here.
+server:
+ # Disabling this will stop SkinsRestorer from changing skins when a player loads a server resource pack.
+ # When a player loads a server resource pack, their skin is reset. By default, SkinsRestorer reapplies the skin when the player reports that the resource pack has been loaded or an error has occurred.
+ resourcePackFix: true
+ # Dismounts a mounted (on a horse, or sitting) player when their skin is updated, preventing players from becoming desynced.
+ dismountPlayerOnSkinUpdate: true
+ # Remounts a player that was dismounted after a skin update (above option must be true).
+ # Disabling this is only recommended if you use plugins that allow you ride other players, or use sit. Otherwise you could get errors or players could be kicked for flying.
+ remountPlayerOnSkinUpdate: true
+ # Dismounts all passengers mounting a player (such as plugins that let you ride another player), preventing those players from becoming desynced.
+ dismountPassengersOnSkinUpdate: false
+ sound:
+ # Play a sound when a player runs /skin to change their skin.
+ enabled: false
+ # Sound to play when a player runs /skin to change their skin.
+ # You can find the allowed format and values at
+ # https://javadoc.io/static/com.github.cryptomorin/XSeries/11.0.0/com/cryptomorin/xseries/XSound.html#parse(java.lang.String)
+ value: ENTITY_PLAYER_TELEPORT, 0.7
+ # Proxy mode settings. Allows SkinsRestorer to work with proxies.
+ proxyMode:
+ # Proxy mode detection. Valid values are ENABLED, DISABLED, AUTO. Auto will auto detect based on your server configuration.
+ detection: AUTO
+ # Proxy mode API will make server-side plugin calls to SkinsRestorer API possible. Only works if a database is set up instead of file storage.
+ api: true
+login:
+ # Stops the process of setting a skin if the LoginEvent was canceled by an AntiBot plugin.
+ # [?] Unsure? leave this true for better performance.
+ noSkinIfLoginCanceled: true
+ # This will make SkinsRestorer always apply the skin even if the player joins as premium on an online mode server.
+ alwaysApplyPremium: false
+api:
+ # Here you can fill in your APIKey for lower MineSkin request times.
+ # Key can be requested from https://mineskin.org/apikey
+ # [?] A key is not required, but recommended.
+ mineskinAPIKey: key
+ # SkinsRestorer uses MineSkin to generate usable skins from links.
+ # All skins generated by MineSkin are by default shown in their public gallery on their website.
+ # Enabling this option will hide all skins generated by MineSkin from their public gallery.
+ mineskinSecretSkins: false
+ # SkinsRestorer provides curated recommended skins for players to use
+ # These skin can be used via /skin random and the /skins GUI
+ # If you would like to opt out of this feature, set this to false.
+ # It will prevent loading of recommended skins from storage and downloading new ones.
+ # Be aware that commands like /skin random will not work without this feature.
+ fetchRecommendedSkins: true
+
+###############
+# Danger Zone #
+###############
+
+# ABSOLUTELY DO NOT CHANGE SETTINGS HERE IF YOU DO NOT KNOW WHAT YOU DO!
+advanced:
+ #
+ # Enabling this will stop SkinsRestorer to change skins on join.
+ # Handy for when you want run /skin apply to apply skin after texturepack popup
+ disableOnJoinSkins: false
+ #
+ # This enables the PaperMC join event integration that allows instant skins on join.
+ # It is recommended over the fallback listener because it is smoother and should not lag the server.
+ # It also fixes all resource pack skin apply issues.
+ # If your players are experiencing extremely long loading screens, try disabling this.
+ enablePaperJoinListener: true
+ #
+ # This is a very dangerous feature that should only be used if you know what you are doing.
+ # Instead of resending player skins to other players by hiding and shadowing them, we will teleport them to a far away location and back
+ # This is a workaround for some server software with broken vanishing support, like Arclight.
+ teleportRefresh: false
+ #
+ # When enabled SkinsRestorer will not try to connect to any web server, which means the follow things won't work:
+ # Getting new skins from Mojang, looking up uuids of players, skin url, update checking and more.
+ # SkinsRestorer will only be able to access already downloaded skins.
+ # This is useful for servers that are not connected to the internet or have a firewall blocking connections.
+ noConnections: false
+
+# Updater Settings
+#
+# Using outdated version void's support, compatibility & stability.
+
+# To block all types of automatic updates (which can risk keeping an exploit):
+# Create a file called 'noupdate.txt' in the plugin directory (./plugins/SkinsRestorer/ )
+
+################
+# DEV's corner #
+################
+
+# Enable these on the dev's request
+dev:
+ # Enable to start receiving debug messages about api requests & more.
+ debug: false
+
+# End #
+
+# Useful tools:
+#
+# SkinFile Generator:
+# With SkinFile Generator, you can upload your own custom skin to get a unique .skin file that you can put in your skins folder, to use with SkinsRestorer.
+# Check it out here: https://generator.skinsrestorer.net
+#
+# SkinSystem:
+# With SkinSystem, you, as a server owner, can connect AuthMe with the SkinSystem website that you can host, to give your players the ability to upload custom skins.
+# Check it out here: https://github.com/SkinsRestorer/SkinSystem
+#
+# Useful Links #
+# Website: https://skinsrestorer.net
+# Docs: https://skinsrestorer.net/docs
+# Spigot: https://skinsrestorer.net/spigot
+# Github: https://github.com/SkinsRestorer/SkinsRestorer
+# Discord: https://skinsrestorer.net/discord
diff --git a/src/plugins/skinsrestorer/locales/repository/locale.json b/src/plugins/skinsrestorer/locales/repository/locale.json
new file mode 100644
index 0000000..e64060e
--- /dev/null
+++ b/src/plugins/skinsrestorer/locales/repository/locale.json
@@ -0,0 +1,188 @@
+{
+ "skinsrestorer.prefix_format": "[SkinsRestorer] ",
+ "skinsrestorer.help_skin": "Changes your own skin.",
+ "skinsrestorer.help_skins": "Opens the skins GUI.",
+ "skinsrestorer.help_sr": "Admin commands for SkinsRestorer.",
+ "skinsrestorer.help_skin_help": "Shows this help command.",
+ "skinsrestorer.help_skin_set": "Changes your skin.",
+ "skinsrestorer.help_skin_set_other": "Sets the skin for a target player.",
+ "skinsrestorer.help_skin_set_url": "Changes your skin from a URL.",
+ "skinsrestorer.help_skin_clear": "Clears your skin.",
+ "skinsrestorer.help_skin_clear_other": "Clears the skin of a target player.",
+ "skinsrestorer.help_skin_random": "Gives a random skin.",
+ "skinsrestorer.help_skin_random_other": "Sets a random skin for a target player.",
+ "skinsrestorer.help_skin_search": "Search up a skin that you want.",
+ "skinsrestorer.help_skin_edit": "Edit your current skin online.",
+ "skinsrestorer.help_skin_update": "Updates your skin.",
+ "skinsrestorer.help_skin_update_other": "Updates the skin of a target player.",
+ "skinsrestorer.help_skin_undo": "Reverts your skin back to the previous skin.",
+ "skinsrestorer.help_skin_undo_other": "Reverts the skin of a target player back to the previous skin.",
+ "skinsrestorer.help_skin_favourite": "Saves your skin as a favourite.",
+ "skinsrestorer.help_skin_favourite_other": "Saves the skin of a target player as a favourite.",
+ "skinsrestorer.help_skull": "Gives you a skull.",
+ "skinsrestorer.help_skull_help": "Skull commands for SkinsRestorer.",
+ "skinsrestorer.help_skull_get": "Gives you a skull.",
+ "skinsrestorer.help_skull_get_other": "Give a skull to another player.",
+ "skinsrestorer.help_skull_get_url": "Gives the skull based on a skin URL.",
+ "skinsrestorer.help_skull_random": "Gives you a random skull.",
+ "skinsrestorer.help_skull_random_other": "Gives a random skull to another player.",
+ "skinsrestorer.help_sr_reload": "Reloads the configuration file.",
+ "skinsrestorer.help_sr_status": "Checks required plugin API services.",
+ "skinsrestorer.help_sr_drop": "Removes player or skin data from the database.",
+ "skinsrestorer.help_sr_info": "Displays info about a player or skin.",
+ "skinsrestorer.help_sr_apply_skin": "Re-apply the skin for target player.",
+ "skinsrestorer.help_sr_create_custom": "Create a custom server wide skin.",
+ "skinsrestorer.help_sr_purge_old_data": "Purge old skin data from over x days ago.",
+ "skinsrestorer.help_sr_dump": "Upload support data to bytebin.lucko.me.",
+ "skinsrestorer.success_generic": "",
+ "skinsrestorer.info_use_quotes": "URLs must be quoted. Example: /skin set \"https://example.com/skin.png\" (You can press tab to autocomplete the quotes)",
+ "skinsrestorer.success_skin_change": "Your skin has been changed.",
+ "skinsrestorer.success_skin_change_other": "You changed the skin of .",
+ "skinsrestorer.success_skin_undo": "Your skin has been reverted back to a skin from .",
+ "skinsrestorer.success_skin_undo_other": "The skin of has been reverted back to a skin from .",
+ "skinsrestorer.success_skin_favourite": "Your skin has been set as a favourite.",
+ "skinsrestorer.success_skin_favourite_other": "The skin of has been set as a favourite.",
+ "skinsrestorer.success_skin_unfavourite": "Your favourite skin from has been unfavourited.",
+ "skinsrestorer.success_skin_unfavourite_other": "The favourite skin of from has been unfavourited.",
+ "skinsrestorer.success_skin_clear": "Your skin has been cleared.",
+ "skinsrestorer.success_skin_clear_other": "Skin cleared for player .",
+ "skinsrestorer.success_updating_skin": "Your skin has been updated.",
+ "skinsrestorer.success_updating_skin_other": "Skin updated for player .",
+ "skinsrestorer.success_skull_get": "You have received a skull.",
+ "skinsrestorer.success_skull_get_other": "You have given a skull.",
+ "skinsrestorer.success_admin_applyskin": "Player skin has been refreshed!",
+ "skinsrestorer.success_admin_createcustom": "Skin has been created!",
+ "skinsrestorer.success_admin_setcustomname": "The name of skin has been set to .",
+ "skinsrestorer.success_admin_drop": " data dropped for .",
+ "skinsrestorer.success_admin_reload": "Config and Locale has been reloaded!",
+ "skinsrestorer.success_history_line": "- Click to use '>\"> from ",
+ "skinsrestorer.success_favourites_line": "- Click to use '>\"> from ",
+ "skinsrestorer.error_generic": "Error: ",
+ "skinsrestorer.error_generic_skin": "An error occurred while requesting skin data, please try again later!",
+ "skinsrestorer.error_no_undo": "You have no skin to revert back to!",
+ "skinsrestorer.error_no_skin_to_favourite": "You have no skin to set as a favourite!",
+ "skinsrestorer.error_skin_disabled": "This skin is disabled by an administrator.",
+ "skinsrestorer.error_skinurl_disallowed": "This domain has not been allowed by the administrator.",
+ "skinsrestorer.error_updating_skin": "An error occurred while updating your skin. Please try again later!",
+ "skinsrestorer.error_updating_url": "You cannot update custom URL skins! Request again using /skin url",
+ "skinsrestorer.error_updating_customskin": "Skin cannot be updated because its custom.",
+ "skinsrestorer.error_invalid_urlskin": "Invalid skin URL or format, Try uploading your skin to imgur and right click 'copy image address' For guide see: Click to open'>https://skinsrestorer.net/skinurl.",
+ "skinsrestorer.error_admin_applyskin": "Player's skin could NOT be refreshed!",
+ "skinsrestorer.error_ms_full": "MineSkin API timed out while uploading your skin. Please try again later.",
+ "skinsrestorer.error_ms_api_failed": "MineSkin API is overloaded, please try again later!",
+ "skinsrestorer.error_ms_api_key_invalid": "Invalid MineSkin API key!, contact the server owner about this!",
+ "skinsrestorer.error_ms_unknown": "Unknown MineSkin Error!",
+ "skinsrestorer.error_no_history": "You have no skin history!",
+ "skinsrestorer.error_no_favourites": "You have no favourite skins!",
+ "skinsrestorer.error_player_refresh_no_mapping": "Could not refresh your skin because this Minecraft version is not supported by SkinsRestorer. Please tell the server admin to update the plugin SkinsRestorer.",
+ "skinsrestorer.not_connected_to_server": "You are not connected to any server.",
+ "skinsrestorer.divider": "----------------------------------------------",
+ "skinsrestorer.admincommand_status_checking": "Running service checks...",
+ "skinsrestorer.admincommand_status_uuid_api": "Working UUID APIs: /",
+ "skinsrestorer.admincommand_status_profile_api": "Working Profile APIs: /",
+ "skinsrestorer.admincommand_status_working": "The plugin is currently in a working state.",
+ "skinsrestorer.admincommand_status_degraded": "The plugin is in a degraded state, some features may not work fully.",
+ "skinsrestorer.admincommand_status_broken": "The plugin is currently in a broken state, no new skins can be requested.",
+ "skinsrestorer.admincommand_status_firewall": "Connections are likely blocked because of a firewall.Please read https://skinsrestorer.net/firewall for more info.",
+ "skinsrestorer.admincommand_status_summary_version": "SkinsRestorer v",
+ "skinsrestorer.admincommand_status_summary_server": "Server: ",
+ "skinsrestorer.admincommand_status_summary_proxymode": "Proxy Mode: ",
+ "skinsrestorer.admincommand_status_summary_commit": "Commit: ",
+ "skinsrestorer.admincommand_drop_player_not_found": "Player not found.",
+ "skinsrestorer.admincommand_drop_skin_not_found": "Skin not found.",
+ "skinsrestorer.admincommand_drop_uuid_error": "We were not able to contact Mojang to get the player's UUID",
+ "skinsrestorer.admincommand_info_checking": "Collecting requested data...",
+ "skinsrestorer.admincommand_info_player": "Player UUID: Skin Identifier: Skin Variant: Skin Type: ",
+ "skinsrestorer.admincommand_info_invalid_uuid": "You must specify a UUID of a player.",
+ "skinsrestorer.admincommand_info_no_set_skin": "Player has no explicitly set skin.",
+ "skinsrestorer.admincommand_info_url_skin": "URL Skin: '>MineSkin ID: ",
+ "skinsrestorer.admincommand_info_hardcoded_skin": "Hardcoded Skin: ",
+ "skinsrestorer.admincommand_info_custom_skin": "Custom Skin: ",
+ "skinsrestorer.admincommand_info_player_skin": "Player Skin: Timestamp: Expires: ",
+ "skinsrestorer.admincommand_info_generic": "Texture URL: '>Variant: Profile UUID: Profile Name: Request time: ",
+ "skinsrestorer.admincommand_purgeolddata_success": "Successfully purged old skins!",
+ "skinsrestorer.admincommand_purgeolddata_error": "A error occurred while purging old skins!",
+ "skinsrestorer.admincommand_dump_uploading": "Uploading data to bytebin.lucko.me...",
+ "skinsrestorer.admincommand_dump_success": "Upload successful! '>",
+ "skinsrestorer.admincommand_dump_error": "Error while uploading data to bytebin.lucko.me",
+ "skinsrestorer.command_server_not_allowed_message": "Commands have been disabled for the server .",
+ "skinsrestorer.command_unknown_player": "Unknown player: ",
+ "skinsrestorer.command_no_targets_supplied": "No target players supplied.",
+ "skinsrestorer.player_has_no_permission_skin": "Error: You don't have permission to set this skin.",
+ "skinsrestorer.player_has_no_permission_url": "Error: You don't have permission to set skins by URL.",
+ "skinsrestorer.not_premium": "Error: Premium player with that name does not exist.",
+ "skinsrestorer.only_allowed_on_console": "Error: Only console may execute this command!",
+ "skinsrestorer.only_allowed_on_player": "Error: Only players may execute this command!",
+ "skinsrestorer.invalid_player": "Error: is not a valid username or URL.",
+ "skinsrestorer.skin_cooldown": "Error: You can change your skin again in: ",
+ "skinsrestorer.ms_uploading_skin": "Uploading skin, please wait... (This may take up some time)",
+ "skinsrestorer.wait_a_minute": "Error: Please wait a minute before requesting that skin again. (Rate Limited)",
+ "skinsrestorer.skinsmenu_open": "Opening the skins menu...",
+ "skinsrestorer.skinsmenu_title_select": "Menu Select",
+ "skinsrestorer.skinsmenu_title_main": "Skins Menu - Page ",
+ "skinsrestorer.skinsmenu_title_history": "History Menu - Page ",
+ "skinsrestorer.skinsmenu_title_favourites": "Favourites Menu - Page ",
+ "skinsrestorer.skinsmenu_next_page": "»Next Page»",
+ "skinsrestorer.skinsmenu_previous_page": "«Previous Page«",
+ "skinsrestorer.skinsmenu_clear_skin": "[Remove Skin]",
+ "skinsrestorer.skinsmenu_select_skin": "Click to select this skin",
+ "skinsrestorer.skinsmenu_history_lore": "Skin from