diff --git a/Dockerfile b/Dockerfile index 5ce3ed5..d255608 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,6 +20,12 @@ ENV PROXY_SECRET=change_me ENV SERVERS=lobby="lobby:25565";survival="survival:25565" ENV TRY=lobby;survival +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 @@ -30,4 +36,9 @@ CMD \ 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 && \ + 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/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/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