%%MD0%%

AdvancedBanX is an updated and modernized version of the original AdvancedBan plugin made by Leoko. It is an All-In-One punishment system with warns, tempwarns, mutes, tempmutes, bans, tempbans, ipbans, and kicks. There is also player history to view players' past punishments. The plugin has configurable time & message layouts which automatically calculate and increase punishment times for certain reasons. AdvancedBanX provides a full message file so you can change and translate all messages. There is also a detailed main configuration file with a lot of useful options. At the moment, AdvancedBanX supports Bukkit (Spigot/Paper) and Bungeecord. It also supports MySQL and Local File saving as it's storage platform.

1. Download the plugin from %%MD0%%. 2. Place the plugin in your plugins folder (Same for Bukkit & Bungeecord). 3. Reload / Restart your server. 4. Check with /advancedban if the plugin has loaded successfully. 5. Configure it to your liking and enjoy.
Optionally, if there is an issue connecting to a database, please adjust the version of MySql to 5.X

See all commands
[NEEDED] <OPTIONAL> | = or -s = Silent punishemnt (no notification to others)
/kick<-s> [PLAYER] <REASON | @LAYOUT> Kick a player
/ban /mute /warn /note <-s> [PLAYER] <REASON | @LAYOUT> Ban/Mute/Warn a player / Add a note to a player
/banip <-s> [PLAYER/IP] <REASON | @LAYOUT> Ban a player's IP. If you enter a name it will use the cached IP
/tempban /tempmute /tempwarn <-s> [PLAYER] [Xmo|Xd|Xh|Xm|Xs|#TIMELAYOUT] <REASON | @LAYOUT> Tempban/mute/warn a player for a given time or with a time-layout for automatic-time-calcualtion
/tempipban <-s> [PLAYER/IP] [Xmo|Xd|Xh|Xm|Xs|#TIMELAYOUT] <REASON | @LAYOUT> Temippban a player for a given time or with a time-layout for automatic-time-calcualtion Alias: /tipban
/change-reason [ID] [New reason] Change the reason for a punishment by id
/change-reason [ban/mute] [PLAYER] [New reason] Change the reason for a players punishment
/unban /unmute [PLAYER] Unban/mute a player
/unwarn /unnote [ID] Delete a warn/note
/unwarn /unnote clear [PLAYER] Delete all warnings/notes for a player
/unpunish [ID] Delete a punishment
/warns /notes <PLAYER> See your own or a player's warnings/notes.
/check [PLAYER] Get player-status: UUID/IP/Country/Ban-Status/Mute-Status/Warn-Count/Note-Count
/banlist <PAGE> See all currently active punishments
/history [PLAYER] <PAGE> See all currently active punishments To use the command - ab.history
/advancedban reload Reloads the messages from file and "some" settings
/advancedban help Shows a list of all commands and a brief explanation
/systemprefs Displays some System-Information which are useful for the configuration

All Permissions
``` ab.kick.use - /kick ab.kick.exempt - Immune to kicking ab.notify.kick - Receives notification
ab.ban.perma - /ban ab.ban.temp - /tempban ab.ban.undo - /unban ab.ban.exempt - Immune to ban ab.notify.ban - Receives notification ab.undoNotify.ban - Receives notification when someone gets unbanned
ab.notify.tempban - Receives notification[/SPOILER]
ab.ipban.perma - /ipban ab.ipban.temp - /tempipban ab.notify.ipban - Receives notification
ab.tempipban.exempt - Immune to tempipban ab.notify.tempipban - Receives notification
ab.mute.perma - /mute ab.mute.temp - /tempmute ab.mute.undo - /unmute ab.mute.exempt - Immune to mute ab.notify.mute - Receives notification ab.undoNotify.mute - Receives notification when someone gets unmuted
ab.notify.tempmute - Receives notification
ab.warn.perma - /warn ab.warn.temp - /tempwarn ab.warn.undo - /unwarn ab.warn.exempt - Immune to warn ab.notify.warn - Receives notification ab.undoNotify.warn - Receives notification when someone gets unwarned
ab.notify.tempwarn - Receives notification
ab.note.use - /note ab.note.undo - /unnote ab.note.exempt - Immune to receiving notes ab.notify.note - Receives notification ab.undoNotify.note - Receives notification when someone gets unnoted
ab.all.undo - /unpunish
ab.warns.own - /warns ab.warns.other - /warns PLAYER
ab.notes.own - /notes ab.notes.other - /notes PLAYER
ab.check - /check ab.check.ip - Also shows IP
ab.changeReason - /change-reason ab.banlist - /banlist ab.history - /history ab.reload - /advancedban reload ab.help - /advancedban help ab.systemprefs - /systemprefs ```
Limit punish duration
By default, the user will be able to punish an infinite amount of time if he has the perms to use the command. You can set the max-punishment-time with ab.tempban/tempmute/tempwarn.dur.X In the config, there is a section called "TempPerms". There you can configure how long which ID will be able to punish for example, you set 1: 3600 the player with the perms ab.tempban.dur.1 will only be able to ban 3600s -> 1h The amount is entered in SEC and if a player has more than one perms the higher numbers override. There is a second explanation in the config.yml.
Layered exempt permissions
Servers with a large team and a complex hierarchy might need a more advanced approach to who can ban who:
To achieve that, you can assign exempt levels per permissions to users with ``` ab.TYPE.exempt.X ```
X = ban, tempban, ipban, tempipban, warn, tempwarn, kick, mute, tempmute X = 1 - 10 (10 being the most powerful)
If you do not provide x, the following is what the permission is interpreted as: ``` ab.TYPE.exempt = ab.TYPE.exempt.11 ```
Note that exempt permissions only work when the targeted user is online (unless using LuckPerms!)
(Users on the same level cannot punish each other)
Example: Users with ab.ban.exempt cannot be banned by anyone. Users with ab.ban.exempt.4 cannot be banned by someone with ab.ban.exempt.3 but can be banned by someone with ab.ban.exempt.5
Spoiler
If you use this plugin on bungeecord you need to define the permissions in the config.yml of the Bungeecord Server or through a spcial bBungeecord Permission Plugin.
The problem with bungeecord permissions is that there are not *-Perms so a user with ab.* won't have access to all commands. But to simplify the setup there is a setting in the advacnedban config called "EnableAllPermissionNodes" which allows you to use a .all instead of a .* so if enabled a user with ab.all will have access to all AdvancedBan commands. (There is another explanation in the config)

Config.yml:<br> The config.yml should be self explanatory, but explanations are provided for each option.
config.yml
```
AdvancedBan v3 - Coded by Leoko, Update & Maintained by 2vY (hlpdev)
For each setting, there is a small description.
Please read each description carefully before changing anything.
For more information visit: https://www.spigotmc.org/resources/advancedban.8695/
If set to false all bans will be saved locally in a HSQLDB-Database
UseMySQL: false
MySQL: IP: localhost DB-Name: database-name Username: admin Password: superSecret Port: 3306 Properties: 'verifyServerCertificate=false&useSSL=false&useUnicode=true&characterEncoding=utf8'
Set to false if you want to have only short messages in the console
On startup and on the shutdown.
DetailedEnableMessage: true DetailedDisableMessage: true
Whether to disallow connections to the server when there is an error
with the database. (e.g.: if your MySQL Server goes down)
LockdownOnError: true
This will be the default reason to be displayed if none is given
!! You may use normal color codes or MiniMessage formatting (https://docs.advntr.dev/minimessage/format.html)
DefaultReason: "No reason provided."
Change this if your server has a different time that your users.
e.g.: ServerTime: 16:43 | Your Time: 13:43 | TimeDiff has to be set to -3
You can check the server time with /systemPrefs
TimeDiff: 0
This commands will be disabled for muted players
A player wouldn't be able to bypass with eg "/minecraft:me"
MuteCommands: - 'me' - 'say' - 'action' - 'eaction' - 'describe' - 'edescribe' - 'eme' - 'w' - 'm' - 'pm' - 'whisper' - 'ewhisper' - 'emsg' - 'msg' - 'etell' - 'tell' - 'er' - 'r' - 'reply' - 'ereply' - 'ac' - 'eac' - 'amsg' - 'eamsg' - 'ehelpop' - 'p msg'
These players will not be able to get punished in any way
this also works if the player is offline
Use Vault to make exempt permissions also work for offline players
ExemptPlayers: - 'Leoko' - 'md5' - 'dutchy1001' - 'ItzSomebody'
The date-format which will be used for the %DATE% variable
DateFormat: "MM/dd/yyyy HH:mm"
This is useful for bungeecord servers or server with permission systems which do not support *-Perms
So if you enable this you can use ab.all instead of ab.* or ab.ban.all instead of ab.ban.*
This does not work with negative permissions! e.g. -ab.all would not block all commands for that user.
EnableAllPermissionNodes: false
If you use external REST-APIs they will have to respond in JSON
The given APIs will only be used for NAME -> UUID
For UUID -> NAME will either use the official MojangAPI or the InternFetcher
To check if you can use the intern fetcher do /systemPerfs and compare your uuid
to the one you can see online on http://NamesMC.com
if they are similar we recommend using the InternFetcher
UUID-Fetcher:
If dynamic it set to true it will override the 'enabled' and 'intern' settings
and automatically detect the best possible uuid fetcher settings for your server.
Our recommendation: don't set dynamic to false if you don't have any problems.
Dynamic: true Enabled: true Intern: false REST-API: URL: "https://api.mojang.com/users/profiles/minecraft/%NAME%?at=%TIMESTAMP%" Key: "id" BackUp-API: URL: "https://api.minetools.eu/uuid/%NAME%" Key: "id"
These are the commands that will be performed on warns
If you skip a number the command from before will be performed
You can also use non-AdvancedBan-Commands like 'broadcast' or 'clear %PLAYER%
Variables: %PLAYER%, %REASON%, %COUNT%
!! You may use normal color codes or MiniMessage formatting (https://docs.advntr.dev/minimessage/format.html)
WarnActions: 3: "kick %PLAYER% &c&oYou have received your 3rd warning!" 4: "tempban %PLAYER% 30m &c&oYou have received your 4th warning!" 5: "tempban %PLAYER% 5h &c&oYou have received your 5th warning!" 6: "tempban %PLAYER% 7d &c&oYou have received your 6th warning!" 7: "tempban %PLAYER% 1mo &c&oYou have received your %COUNT%th warning!" 10: "ban %PLAYER% &c&oYou have received your 10th warning!"
Here you can create permission-nodes for max-punishment-duration.
The permission "ab.tempban.dur.1" would allow the player to ban max. for 600sec = 10min
The permission "ab.tempwarn.dur.2" would allow the player to warn max. for 3600sec = 1h
You can only create up to 10 perms. The perms can be overridden with "ab.COMMAND.dur.max"
TempPerms: 1: 600 2: 3600 3: 43200
With this active will show more information in the console, such as errors, if
the plugin works correctly is not recommended to activate it since it is
designed to find bugs.
Debug: false
This is the amount of days that we should keep plugin logs in the plugins/AdvancedBan/logs folder.
By default is set to 10 days.
Log Purge Days: 10
Removes the prefix of the plugin in every message.
Disable Prefix: false
Register commands in a more friendly manner
Off by default, so AdvancedBan can override /ban from other plugins
This is a Bukkit-specific option. It has no meaning on BungeeCord
Friendly Register Commands: false ```
Messages.yml:<br> The messages.yml file contains all the strings that are presented to the end user. All strings can be changed. All regular color codes can be used, but MiniMessage formatting is preferred.
messages.yml
```
AdvancedBan v3 - Coded by Leoko, Update & Maintained by 2vY (hlpdev)
Normal Color Codes along with MiniMessage (https://docs.advntr.dev/minimessage/format.html) are available in all strings
General: Prefix: "<bold><red>AdvancedBanX</red> <dark_gray>»</dark_gray></bold>" NoPerms: "<red>You don't have perms for that!</red>" LayoutNotFound: "<red>There is no layout called %NAME%</red>"
This will be the replacement for the %DURATION% variable
TimeLayoutD: "%D%day(s) %H%h %M%min and %S%sec" TimeLayoutH: "%H%hour(s) %M%min and %S%sec" TimeLayoutM: "%M%min and %S%sec" TimeLayoutS: "%S% seconds" FailedFetch: "<red>Could not fetch the UUID of %NAME%! See console for details.</red>"
Ban: Usage: "<red>Usage</red> <dark_gray>»</dark_gray> <gray><italic>/ban (-s) [Name] [Reason/@Layout]</italic></gray>" Done: "<italic><red>%NAME%</red></italic> <gray>was successfully banned!</gray>" AlreadyDone: "<italic><red>%NAME%</red></italic> <gray>has already been banned!</gray>" Exempt: "<gray>You are not able to ban <red><italic>%NAME%</italic></red></gray>" Layout: - '%PREFIX% <gray>Permanently banned</gray>' - - - "<red>Reason <dark_gray>»</dark_gray></red> <gray>%REASON%</gray>" - '' - '<dark_gray>Unban application in TS or forum</dark_gray>' - "<yellow>TS-Ip <dark_gray>»</dark_gray></yellow> <red><underline>coming soon</underline></red>" - "<yellow>Forum <dark_gray>»</dark_gray></yellow> <red><underline>coming soon</underline></red>" Notification: - "<red><italic>%NAME%</italic></red> <gray>got banned by</gray> <yellow><italic>%OPERATOR%<italic></yellow>" - "<gray>For the reason <italic>%REASON%</italic></gray>" UndoNotification: "<yellow><italic>%OPERATOR%</italic></yellow> <gray>unbanned</gray> <red><italic>%NAME%</italic></red>"
Ipban: Usage: "<red>Usage</red> <dark_gray>»</dark_gray> <gray><italic>/banip (-s) [Name/IP] [Reason/@Layout]</italic></gray>" Layout: - '%PREFIX% <gray>Permanently banned</gray>' - - - "<red>Reason <dark_gray>»</dark_gray></red> <gray>%REASON%</gray>" - '' - '<dark_gray>Unban application in TS or forum</dark_gray>' - "<yellow>TS-Ip <dark_gray>»</dark_gray></yellow> <red><underline>coming soon</underline></red>" - "<yellow>Forum <dark_gray>»</dark_gray></yellow> <red><underline>coming soon</underline></red>" Notification: - "<red><italic>%NAME%</italic></red> <gray>got banned by</gray> <yellow><italic>%OPERATOR%<italic></yellow>" - "<gray>For the reason <italic>%REASON%</italic></gray>" IpNotCashed: "<red>There is no saved IP for <italic>%NAME%!</italic></red>"
Tempban: Usage: "<red>Usage</red> <dark_gray>»</dark_gray> <gray><italic>/tempban (-s) [Name] [Xmo/Xd/Xh/Xm/Xs/#TimeLayout] [Reason/@Layout]</italic></gray>" MaxDuration: "<red>You are not able to ban more than %MAX%sec</red>" Layout: - '%PREFIX% <gray>Temporarily banned</gray>' - - - "<red>Reason <dark_gray>»</dark_gray></red> <gray>%REASON%</gray>" - "<red>Duration <dark_gray>»</dark_gray></red> <gray>%DURATION%</gray>" - '' - '<dark_gray>Unban application in TS or forum</dark_gray>' - "<yellow>TS-Ip <dark_gray>»</dark_gray></yellow> <red><underline>coming soon</underline></red>" - "<yellow>Forum <dark_gray>»</dark_gray></yellow> <red><underline>coming soon</underline></red>" Notification: - "<red><italic>%NAME%</italic></red> <gray>got banned by</gray> <yellow><italic>%OPERATOR%<italic></yellow>" - "<gray>For the reason <italic>%REASON%</italic></gray>" - "<gray><italic>This player got banned for <yellow>DURATION%</yellow></italic></gray>"
Tempipban: Usage: "<red>Usage</red> <dark_gray>»</dark_gray> <gray><italic>/tempipban (-s) [Name/IP] [Xmo/Xd/Xh/Xm/Xs/#TimeLayout] [Reason/@Layout]</italic></gray>" MaxDuration: "<red>You are not able to ban more than %MAX%sec</red>" Layout: - '%PREFIX% <gray>Temporarily banned</gray>' - - - "<red>Reason <dark_gray>»</dark_gray></red> <gray>%REASON%</gray>" - "<red>Duration <dark_gray>»</dark_gray></red> <gray>%DURATION%</gray>" - '' - '<dark_gray>Unban application in TS or forum</dark_gray>' - "<yellow>TS-Ip <dark_gray>»</dark_gray></yellow> <red><underline>coming soon</underline></red>" - "<yellow>Forum <dark_gray>»</dark_gray></yellow> <red><underline>coming soon</underline></red>" Notification: - "<red><italic>%NAME%</italic></red> <gray>got banned by</gray> <yellow><italic>%OPERATOR%<italic></yellow>" - "<gray>For the reason <italic>%REASON%</italic></gray>" - "<gray><italic>This player got banned for <yellow>DURATION%</yellow></italic></gray>"
Mute: Usage: "<red>Usage</red> <dark_gray>»</dark_gray> <gray><italic>/mute (-s) [Name] [Reason/@Layout]</italic></gray>" Done: "<red><italic>%NAME%</italic></red> <gray>was successfully muted!</gray>" AlreadyDone: "<red><italic>%NAME%</italic></red> <gray>has already been muted!</gray>" Exempt: "<gray>You are not able to mute <red><italic>%NAME%</italic></red>" Layout: - '%PREFIX% <gray>You are permanently muted</gray>' - "<red>Reason <dark_gray>»</dark_gray></red> <gray>%REASON%</gray>" Notification: - "<red><italic>%NAME%</italic></red> <gray>got muted by</gray> <yellow><italic>%OPERATOR%</italic></yellow>" - "<gray>For the reason <italic>%REASON%</italic></gray>" UndoNotification: "<yellow><italic>%OPERATOR%</italic></yellow> <gray>unmuted</gray> <red><bold>%NAME%</bold></red>"
Tempmute: Usage: "<red>Usage</red> <dark_gray>»</dark_gray> <gray><italic>/tempmute (-s) [Name] [Xmo/Xd/Xh/Xm/Xs/#TimeLayout] [Reason/@Layout]</italic></gray>" MaxDuration: "<red>You are not able to mute more than %MAX%sec</red>" Layout: - '%PREFIX% <gray>You are muted for %DURATION%</gray>' - "<red>Reason <dark_gray>»</dark_gray></red> <gray>%REASON%</gray>" Notification: - "<red><italic>%NAME%</italic></red> <gray>got muted by</gray> <yellow><italic>%OPERATOR%</italic></yellow>" - "<gray>For the reason <italic>%REASON%</italic></gray>" - "<italic><gray>This player got muted for <yellow>%DURATION%</yellow></gray></italic>"
Warn: Usage: "<red>Usage</red> <dark_gray>»</dark_gray> <gray><italic>/warn (-s) [Name] [Reason/@Layout]</italic></gray>" Done: "<red><italic>%NAME%</italic></red> <gray>was successfully warned!</gray>" Exempt: "<gray>You are not able to warn</gray> <red><italic>%NAME%</italic></red>" Layout: - '%PREFIX% <red>You received a warning</red>' - "<red>Reason</red> <dark_gray>»</dark_gray> <gray>%REASON%</gray>" - '<gray>You have now <red><italic>%COUNT%</italic></red> warning(s) in total!</gray>' Notification: - "<red><italic>%NAME%</italic></red> <gray>got warned by</gray> <yellow><italic>%OPERATOR%</italic></yellow>" - "<gray>For the reason <italic>%REASON%</italic></gray>"
Note: Usage: "<red>Usage</red> <dark_gray>»</dark_gray> <gray><italic>/note (-s) [Name] [Reason]</italic></gray>" Done: "<red><italic>%NAME%</italic></red> <gray>was successfully noted!</gray>" Exempt: "<gray>You are not able to note</gray> <red><italic>%NAME%</italic></red>" Notification: - "<red><italic>%NAME%<italic></red> <gray>got noted by</gray> <yellow><italic>%OPERATOR%</italic></yellow>" - "<gray>For the reason</gray> <italic>%REASON%</italic>"
Tempwarn: Usage: "<red>Usage</red> <dark_gray>»</dark_gray> <gray><italic>/tempwarn (-s) [Name] [Xmo/Xd/Xh/Xm/Xs/#TimeLayout] [Reason/@Layout]</italic></gray>" MaxDuration: "<red>You are not able to warn more than %MAX%sec</red>" Layout: - '%PREFIX% <red>You received a temp-warning</red>' - "<red>Reason</red> <dark_gray>»</dark_gray> <gray>%REASON%</gray>" - "<red>It will pass in</red> <dark_gray>»</dark_gray> <yellow>%DURATION%</yellow>" - '<gray>You have now <red><italic>%COUNT%</italic></red> warning(s) in total!</gray>' Notification: - "<red><italic>%NAME%</italic></red> <gray>got temp-warned by</gray> <yellow><italic>%OPERATOR%</italic></yellow>" - "<gray>For the reason <italic>%REASON%</italic></gray>" - "<gray>This warning will pass in <italic>%DURATION%</italic></gray>"
Kick: Usage: "<red>Usage</red> <dark_gray>»</dark_gray> <gray><italic>/kick (-s) [Name] [Reason/@Layout]</italic></gray>" Done: "<red><italic>%NAME%</italic></red> <gray>was successfully kicked!</gray>" NotOnline: "<red><italic>%NAME%</italic></red> <gray>is not online!</gray>" Exempt: "<gray>You are not able to kick</gray> <red><italic>%NAME%</italic></red>" Layout: - '%PREFIX% <gray>You got kicked</gray>' - - "<red>Reason</red> <dark_gray>»</dark_gray> <gray>%REASON%</gray>" - Notification: - "<red><italic>%NAME%</italic></red> <gray>got kicked by</gray> <yellow><italic>%OPERATOR%<italic></yellow>" - "<gray>For the reason <italic>%REASON%</italic></gray>"
UnBan: Usage: "<red>Usage</red> <dark_gray>»</dark_gray> <gray><italic>/unban [Name/IP]</italic></gray>" NotPunished: "<red><italic>%NAME%</italic> is not banned!</red>" Done: "<green><italic>%NAME%</italic></green> <gray>was successfully unbanned!</gray>" Notification: "<yellow><italic>%OPERATOR%</italic></yellow> <gray>unbanned</gray> <red><italic>%NAME%</italic></red>"
UnMute: Usage: "<red>Usage</red> <dark_gray>»</dark_gray> <gray><italic>/unmute [Name]</italic></gray>" NotPunished: "<red><italic>%NAME%</italic> is not muted!</red>" Done: "<green><italic>%NAME%</italic></green> <gray>was successfully unmuted!</gray>" Notification: "<yellow><italic>%OPERATOR%</italic></yellow> <gray>unmuted</gray> <red><italic>%NAME%</italic></red>"
UnWarn: Usage: "<red>Usage</red> <dark_gray>»</dark_gray> <gray><italic>/unwarn [ID] or /unwarn clear [Name]</italic></gray>" NotFound: "<red>Could not find warning #%ID%</red>" Done: "<gray>Warn <green><italic>#%ID%</italic></green> was successfully deleted!</gray>" Notification: "<yellow><italic>%OPERATOR%</italic></yellow> <gray>unwarned</gray> <red><italic>%NAME%</italic></red>" Clear: Empty: "<red><italic>%NAME%</italic></red> <gray>has no warnings!</gray>" Done: "<gray>Cleared <green><italic>%COUNT%</italic></green> warnings</gray>"
UnNote: Usage: "<red>Usage</red> <dark_gray>»</dark_gray> <gray><italic>/unnote [ID] or /unnote clear [Name]</italic></gray>" NotFound: "<red>Could not find note #%ID%</red>" Done: "<gray>Note <green><italic>#%ID%</italic></green> was successfully deleted!</gray>" Notification: "<yellow><italic>%OPERATOR%</italic></yellow> <gray>unnoted</gray> <red><italic>%NAME%</italic></red>" Clear: Empty: "<red><italic>%NAME%</italic></red> <gray>has no notes!</gray>" Done: "<gray>Cleared <green><italic>%COUNT%</italic></green> notes</gray>"
UnPunish: Usage: "<red>Usage</red> <dark_gray>»</dark_gray> <gray><italic>/unpunish [ID]</italic></gray>" NotFound: "<red>Could not find punishment #%ID%</red>" Done: "<gray>Punishment <green><italic>#%ID%</italic></green> was successfully deleted!</gray>"
Banlist: Usage: "<red>Usage</red> <dark_gray>»</dark_gray> <gray><italic>/banlist (Page)</italic></gray>" OutOfIndex: "<red>There is no page %PAGE%!</red>" NoEntries: "<red><italic>There are no entries</italic></red>" Header: - "%PREFIX% <gray>Banlist:</gray>" - "<red><italic>Player/IP</italic></red> <dark_gray>|</dark_gray> <yellow><italic>Duration</italic></yellow> <dark_gray>|</dark_gray> <gray><italic>Banned by</italic></gray>" - "<red><italic>Type</italic></red> <dark_gray>></dark_gray> <gray><italic>Reason</italic></gray>" - "&7" Entry: - "<dark_gray>[<yellow>%DATE%</yellow>]</dark_gray>" - "<red>%NAME%</red> <dark_gray>|</dark_gray> <yellow>%DURATION%</yellow> <dark_gray>|</dark_gray> <gray>%OPERATOR%</gray>" - "<red>%TYPE%</red> <dark_gray>|</dark_gray> <gray><italic>%REASON%</italic></gray>" - "" Footer: "<gray>Page <yellow><italic>%CURRENT_PAGE%</italic></yellow> of <yellow><italic>%TOTAL_PAGES%</italic></yellow> <dark_gray>|</dark_gray> Listed bans: <yellow><italic>%COUNT%</italic></yellow></gray>" PageFooter: "<gray>Use <yellow><italic>/banlist %NEXT_PAGE%</italic></yellow> to see the next page</gray>"
History: Usage: "<red>Usage</red> <dark_gray>»</dark_gray> <gray><italic>/history [Name/IP] (Page)</italic></gray>" OutOfIndex: "<red>There is no page %PAGE%!</red>" NoEntries: "<red><italic>Could not find the history of %NAME%</italic></red>" Header: - "%PREFIX% <gray>History for %NAME%:</gray>" - "<red><italic>Name</italic></red> <dark_gray>|</dark_gray> <yellow><italic>Duration</italic></yellow> <dark_gray>|</dark_gray> <yellow><italic>Operator</italic></yellow>" - "<red><italic>Type</italic></red> <dark_gray>></dark_gray> <gray><italic>Reason</italic></gray>" - "" Entry: - "<dark_gray>[<yellow>%DATE%</yellow>]</dark_gray>" - "<red>%NAME%</red> <dark_gray>|</dark_gray> <yellow>%DURATION%</yellow> <dark_gray>|</dark_gray> <gray>%OPERATOR%</gray>" - "<red>%TYPE%</red> <dark_gray>|</dark_gray> <gray><italic>%REASON%</italic></gray>" - "" Footer: "<gray>Page <yellow><italic>%CURRENT_PAGE%</italic></yellow> of <yellow><italic>%TOTAL_PAGES%</italic></yellow> <dark_gray>|</dark_gray> Total entries: <yellow><italic>%COUNT%</italic></yellow></gray>" PageFooter: "<gray>Use <yellow><italic>/history %NAME% %NEXT_PAGE%</italic></yellow> to see the next page</gray>"
Warns: Usage: "<red>Usage</red> <dark_gray>»</dark_gray> <gray><italic>/warns [Name] (Page) <red>or</red> /warns (Page)</italic></gray>" OutOfIndex: "<red>There is no page %PAGE%!</red>" NoEntries: "<red><italic>%NAME% has no warnings yet</italic></red>" Header: - "%PREFIX% <gray>Warnings for %NAME%:</gray>" - "<red><italic>Name</italic></red> <dark_gray>|</dark_gray> <yellow><italic>Duration</italic></yellow> <dark_gray>|</dark_gray> <yellow><italic>Operator</italic></yellow>" - "<red><italic>#ID</italic></red> <dark_gray>></dark_gray> <gray><italic>Reason</italic></gray>" - "" Entry: - "<dark_gray>[<yellow>%DATE%</yellow>]</dark_gray>" - "<red>%NAME%</red> <dark_gray>|</dark_gray> <yellow>%DURATION%</yellow> <dark_gray>|</dark_gray> <gray>%OPERATOR%</gray>" - "<red><bold>#%ID%</bold></red> <dark_gray>></dark_gray> <gray><italic>%REASON%</italic></gray>" - "" Footer: "<gray>Page <yellow><italic>%CURRENT_PAGE%</italic></yellow> of <yellow><italic>%TOTAL_PAGES%</italic></yellow> <dark_gray>|</dark_gray> Active warnings: <yellow><italic>%COUNT%</italic></yellow></gray>" PageFooter: "<gray>Use <yellow><italic>/warns %NAME% %NEXT_PAGE%</italic></yellow> to see the next page</gray>"
WarnsOwn: OutOfIndex: "<red>There is no page %PAGE%!</red>" NoEntries: "<red><italic>You has no warnings yet</italic></red>" Header: - "%PREFIX% <gray>Your warnings:</gray>" - "<yellow><italic>Duration</italic></yellow> <dark_gray>|</dark_gray> <gray><italic>Warned by</italic></gray>" - "<red><italic>#ID</italic></red> <dark_gray>></dark_gray> <gray><italic>Reason</italic></gray>" - "" Entry: - "<dark_gray>[<yellow>%DATE%</yellow>]</dark_gray>" - "<red>%NAME%</red> <dark_gray>|</dark_gray> <yellow>%DURATION%</yellow> <dark_gray>|</dark_gray> <gray>%OPERATOR%</gray>" - "<red><bold>#%ID%</bold></red> <dark_gray>></dark_gray> <gray><italic>%REASON%</italic></gray>" - "" Footer: "<gray>Page <yellow><italic>%CURRENT_PAGE%</italic></yellow> of <yellow><italic>%TOTAL_PAGES%</italic></yellow> <dark_gray>|</dark_gray> Active warnings: <yellow><italic>%COUNT%</italic></yellow></gray>" PageFooter: "<gray>Use <yellow><italic>/warns %NEXT_PAGE%</italic></yellow> to see the next page</gray>"
Notes: Usage: "<red>Usage</red> <dark_gray>»</dark_gray> <gray><italic>/notes [Name] (Page) <red>or</red> /notes (Page)</italic></gray>" OutOfIndex: "<red>There is no page %PAGE%!</red>" NoEntries: "<red><italic>%NAME% has no notes yet</italic></red>" Header: - "" - "%PREFIX% <gray>Notes for %NAME%:</gray>" - "" Entry: - "<gray>%DATE% <dark_gray>|</dark_gray> By <italic>%OPERATOR%</italic> (<red>#%ID%</red>)</gray>" - "<dark_gray>></dark_gray> <yellow>%REASON%</yellow>" - "" Footer: "<gray>Page <yellow><italic>%CURRENT_PAGE%</italic></yellow> of <yellow><italic>%TOTAL_PAGES%</italic></yellow> <dark_gray>|</dark_gray> Notes: <yellow><italic>%COUNT%</italic></yellow></gray>" PageFooter: "<gray>Use <yellow><italic>/notes %NAME% %NEXT_PAGE%</italic></yellow> to see the next page</gray>"
NotesOwn: OutOfIndex: "<red>There is no page %PAGE%!</red>" NoEntries: "<red><italic>You has no notes yet</italic></red>" Header: - "" - "%PREFIX% <gray>Your notes:</gray>" - "" Entry: - "<gray>%DATE% <dark_gray>|</dark-gray> By <italic>%OPERATOR%</italic> (<red>#%ID%</red>)</gray>" - "<dark_gray>></dark_gray> <yellow>%REASON%</yellow>" - "" Footer: "<gray>Page <yellow><italic>%CURRENT_PAGE%</italic></yellow> of <yellow><italic>%TOTAL_PAGES%</italic></yellow> <dark_gray>|</dark_gray> Notes: <yellow><italic>%COUNT%</italic></yellow></gray>" PageFooter: "<gray>Use <yellow><italic>/notes %NEXT_PAGE%</italic></yellow> to see the next page</gray>"
ChangeReason: Usage: "<red>Usage</red> <dark_gray>»</dark_gray> <gray><italic>/change-reason [ID or ban/mute USER] [New reason]</italic></gray>" Done: "<gray>Punishment <green><italic>#%ID%</italic></green> has successfully been updated!</gray>" NotFound: "<red>Sorry we have not been able to find this punishment</red>"
Check: Usage: "<red>Usage</red> <dark_gray>»</dark_gray> <gray><italic>/check [Name]</italic></gray>" Header: "<gray>Checking <yellow><italic>%NAME%</italic></yellow> <dark_gray>(%CACHED%)</dark_gray></gray>" UUID: "<red>UUID</red> <dark_gray>»</dark_gray> <gray>%UUID% <dark_gray>(%CACHED%)</dark_gray></gray>" IP: "<red>IP</red> <dark_gray>»</dark_gray> <gray>%IP% <dark_gray>(%CACHED%)</dark_gray></gray>" Geo: "<red>Country</red> <dark_gray>»</dark_gray> <gray>%LOCATION%</gray>" Mute: "<red>Muted</red> <dark_gray>»</dark_gray> <gray>%DURATION%</gray>" MuteReason: " <red>Reason</red> <dark_gray>»</dark_gray> <gray>%REASON%</gray>" Ban: "<red>Banned</red> <dark_gray>»</dark_gray> <gray>%DURATION%</gray>" BanReason: " <red>Reason</red> <dark_gray>»</dark_gray> <gray>%REASON%</gray>" Warn: "<red>Warns</red> <dark_gray>»</dark_gray> <gray>%COUNT%</gray>" Note: "<red>Notes</red> <dark_gray>»</dark_gray> <gray>%COUNT%</gray>" NotFound: "<red>Sorry we have not been able to find %NAME%" Cached: "<green><italic>cached<italic></green>" NotCached: "<red><italic>not cached</italic></red>"
```
Layouts.yml:<br>
Messages:<br> Here, you can define predefined reasons which can be used for (temp-)banning/muting/warning & kicking. You can use them by typing @layoutname instead of the reason. You can also provide a reason after defining the template which will replace the %REASON% variable in the layout.
Time:<br> Here you can define time layouts which can be used for temporary punishments. You can use them by typing #layoutname instead of the duration. The time increases every time a player gets punished with the same layout.
layouts.yml
```
AdvancedBan v3 - Coded by Leoko, Update & Maintained by 2vY (hlpdev)
Normal Color Codes along with MiniMessage (https://docs.advntr.dev/minimessage/format.html) are available in all strings
The default layouts are in the Message.yml file!
Message-Layouts can not only be used for bans but also for mutes and warns
Currently available variables:
%OPERATOR% - The user who dealt the punishment.
%REASON% - Reason for punishment.
%PREFIX% - Prefix set in Message.yml.
%DURATION% - Amount of time left before a punishment expires (will be -1 for permanent punishments).
%DATE% - Date punishment was issued on.
%ID% - Displays the punishment ID (i.e. first punishment = 0, second punishment = 1, third punishment = 2, etc.)
%HEXID% - Displays the punishment ID in base 16.
For warns you have also the variable %COUNT% which will be
replaced with the current amount of warns the player already received
Example usage: /ban Leoko @ExampleLayout
Message: ExampleLayout: - '%PREFIX% &7Banned for Hacking' - '&c&oBanned by %OPERATOR%' - '&7' - "&cIt seems like you are using a" - "&chacked client please disable it!" - "&cUnban in &8» &7%DURATION%" - '&7' - '&8Unban application in TS or forum' - "&eTS-Ip &8» &c&ncoming soon" - "&eForum &8» &c&ncoming soon" ExampleLayout2: - '%PREFIX% &7Banned for offensive language' - '&7' - "&cWe don't tolerate swearing on our server!" - "&cYou got banned for the word '%REASON%'" # You can even use reasons in message layouts
You would use this time-layout for example like this: "/tempban Leoko #ExampleLayout Hacking in FFA"
Or with "/tempwarn Leoko #ExampleLayout Advertising" or even "/tempwarn Leoko #ExampleLayout No capslock please"
You can also combine this with MessageLayouts like "/tempban Leoko #ExampleLayout @Hacking"
Time: ExampleLayout: - '30m' - '2h' - '1d' - '1w' - '1mo' - '2mo' - '4mo' - 'perma' ```

- Ban-, Kick-, Mute- and Warn-System - Excellent performance - BungeeCord & Bukkit/Spigot/Paper plugin all-in-one - Player history - Advanced UUID Support - - Internal or External UUID fetcher - - Backup UUID fetcher if Mojang servers are offline - MySQL or local embedded HyperSQL for storage - Fully customizable - Multiple lines in Kick and Ban messages - Predefined reasons - Automatic time calculation [1st-tempban -> 1h | 2nd-tempban -> 6h, etc] - Custom time offset [change the timezone if the server has incorrect time] - Automatic warn actions - Check command [UUID, IP, Country, Ban/Mute/Warn] - Full MiniMessage formatting support in all layouts & messages

If you have any problems with the plugin, make sure to check the console for any error messages with instructions on how to solve the issue. If you need additional support, please post an issue in our GitHub repository here.

We bStats for recording our metrics which tracks anonymous information about your server (player count, server version, online-mode, etc). The graph below may not be populated as this plugin build has just been released.


The API requires the AdvancedBanX plugin to be installed on the server. When making an addon, make sure to make it clear that the main AdvancedBanX plugin is also required!
Maven
``` <repositories> ...
<repository> <id>hnt8</id> <url>https://java.hnt8.net</url> </repository>
... </repositories>
<dependencies> ...
<dependency> <groupId>net.hnt8.advancedban</groupId> <artifactId>AdvancedBanX</artifactId> <version>3.0.6</version> <scope>provided</scope> </dependency>
... </dependencies> ```