Remove some bloat
This commit is contained in:
parent
0e3a2e9791
commit
fdfea84c45
|
|
@ -140,407 +140,6 @@ class PlayerEventHandler implements Listener
|
||||||
bannedWordFinder = new WordFinder(instance.dataStore.loadBannedWords());
|
bannedWordFinder = new WordFinder(instance.dataStore.loadBannedWords());
|
||||||
}
|
}
|
||||||
|
|
||||||
//when a player chats, monitor for spam
|
|
||||||
@EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
|
|
||||||
synchronized void onPlayerChat(AsyncPlayerChatEvent event)
|
|
||||||
{
|
|
||||||
Player player = event.getPlayer();
|
|
||||||
if (!player.isOnline())
|
|
||||||
{
|
|
||||||
event.setCancelled(true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
String message = event.getMessage();
|
|
||||||
|
|
||||||
boolean muted = this.handlePlayerChat(player, message, event);
|
|
||||||
Set<Player> recipients = event.getRecipients();
|
|
||||||
|
|
||||||
//muted messages go out to only the sender
|
|
||||||
if (muted)
|
|
||||||
{
|
|
||||||
recipients.clear();
|
|
||||||
recipients.add(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
//soft muted messages go out to all soft muted players
|
|
||||||
else if (this.dataStore.isSoftMuted(player.getUniqueId()))
|
|
||||||
{
|
|
||||||
String notificationMessage = "(Muted " + player.getName() + "): " + message;
|
|
||||||
Set<Player> recipientsToKeep = new HashSet<>();
|
|
||||||
for (Player recipient : recipients)
|
|
||||||
{
|
|
||||||
if (this.dataStore.isSoftMuted(recipient.getUniqueId()))
|
|
||||||
{
|
|
||||||
recipientsToKeep.add(recipient);
|
|
||||||
}
|
|
||||||
else if (recipient.hasPermission("griefprevention.eavesdrop"))
|
|
||||||
{
|
|
||||||
recipient.sendMessage(ChatColor.GRAY + notificationMessage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
recipients.clear();
|
|
||||||
recipients.addAll(recipientsToKeep);
|
|
||||||
|
|
||||||
GriefPrevention.AddLogEntry(notificationMessage, CustomLogEntryTypes.MutedChat, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
//troll and excessive profanity filter
|
|
||||||
else if (!player.hasPermission("griefprevention.spam") && this.bannedWordFinder.hasMatch(message))
|
|
||||||
{
|
|
||||||
//allow admins to see the soft-muted text
|
|
||||||
String notificationMessage = "(Muted " + player.getName() + "): " + message;
|
|
||||||
for (Player recipient : recipients)
|
|
||||||
{
|
|
||||||
if (recipient.hasPermission("griefprevention.eavesdrop"))
|
|
||||||
{
|
|
||||||
recipient.sendMessage(ChatColor.GRAY + notificationMessage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//limit recipients to sender
|
|
||||||
recipients.clear();
|
|
||||||
recipients.add(player);
|
|
||||||
|
|
||||||
//if player not new warn for the first infraction per play session.
|
|
||||||
if (!GriefPrevention.isNewToServer(player))
|
|
||||||
{
|
|
||||||
PlayerData playerData = instance.dataStore.getPlayerData(player.getUniqueId());
|
|
||||||
if (!playerData.profanityWarned)
|
|
||||||
{
|
|
||||||
playerData.profanityWarned = true;
|
|
||||||
GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoProfanity);
|
|
||||||
event.setCancelled(true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//otherwise assume chat troll and mute all chat from this sender until an admin says otherwise
|
|
||||||
else if (instance.config_trollFilterEnabled)
|
|
||||||
{
|
|
||||||
GriefPrevention.AddLogEntry("Auto-muted new player " + player.getName() + " for profanity shortly after join. Use /SoftMute to undo.", CustomLogEntryTypes.AdminActivity);
|
|
||||||
GriefPrevention.AddLogEntry(notificationMessage, CustomLogEntryTypes.MutedChat, false);
|
|
||||||
instance.dataStore.toggleSoftMute(player.getUniqueId());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//remaining messages
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//enter in abridged chat logs
|
|
||||||
makeSocialLogEntry(player.getName(), message);
|
|
||||||
|
|
||||||
//based on ignore lists, remove some of the audience
|
|
||||||
if (!player.hasPermission("griefprevention.notignorable"))
|
|
||||||
{
|
|
||||||
Set<Player> recipientsToRemove = new HashSet<>();
|
|
||||||
PlayerData playerData = this.dataStore.getPlayerData(player.getUniqueId());
|
|
||||||
for (Player recipient : recipients)
|
|
||||||
{
|
|
||||||
if (!recipient.hasPermission("griefprevention.notignorable"))
|
|
||||||
{
|
|
||||||
if (playerData.ignoredPlayers.containsKey(recipient.getUniqueId()))
|
|
||||||
{
|
|
||||||
recipientsToRemove.add(recipient);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PlayerData targetPlayerData = this.dataStore.getPlayerData(recipient.getUniqueId());
|
|
||||||
if (targetPlayerData.ignoredPlayers.containsKey(player.getUniqueId()))
|
|
||||||
{
|
|
||||||
recipientsToRemove.add(recipient);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
recipients.removeAll(recipientsToRemove);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//returns true if the message should be muted, true if it should be sent
|
|
||||||
private boolean handlePlayerChat(Player player, String message, PlayerEvent event)
|
|
||||||
{
|
|
||||||
//FEATURE: automatically educate players about claiming land
|
|
||||||
//watching for message format how*claim*, and will send a link to the basics video
|
|
||||||
if (this.howToClaimPattern == null)
|
|
||||||
{
|
|
||||||
this.howToClaimPattern = Pattern.compile(this.dataStore.getMessage(Messages.HowToClaimRegex), Pattern.CASE_INSENSITIVE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.howToClaimPattern.matcher(message).matches())
|
|
||||||
{
|
|
||||||
if (instance.creativeRulesApply(player.getLocation()))
|
|
||||||
{
|
|
||||||
GriefPrevention.sendMessage(player, TextMode.Info, Messages.CreativeBasicsVideo2, 10L, DataStore.CREATIVE_VIDEO_URL);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GriefPrevention.sendMessage(player, TextMode.Info, Messages.SurvivalBasicsVideo2, 10L, DataStore.SURVIVAL_VIDEO_URL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//FEATURE: automatically educate players about the /trapped command
|
|
||||||
//check for "trapped" or "stuck" to educate players about the /trapped command
|
|
||||||
String trappedwords = this.dataStore.getMessage(
|
|
||||||
Messages.TrappedChatKeyword
|
|
||||||
);
|
|
||||||
if (!trappedwords.isEmpty())
|
|
||||||
{
|
|
||||||
String[] checkWords = trappedwords.split(";");
|
|
||||||
|
|
||||||
for (String checkWord : checkWords)
|
|
||||||
{
|
|
||||||
if (!message.contains("/trapped")
|
|
||||||
&& message.contains(checkWord))
|
|
||||||
{
|
|
||||||
GriefPrevention.sendMessage(
|
|
||||||
player,
|
|
||||||
TextMode.Info,
|
|
||||||
Messages.TrappedInstructions,
|
|
||||||
10L
|
|
||||||
);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//FEATURE: monitor for chat and command spam
|
|
||||||
|
|
||||||
if (!instance.config_spam_enabled) return false;
|
|
||||||
|
|
||||||
//if the player has permission to spam, don't bother even examining the message
|
|
||||||
if (player.hasPermission("griefprevention.spam")) return false;
|
|
||||||
|
|
||||||
//examine recent messages to detect spam
|
|
||||||
SpamAnalysisResult result = this.spamDetector.AnalyzeMessage(player.getUniqueId(), message, System.currentTimeMillis());
|
|
||||||
|
|
||||||
//apply any needed changes to message (like lowercasing all-caps)
|
|
||||||
if (event instanceof AsyncPlayerChatEvent)
|
|
||||||
{
|
|
||||||
((AsyncPlayerChatEvent) event).setMessage(result.finalMessage);
|
|
||||||
}
|
|
||||||
|
|
||||||
//don't allow new players to chat after logging in until they move
|
|
||||||
PlayerData playerData = this.dataStore.getPlayerData(player.getUniqueId());
|
|
||||||
if (playerData.noChatLocation != null)
|
|
||||||
{
|
|
||||||
Location currentLocation = player.getLocation();
|
|
||||||
if (currentLocation.getBlockX() == playerData.noChatLocation.getBlockX() &&
|
|
||||||
currentLocation.getBlockZ() == playerData.noChatLocation.getBlockZ())
|
|
||||||
{
|
|
||||||
GriefPrevention.sendMessage(player, TextMode.Err, Messages.NoChatUntilMove, 10L);
|
|
||||||
result.muteReason = "pre-movement chat";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
playerData.noChatLocation = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//filter IP addresses
|
|
||||||
if (result.muteReason == null)
|
|
||||||
{
|
|
||||||
if (instance.containsBlockedIP(message))
|
|
||||||
{
|
|
||||||
//block message
|
|
||||||
result.muteReason = "IP address";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//take action based on spam detector results
|
|
||||||
if (result.shouldBanChatter)
|
|
||||||
{
|
|
||||||
if (instance.config_spam_banOffenders)
|
|
||||||
{
|
|
||||||
//log entry
|
|
||||||
GriefPrevention.AddLogEntry("Banning " + player.getName() + " for spam.", CustomLogEntryTypes.AdminActivity);
|
|
||||||
|
|
||||||
//kick and ban
|
|
||||||
PlayerKickBanTask task = new PlayerKickBanTask(player, instance.config_spam_banMessage, "GriefPrevention Anti-Spam", true);
|
|
||||||
instance.getServer().getScheduler().scheduleSyncDelayedTask(instance, task, 1L);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//log entry
|
|
||||||
GriefPrevention.AddLogEntry("Kicking " + player.getName() + " for spam.", CustomLogEntryTypes.AdminActivity);
|
|
||||||
|
|
||||||
//just kick
|
|
||||||
PlayerKickBanTask task = new PlayerKickBanTask(player, "", "GriefPrevention Anti-Spam", false);
|
|
||||||
instance.getServer().getScheduler().scheduleSyncDelayedTask(instance, task, 1L);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (result.shouldWarnChatter)
|
|
||||||
{
|
|
||||||
//warn and log
|
|
||||||
GriefPrevention.sendMessage(player, TextMode.Warn, instance.config_spam_warningMessage, 10L);
|
|
||||||
GriefPrevention.AddLogEntry("Warned " + player.getName() + " about spam penalties.", CustomLogEntryTypes.Debug, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result.muteReason != null)
|
|
||||||
{
|
|
||||||
//mute and log
|
|
||||||
GriefPrevention.AddLogEntry("Muted " + result.muteReason + ".");
|
|
||||||
GriefPrevention.AddLogEntry("Muted " + player.getName() + " " + result.muteReason + ":" + message, CustomLogEntryTypes.Debug, true);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//when a player uses a slash command...
|
|
||||||
@EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
|
|
||||||
synchronized void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event)
|
|
||||||
{
|
|
||||||
String message = event.getMessage();
|
|
||||||
String[] args = message.split(" ");
|
|
||||||
|
|
||||||
String command = args[0].toLowerCase();
|
|
||||||
|
|
||||||
CommandCategory category = this.getCommandCategory(command);
|
|
||||||
|
|
||||||
Player player = event.getPlayer();
|
|
||||||
PlayerData playerData = null;
|
|
||||||
|
|
||||||
//if a whisper
|
|
||||||
if (category == CommandCategory.Whisper && args.length > 1)
|
|
||||||
{
|
|
||||||
//determine target player, might be NULL
|
|
||||||
|
|
||||||
Player targetPlayer = instance.getServer().getPlayer(args[1]);
|
|
||||||
|
|
||||||
//softmute feature
|
|
||||||
if (this.dataStore.isSoftMuted(player.getUniqueId()) && targetPlayer != null && !this.dataStore.isSoftMuted(targetPlayer.getUniqueId()))
|
|
||||||
{
|
|
||||||
event.setCancelled(true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//if eavesdrop enabled and sender doesn't have the eavesdrop immunity permission, eavesdrop
|
|
||||||
if (instance.config_whisperNotifications && !player.hasPermission("griefprevention.eavesdropimmune"))
|
|
||||||
{
|
|
||||||
//except for when the recipient has eavesdrop immunity
|
|
||||||
if (targetPlayer == null || !targetPlayer.hasPermission("griefprevention.eavesdropimmune"))
|
|
||||||
{
|
|
||||||
StringBuilder logMessageBuilder = new StringBuilder();
|
|
||||||
logMessageBuilder.append("[[").append(event.getPlayer().getName()).append("]] ");
|
|
||||||
|
|
||||||
for (int i = 1; i < args.length; i++)
|
|
||||||
{
|
|
||||||
logMessageBuilder.append(args[i]).append(" ");
|
|
||||||
}
|
|
||||||
|
|
||||||
String logMessage = logMessageBuilder.toString();
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
Collection<Player> players = (Collection<Player>) instance.getServer().getOnlinePlayers();
|
|
||||||
for (Player onlinePlayer : players)
|
|
||||||
{
|
|
||||||
if (onlinePlayer.hasPermission("griefprevention.eavesdrop") && !onlinePlayer.equals(targetPlayer) && !onlinePlayer.equals(player))
|
|
||||||
{
|
|
||||||
onlinePlayer.sendMessage(ChatColor.GRAY + logMessage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//ignore feature
|
|
||||||
if (targetPlayer != null && targetPlayer.isOnline())
|
|
||||||
{
|
|
||||||
//if either is ignoring the other, cancel this command
|
|
||||||
playerData = this.dataStore.getPlayerData(player.getUniqueId());
|
|
||||||
if (playerData.ignoredPlayers.containsKey(targetPlayer.getUniqueId()) && !targetPlayer.hasPermission("griefprevention.notignorable"))
|
|
||||||
{
|
|
||||||
event.setCancelled(true);
|
|
||||||
GriefPrevention.sendMessage(player, TextMode.Err, Messages.IsIgnoringYou);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
PlayerData targetPlayerData = this.dataStore.getPlayerData(targetPlayer.getUniqueId());
|
|
||||||
if (targetPlayerData.ignoredPlayers.containsKey(player.getUniqueId()) && !player.hasPermission("griefprevention.notignorable"))
|
|
||||||
{
|
|
||||||
event.setCancelled(true);
|
|
||||||
GriefPrevention.sendMessage(player, TextMode.Err, Messages.IsIgnoringYou);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//if in pvp, block any pvp-banned slash commands
|
|
||||||
if (playerData == null) playerData = this.dataStore.getPlayerData(event.getPlayer().getUniqueId());
|
|
||||||
|
|
||||||
if ((playerData.inPvpCombat() || playerData.siegeData != null) && instance.config_pvp_blockedCommands.contains(command))
|
|
||||||
{
|
|
||||||
event.setCancelled(true);
|
|
||||||
GriefPrevention.sendMessage(event.getPlayer(), TextMode.Err, Messages.CommandBannedInPvP);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//soft mute for chat slash commands
|
|
||||||
if (category == CommandCategory.Chat && this.dataStore.isSoftMuted(player.getUniqueId()))
|
|
||||||
{
|
|
||||||
event.setCancelled(true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//if the slash command used is in the list of monitored commands, treat it like a chat message (see above)
|
|
||||||
boolean isMonitoredCommand = (category == CommandCategory.Chat || category == CommandCategory.Whisper);
|
|
||||||
if (isMonitoredCommand)
|
|
||||||
{
|
|
||||||
//if anti spam enabled, check for spam
|
|
||||||
if (instance.config_spam_enabled)
|
|
||||||
{
|
|
||||||
event.setCancelled(this.handlePlayerChat(event.getPlayer(), event.getMessage(), event));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!player.hasPermission("griefprevention.spam") && this.bannedWordFinder.hasMatch(message))
|
|
||||||
{
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
//unless cancelled, log in abridged logs
|
|
||||||
if (!event.isCancelled())
|
|
||||||
{
|
|
||||||
StringBuilder builder = new StringBuilder();
|
|
||||||
for (String arg : args)
|
|
||||||
{
|
|
||||||
builder.append(arg).append(' ');
|
|
||||||
}
|
|
||||||
|
|
||||||
makeSocialLogEntry(event.getPlayer().getName(), builder.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//if requires access trust, check for permission
|
|
||||||
isMonitoredCommand = false;
|
|
||||||
String lowerCaseMessage = message.toLowerCase();
|
|
||||||
for (String monitoredCommand : instance.config_claims_commandsRequiringAccessTrust)
|
|
||||||
{
|
|
||||||
if (lowerCaseMessage.startsWith(monitoredCommand))
|
|
||||||
{
|
|
||||||
isMonitoredCommand = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isMonitoredCommand)
|
|
||||||
{
|
|
||||||
Claim claim = this.dataStore.getClaimAt(player.getLocation(), false, playerData.lastClaim);
|
|
||||||
if (claim != null)
|
|
||||||
{
|
|
||||||
playerData.lastClaim = claim;
|
|
||||||
Supplier<String> reason = claim.checkPermission(player, ClaimPermission.Access, event);
|
|
||||||
if (reason != null)
|
|
||||||
{
|
|
||||||
GriefPrevention.sendMessage(player, TextMode.Err, reason.get());
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private final ConcurrentHashMap<String, CommandCategory> commandCategoryMap = new ConcurrentHashMap<>();
|
private final ConcurrentHashMap<String, CommandCategory> commandCategoryMap = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
private CommandCategory getCommandCategory(String commandName)
|
private CommandCategory getCommandCategory(String commandName)
|
||||||
|
|
@ -624,53 +223,6 @@ class PlayerEventHandler implements Listener
|
||||||
|
|
||||||
private final ConcurrentHashMap<UUID, Date> lastLoginThisServerSessionMap = new ConcurrentHashMap<>();
|
private final ConcurrentHashMap<UUID, Date> lastLoginThisServerSessionMap = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
//when a player attempts to join the server...
|
|
||||||
@EventHandler(priority = EventPriority.HIGHEST)
|
|
||||||
void onPlayerLogin(PlayerLoginEvent event)
|
|
||||||
{
|
|
||||||
Player player = event.getPlayer();
|
|
||||||
|
|
||||||
//all this is anti-spam code
|
|
||||||
if (instance.config_spam_enabled)
|
|
||||||
{
|
|
||||||
//FEATURE: login cooldown to prevent login/logout spam with custom clients
|
|
||||||
long now = Calendar.getInstance().getTimeInMillis();
|
|
||||||
|
|
||||||
//if allowed to join and login cooldown enabled
|
|
||||||
if (instance.config_spam_loginCooldownSeconds > 0 && event.getResult() == Result.ALLOWED && !player.hasPermission("griefprevention.spam"))
|
|
||||||
{
|
|
||||||
//determine how long since last login and cooldown remaining
|
|
||||||
Date lastLoginThisSession = lastLoginThisServerSessionMap.get(player.getUniqueId());
|
|
||||||
if (lastLoginThisSession != null)
|
|
||||||
{
|
|
||||||
long millisecondsSinceLastLogin = now - lastLoginThisSession.getTime();
|
|
||||||
long secondsSinceLastLogin = millisecondsSinceLastLogin / 1000;
|
|
||||||
long cooldownRemaining = instance.config_spam_loginCooldownSeconds - secondsSinceLastLogin;
|
|
||||||
|
|
||||||
//if cooldown remaining
|
|
||||||
if (cooldownRemaining > 0)
|
|
||||||
{
|
|
||||||
//DAS BOOT!
|
|
||||||
event.setResult(Result.KICK_OTHER);
|
|
||||||
event.setKickMessage("You must wait " + cooldownRemaining + " seconds before logging-in again.");
|
|
||||||
event.disallow(event.getResult(), event.getKickMessage());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//if logging-in account is banned, remember IP address for later
|
|
||||||
if (instance.config_smartBan && event.getResult() == Result.KICK_BANNED)
|
|
||||||
{
|
|
||||||
this.tempBannedIps.add(new IpBanInfo(event.getAddress(), now + this.MILLISECONDS_IN_DAY, player.getName()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//remember the player's ip address
|
|
||||||
PlayerData playerData = this.dataStore.getPlayerData(player.getUniqueId());
|
|
||||||
playerData.ipAddress = event.getAddress();
|
|
||||||
}
|
|
||||||
|
|
||||||
//when a player successfully joins the server...
|
//when a player successfully joins the server...
|
||||||
|
|
||||||
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
|
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user