Skip to content

Commit

Permalink
Allow disabling MOTD task and cancel on player logout (EssentialsX#4411)
Browse files Browse the repository at this point in the history
This PR allows setting `delay-motd` to a negative value in `config.yml` to disable the MOTD join task without disabling `/motd`, and fixes an issue where delayed MOTD tasks would run even after a player logged out (in case someone previously set an insanely high MOTD delay to "disable" the MOTD on join).

Fixes EssentialsX#4408.
  • Loading branch information
JRoy authored Aug 9, 2021
1 parent 5334a3f commit 14fbfe3
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@
import java.util.Locale;
import java.util.Map.Entry;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
Expand All @@ -75,6 +77,7 @@
public class EssentialsPlayerListener implements Listener, FakeAccessor {
private static final Logger LOGGER = Logger.getLogger("Essentials");
private final transient IEssentials ess;
private final ConcurrentHashMap<UUID, Integer> pendingMotdTasks = new ConcurrentHashMap<>();

public EssentialsPlayerListener(final IEssentials parent) {
this.ess = parent;
Expand Down Expand Up @@ -216,6 +219,11 @@ public void onPlayerMove(final PlayerMoveEvent event) {
public void onPlayerQuit(final PlayerQuitEvent event) {
final User user = ess.getUser(event.getPlayer());

final Integer pendingId = pendingMotdTasks.remove(user.getUUID());
if (pendingId != null) {
ess.getScheduler().cancelTask(pendingId);
}

if (hideJoinQuitMessages() || (ess.getSettings().allowSilentJoinQuit() && user.isAuthorized("essentials.silentquit"))) {
event.setQuitMessage(null);
} else if (ess.getSettings().isCustomQuitMessage() && event.getQuitMessage() != null) {
Expand Down Expand Up @@ -360,12 +368,14 @@ public void run() {

ess.runTaskAsynchronously(() -> ess.getServer().getPluginManager().callEvent(new AsyncUserDataLoadEvent(user, effectiveMessage)));

final int motdDelay = ess.getSettings().getMotdDelay() / 50;
final DelayMotdTask motdTask = new DelayMotdTask(user);
if (motdDelay > 0) {
ess.scheduleSyncDelayedTask(motdTask, motdDelay);
} else {
motdTask.run();
if (ess.getSettings().getMotdDelay() < 0) {
final int motdDelay = ess.getSettings().getMotdDelay() / 50;
final DelayMotdTask motdTask = new DelayMotdTask(user);
if (motdDelay > 0) {
pendingMotdTasks.put(user.getUUID(), ess.scheduleSyncDelayedTask(motdTask, motdDelay));
} else {
motdTask.run();
}
}

if (!ess.getSettings().isCommandDisabled("mail") && user.isAuthorized("essentials.mail")) {
Expand Down Expand Up @@ -427,6 +437,8 @@ class DelayMotdTask implements Runnable {

@Override
public void run() {
pendingMotdTasks.remove(user.getUUID());

IText tempInput = null;

if (!ess.getSettings().isCommandDisabled("motd")) {
Expand Down
1 change: 1 addition & 0 deletions Essentials/src/main/resources/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -669,6 +669,7 @@ allow-selling-named-items: false

# Delay for the MOTD display for players on join, in milliseconds.
# This has no effect if the MOTD command or permission are disabled.
# This can also be set to -1 to completely disable the join MOTD all together.
delay-motd: 0

# A list of commands that should have their complementary confirm commands enabled by default.
Expand Down

0 comments on commit 14fbfe3

Please # to comment.