By continuing to use this site, you agree to the Terms of Service of this website, including usage of cookies.

OK, Don't show this again

An EPIC moderation plugin to enforce a Reign of Terror on your server
version 2.0.0
Direct Download How to install?
Switch version
1280 Downloads / 3815 Total
11 Reviews
Plugin Description §


Current stable version: 2.0.0

cucumber is a complete moderation plugin for PocketMine-MP which features ban/mute management and logging of various significant events.

Note that cucumber requires a MySQL database to work.

If you are upgrading from v1.6.2, just update the cucumber .phar. Do not delete configuration files, they will automatically be updated and save your settings :-)

Punishment Management

cucumber enables banning of players and IPs, muting and warning.

Command Description Usage Notes
/ban Ban a player by name /ban <player> <duration>|inf [reason] See below for the format of the duration argument
/banlist See the list of bans /banlist [-all|-a] The -all flag specifies that all bans should be displayed, including those that have expired
/pardon Pardon a player /pardon <player> This removes the ban from the player's punishment history and from /banlist -all
/ipban Ban an IP /ipban <player>|<ip> <duration>|inf [reason] You can enter either a player or an IP as the first argument, the plugin will infer which was entered and act accordingly. See below for the format of the duration argumment
/ipbanlist See the list of IP bans /ipbanlist [-all|-a] The -all flag specifies that all IP bans should be displayed, including those that have expired
/ippardon Pardon an IP /ippardon <ip> This removes the IP ban from the player's punishment history and from /ipbanlist -all
/uban Ban any player that joins using an IP. Irreversible /uban <player>|<ip> [reason] Ubans are permanent and cannot be undone, hence they have no duration argument. You can enter either a player or an IP as the first argument, the plugin will infer which was entered and act accordingly
/mute Mute a player /mute <player> <duration>|inf [reason] See below for the format of the duration argument
/mutelist See the list of mutes /mutelist [-all|-a] The -all flag specifies that all mutes should be displayed, including those that have expired
/unmute Unmute a player /unmute <player> This removes the mute from the player's punishment history and from /mutelist -all
/warn Warn a player /warn <player> <duration>|inf [reason] See below for the format of the duration argument
/warnings See a player's warnings /warnings <player> [-all|-a] The -all flag specifies that all of the player's warnings should be displayed, including those that have expired
/mywarnings See your warnings /mywarnings [-all|-a] The -all flag specifies that all of the sender's warnings should be displayed, including those that have expired
/delwarn Delete a specific warning /delwarn <id> Warnings are identified with an ID that should be displayed in /warnings and upon the creation of the warning
/history See a player's punishment history /history <player> This includes expired punishments. It also includes IP bans pertaining to the player's IP. The player's first join and last join dates are also displayed


In a duration argument:

  • y: year
  • M: month
  • w: week
  • d: day
  • h: hour
  • m: minute

For instance, 1y3M means one year and three months (this is the same as 15M). 1w2d12h means one week, two days, and twelve hours (this is the same as 9d12h).

For an infinite duration (a punishment that never expires), you can enter one of the following: inf, infinite, perm, permanent, -1.


cucumber logs various events¹ to a path specified in config.yml. Several loggers (including custom ones) can also be defined in config.yml. (By default, a BaseLogger exists that logs everything to log_out.txt.) Messages are written to the file every 10 seconds asynchronously.

¹ cucumber logs the following: join, join attempt (if a player attempts to join while banned), quit, chat, chat attempt (if a player attempts to chat while muted), command


cucumber also has miscellaneous moderation commands that are not related to punishment management.

Command Description Usage Notes
/rawtell Send a raw message to a player /rawtell <player> <message> [-nomessage|-nom] [-popup|-p] [-title|-t] -nomessage does not send a chat message
-popup sends a popup
-titlesends a title
/log Log a message /log <message> [-severity|-s <severity>] -severity specifies the severity at which to log the message. See below for more informaiton about severities
/alert Broadcast a message to the server /alert <message> [-nomessage|-nom] [-popup|-p] [-title|-t] -nomessage does not send a chat message
-popup sends a popup
-title sends a title
/ip Get a player's IP and their alt accouts /ip <player> This shows every account that has the same IP as the player
/vanish Vanish from other players' sight /vanish


In a severity tag:

  • log: Normal, ordinary events
  • notice: Normal but interesting events
  • important: Significant events
  • alert: Exceptional events that likely require monitoring

If a message is logged at the important severity, for instance, loggers that listen to higher severities (ex. alert) will not pick it up. This is useful if you want to have an alert logger that sends you a Discord notification, for example.

What's new §

Alright, this is a big changelog.


Although v2.0 changes a lot of things, configuration files (config.yml, lang files) do NOT need to be deleted before updating. Just drop the new .phar in, and the plugin will take care of updating them while keeping your old settings.


Punishments now automatically synchronize with the database: you can enforce your iron fist on several servers at once by using the same database for all of them. There will also no longer be database connection timeouts when the server is inactive for too long.

Infinite durations are no longer stored as 2038-01-19T03:14:07. They will no longer actually expire on that date, and will display by default as until the Big Crunch (configurable in the lang files). Note that punishments created before version 2.0.0 will not be updated to the new infinite duration format. The default time format has also been changed to 17:53:45 on September 26 2020, from 2020-09-26T17:53:45.

Punishment histories: it is now possible to view all of a player's punishments (including expired ones) with the /history command. See below.

Warning system: /warn and the associated commands have been added. See below.

We've decided that it was time to infringe on Alias's market share: /ip now shows a list of accounts with the same IP as the specified player.


duration is now a required argument and no longer requires a -d flag. A punishment that never expires has a duration of inf.

  • /ban <player> <duration>|inf [reason]
  • /mute <player> <duration>|inf [reason]

The -player and -ip flags no longer exist for IP ban and uban; cucumber always infers which was entered using a serverless machine learning algorithm.

  • /ipban <player>|<ip> <duration>|inf [reason]
  • /uban <player>|<ip> [reason]

There is a -all flag for punishment list commands to specify that expired punishments should be displayed.

  • /banlist [-all|-a]
  • /ipbanlist [-all|-a]
  • /mutelist [-all|-a]

Warning system!

  • /warn <player> <duration>|inf [reason]
  • /warnings <player> [-all|-a]
  • /mywarnings [-all|-a]

Each warning has a warning ID for easy warning deletion which is displayed on warning creation and in /warnings:

  • /delwarn <id>

Were the previous versions of cucumber not reminiscent enough of 1984 to your taste? Good news, with punishment histories, players will no longer be able to escape your omniscience:

  • /history <player>

This should be a comprehensive list of changes, but check out the README for excruciatingly detailed information.

New features in v1.6.2 (up from v1.5.0)


This patch sends a message to muted players who attempt to chat. It does not require a language file update, as the default mute message (moderation.mute.mute.message) will be used if the chat attempt message ( is not present. The message file version is now 2.1, but only 2.0 is required.


This patch adds support for the French language (fr.yml).


This release adds support for languages. It is a breaking change for message files, so their version has been bumped to 2.0. They are now located at cucumber/lang. A language can be specified in config.yml.


This patch switches over to parsecmd v4.0. Despite the major version bump, this is mostly an internal change and will not change the way the plugin behaves, except for a few bug fixes. This upgrade fixes a minor bug with the duration parser crashing when a duration was not in ascending order (e.g. 15d1M instead of 1M15d). A critical bug where the server would freeze shortly after a punishment save has also been patched. It was caused by a bug with pthreads's garbage collector when scheduling too many libasynql queries at once, which created too many threads. This was fixed by a libasynql update which changed pthreads inheritance settings. The threads were started when the punishment save executed INSERTs and DELETEs for every new/old punishment instead of bulk insertions and deletions. Punishments are now saved when they are set/pardoned, which also fixes a bug where pardoning a player and re-punishing them before the punishment save kicked in would leave the player pardoned after a restart.

New features in v1.5.0 (up from v1.3.1)


With this release, /ipban and /uban will no longer require the player or ip tags. Instead, they will infer whether the provided target is a player or an IP. If it resembles an IP but a player exists whose username is that IP, the sender will be prompted to retype the command and append either the player or ip flag, depending on which they want to ban. If both the player and ip flags are set, the command will ignore both, as this does not remove any ambiguity. The new usage for /ipban is /ipban <target> [reason] [-duration|-d <duration>] [-player|-p] [-ip]. That of /uban is similar, but without the duration flag.


This patch fixes a bug with Player::addSubTitle() not working correctly in /rawtell with the title flag set. Player::addTitle() is now used, with an empty string passed as the first argument.


This patch fixes several bugs by requiring version 3.1.2 of parsecmd.


This release introduces command UIs when a command sender executes a command that does not contain at least the minimum required amount of arguments by using parsecmd v3.1.


This patch upgrades parsecmd to v2.0 internally. It is rendered obsolete by v1.4.0.


This patch gets rid of the CucumberPlayer class (except for CucumberPlayer::getOnlinePlayer()) and instead passes Player instances around.

New features in v1.3.1 (up from v1.2.1)


This patch introduces asynchronous logging for the BaseLogger class. Instead of being logged on the main thread as they come in, messages are now queued and logged asynchronously every 10 seconds. Everything is still the same as before this patch, including correct timestamps (they are calculated when submitting the message, not when writing to the file).


This release implements /vanish, which renders a player invisible from others. Running /vanish while already vanished will toggle the vanish status to off. Quitting while vanished will conserve the vanish status when re-joining.


This release introduces the ability to IP ban and uban players who are offline, using the IP stored in the database. The syntax is the same as for an online player.
Bug fixes have also been made.

Config versions

config.yml: 2.0

messages.yml: 1.3

New features in v1.2.1 (up from v1.0.1)


This patch changes how commands are parsed. is now used for command parsing rather than a custom implementation.


This release adds /uban, which bans any player who joins with the specified IP. This keeps the player banned even after an IP change. However, this is irreversible and cannot be pardoned.
Minor improvements have also be made.


This release adds /ip, which displays a player's IP. It also implements improvements to the logging system, including logging severities and the ability to stop traversing the logger stack when a Logger::log() call returns false. (This is especially useful with custom loggers that log very specific events.)
API versions have also been added for both config.yml and messages.yml as major.minor. If the plugin requires version n.m, only major version n will be accepted, but any minor version greater than or equal to m will be accepted.

Config versions

config.yml: 2.0
messages.yml: 1.1 (1.2 is included with this release)

using v2.0.0
16 Nov 20
salut , je viens de voir que tu etait français , j'ai un problemme , j'arrive pas a me connecter a mon MySql alors que j'ai tout config comme il fallait , j'ai ça en erreur adeynes\cucumber\libs\poggit\libasynql\SqlError: "SQL CONNECT error: The server req
using v2.0.0
09 Oct 20
I put in an sql link but its not connecting
using v2.0.0
04 Oct 20
great plugin, but the /history command does not show expired punishments for me. Also can you make a way to remove /vanish because it interferes with another plugin. Other than that great plugin.
04 Oct 20
Hi, can you make an issue on GH about expired punishments not displaying? I can't reproduce this. I'll be removing /vanish soon, there's no purpose for it in cucumber.
using v2.0.0
27 Sep 20
Add BanClientID :)
27 Sep 20
That doesn't really seem necessary considering that (1) ban by username is very effective with XBL and (2) it would be very easy to bypass
using v1.6.2
27 Aug 20
Plugin Nice, but i dont understand how to connect it to mysql. I have the error Server|CRITICAL > adeynes\cucumber\libs\poggit\libasynql\SqlError: "SQL CONNECT error: Connection refused" (EXCEPTION) in "plugins/cucumber/src/adeynes /cucumber/libs/poggit/l
27 Aug 20
You need to put the correct MySQL credentials in config.yml: host, username, password, database name
using v1.6.2
12 Aug 20
Are you going to make a SQLite? The reason I am am asking is because I can't use a SQL server. If you are doing, this will be a 5, otherwise it is a 4. It seems like a great working system
27 Aug 20
This is planned in the near future.
using v1.6.2
29 Jul 20
update pls
31 Jul 20
That's not a very constructive comment. What requires updating?
using v1.6.2
01 Jan 19
Can you do it, that if you use /vanish, other player can't see the items in your hand?
using v1.6.2
22 Dec 18
Love it, is it possible to remove the /vanish command from it? It interferes with another plugin.
using v1.3.1
09 Aug 18
I like how your going with this plugin, but the plugin has some errors at the moment tho :P
10 Aug 18
Sorry to hear that. What errors are you experiencing? Could you file an issue on GitHub? Thanks
using v1.0.1
07 Aug 18
me like it

Reply to review by :

Supported API versions
Requirements & Enhancements
Password Requirement
Producers §
  • Contributors:
    • @CaptainDuck
  • Translators:
    • @teracube
License §
Admin Tools
Asynchronous tasks
Custom threading

You can leave one review per plugin release, and delete or update your review at any time