From 95bfa6e472c346da9f72ae2add06a6645ced8549 Mon Sep 17 00:00:00 2001 From: ryanhamshire Date: Fri, 1 Jul 2016 10:46:39 -0700 Subject: [PATCH] Silence relog messages. Prevents a player from logging out and then immediately back in from adding low value messages to chat. --- .../GriefPrevention/BroadcastMessageTask.java | 39 +++++++++++++++++++ .../GriefPrevention/GriefPrevention.java | 5 ++- .../GriefPrevention/PlayerEventHandler.java | 30 ++++++++++++++ 3 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 src/me/ryanhamshire/GriefPrevention/BroadcastMessageTask.java diff --git a/src/me/ryanhamshire/GriefPrevention/BroadcastMessageTask.java b/src/me/ryanhamshire/GriefPrevention/BroadcastMessageTask.java new file mode 100644 index 0000000..5079806 --- /dev/null +++ b/src/me/ryanhamshire/GriefPrevention/BroadcastMessageTask.java @@ -0,0 +1,39 @@ +/* + GriefPrevention Server Plugin for Minecraft + Copyright (C) 2016 Ryan Hamshire + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +package me.ryanhamshire.GriefPrevention; + +import org.bukkit.Bukkit; + +//sends a message to all online players +//used to send delayed messages, for example a quit message after the player has been gone a while +class BroadcastMessageTask implements Runnable +{ + private String message; + + public BroadcastMessageTask(String message) + { + this.message = message; + } + + @Override + public void run() + { + Bukkit.getServer().broadcastMessage(this.message); + } +} diff --git a/src/me/ryanhamshire/GriefPrevention/GriefPrevention.java b/src/me/ryanhamshire/GriefPrevention/GriefPrevention.java index c4d71fe..487004d 100644 --- a/src/me/ryanhamshire/GriefPrevention/GriefPrevention.java +++ b/src/me/ryanhamshire/GriefPrevention/GriefPrevention.java @@ -139,6 +139,7 @@ public class GriefPrevention extends JavaPlugin public String config_spam_warningMessage; //message to show a player who is close to spam level public String config_spam_allowedIpAddresses; //IP addresses which will not be censored public int config_spam_deathMessageCooldownSeconds; //cooldown period for death messages (per player) in seconds + public int config_spam_logoutMessageDelaySeconds; //delay before a logout message will be shown (only if the player stays offline that long) HashMap config_pvp_specifiedWorlds; //list of worlds where pvp anti-grief rules apply, according to the config file public boolean config_pvp_protectFreshSpawns; //whether to make newly spawned players immune until they pick up an item @@ -567,7 +568,8 @@ public class GriefPrevention extends JavaPlugin this.config_spam_banMessage = config.getString("GriefPrevention.Spam.BanMessage", "Banned for spam."); String slashCommandsToMonitor = config.getString("GriefPrevention.Spam.MonitorSlashCommands", "/me;/global;/local"); slashCommandsToMonitor = config.getString("GriefPrevention.Spam.ChatSlashCommands", slashCommandsToMonitor); - this.config_spam_deathMessageCooldownSeconds = config.getInt("GriefPrevention.Spam.DeathMessageCooldownSeconds", 120); + this.config_spam_deathMessageCooldownSeconds = config.getInt("GriefPrevention.Spam.DeathMessageCooldownSeconds", 120); + this.config_spam_logoutMessageDelaySeconds = config.getInt("GriefPrevention.Spam.Logout Message Delay In Seconds", 10); this.config_pvp_protectFreshSpawns = config.getBoolean("GriefPrevention.PvP.ProtectFreshSpawns", true); this.config_pvp_punishLogout = config.getBoolean("GriefPrevention.PvP.PunishLogout", true); @@ -809,6 +811,7 @@ public class GriefPrevention extends JavaPlugin outConfig.set("GriefPrevention.Spam.BanMessage", this.config_spam_banMessage); outConfig.set("GriefPrevention.Spam.AllowedIpAddresses", this.config_spam_allowedIpAddresses); outConfig.set("GriefPrevention.Spam.DeathMessageCooldownSeconds", this.config_spam_deathMessageCooldownSeconds); + outConfig.set("GriefPrevention.Spam.Logout Message Delay In Seconds", this.config_spam_logoutMessageDelaySeconds); for(World world : worlds) { diff --git a/src/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java b/src/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java index 54bcac6..8f73cbb 100644 --- a/src/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java +++ b/src/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java @@ -910,6 +910,22 @@ class PlayerEventHandler implements Listener player.teleport(returnLocation); } } + + //if we're holding a logout message for this player, don't send that or this event's join message + if(GriefPrevention.instance.config_spam_logoutMessageDelaySeconds > 0) + { + String joinMessage = event.getJoinMessage(); + if(joinMessage != null && !joinMessage.isEmpty()) + { + Integer taskID = this.heldLogoutMessages.get(player.getUniqueId()); + if(taskID != null && Bukkit.getScheduler().isQueued(taskID)) + { + Bukkit.getScheduler().cancelTask(taskID); + player.sendMessage(event.getJoinMessage()); + event.setJoinMessage(""); + } + } + } } //when a player spawns, conditionally apply temporary pvp protection @@ -964,6 +980,7 @@ class PlayerEventHandler implements Listener } //when a player quits... + private HashMap heldLogoutMessages = new HashMap(); @EventHandler(priority = EventPriority.HIGHEST) void onPlayerQuit(PlayerQuitEvent event) { @@ -1034,6 +1051,19 @@ class PlayerEventHandler implements Listener //drop data about this player this.dataStore.clearCachedPlayerData(playerID); + + //send quit message later, but only if the player stays offline + if(GriefPrevention.instance.config_spam_logoutMessageDelaySeconds > 0) + { + String quitMessage = event.getQuitMessage(); + if(quitMessage != null && !quitMessage.isEmpty()) + { + BroadcastMessageTask task = new BroadcastMessageTask(quitMessage); + int taskID = Bukkit.getScheduler().scheduleSyncDelayedTask(GriefPrevention.instance, task, 20L * GriefPrevention.instance.config_spam_logoutMessageDelaySeconds); + this.heldLogoutMessages.put(playerID, taskID); + event.setQuitMessage(""); + } + } } //determines whether or not a login or logout notification should be silenced, depending on how many there have been in the last minute