Synchronize calls in AsyncPlayerChatEvent listener. Resolves #524

This commit is contained in:
Jerom van der Sar 2015-04-27 00:31:54 +02:00
parent 4fce1109a1
commit 8fc25111e2
8 changed files with 113 additions and 15 deletions

View file

@ -1,3 +1,3 @@
#Build Number for ANT. Do not edit! #Build Number for ANT. Do not edit!
#Sun Apr 26 22:23:22 CEST 2015 #Mon Apr 27 00:31:14 CEST 2015
build.number=990 build.number=991

View file

@ -27,7 +27,8 @@ public class Command_uuid extends TFM_Command
return false; return false;
} }
if ("purge".equals(args[0])) { if ("purge".equals(args[0]))
{
playerMsg("Purged " + TFM_UuidManager.purge() + " cached UUIDs."); playerMsg("Purged " + TFM_UuidManager.purge() + " cached UUIDs.");
return true; return true;
} }

View file

@ -23,6 +23,7 @@ import me.StevenLawson.TotalFreedomMod.TFM_PlayerRank;
import me.StevenLawson.TotalFreedomMod.TFM_RollbackManager; import me.StevenLawson.TotalFreedomMod.TFM_RollbackManager;
import me.StevenLawson.TotalFreedomMod.TFM_RollbackManager.RollbackEntry; import me.StevenLawson.TotalFreedomMod.TFM_RollbackManager.RollbackEntry;
import me.StevenLawson.TotalFreedomMod.TFM_ServerInterface; import me.StevenLawson.TotalFreedomMod.TFM_ServerInterface;
import me.StevenLawson.TotalFreedomMod.TFM_Sync;
import me.StevenLawson.TotalFreedomMod.TFM_Util; import me.StevenLawson.TotalFreedomMod.TFM_Util;
import me.StevenLawson.TotalFreedomMod.TFM_UuidManager; import me.StevenLawson.TotalFreedomMod.TFM_UuidManager;
import me.StevenLawson.TotalFreedomMod.TotalFreedomMod; import me.StevenLawson.TotalFreedomMod.TotalFreedomMod;
@ -558,7 +559,7 @@ public class TFM_PlayerListener implements Listener
final Player player = event.getPlayer(); final Player player = event.getPlayer();
String message = event.getMessage().trim(); String message = event.getMessage().trim();
final TFM_PlayerData playerdata = TFM_PlayerData.getPlayerData(player); final TFM_PlayerData playerdata = TFM_PlayerData.getPlayerDataSync(player);
// Check for spam // Check for spam
final Long lastRan = TFM_Heartbeat.getLastRan(); final Long lastRan = TFM_Heartbeat.getLastRan();
@ -570,8 +571,8 @@ public class TFM_PlayerListener implements Listener
{ {
if (playerdata.incrementAndGetMsgCount() > MSG_PER_HEARTBEAT) if (playerdata.incrementAndGetMsgCount() > MSG_PER_HEARTBEAT)
{ {
TFM_Util.bcastMsg(player.getName() + " was automatically kicked for spamming chat.", ChatColor.RED); TFM_Sync.bcastMsg(player.getName() + " was automatically kicked for spamming chat.", ChatColor.RED);
TFM_Util.autoEject(player, "Kicked for spamming chat."); TFM_Sync.autoEject(player, "Kicked for spamming chat.");
playerdata.resetMsgCount(); playerdata.resetMsgCount();
@ -583,7 +584,7 @@ public class TFM_PlayerListener implements Listener
// Check for message repeat // Check for message repeat
if (playerdata.getLastMessage().equalsIgnoreCase(message)) if (playerdata.getLastMessage().equalsIgnoreCase(message))
{ {
TFM_Util.playerMsg(player, "Please do not repeat messages."); TFM_Sync.playerMsg(player, "Please do not repeat messages.");
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
@ -593,9 +594,9 @@ public class TFM_PlayerListener implements Listener
// Check for muted // Check for muted
if (playerdata.isMuted()) if (playerdata.isMuted())
{ {
if (!TFM_AdminList.isSuperAdmin(player)) if (!TFM_AdminList.isSuperAdminSync(player))
{ {
player.sendMessage(ChatColor.RED + "You are muted, STFU! - You will be unmuted in 5 minutes."); TFM_Sync.playerMsg(player, ChatColor.RED + "You are muted, STFU! - You will be unmuted in 5 minutes.");
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
@ -610,7 +611,7 @@ public class TFM_PlayerListener implements Listener
if (message.length() > 100) if (message.length() > 100)
{ {
message = message.substring(0, 100); message = message.substring(0, 100);
TFM_Util.playerMsg(player, "Message was shortened because it was too long to send."); TFM_Sync.playerMsg(player, "Message was shortened because it was too long to send.");
} }
// Check for caps // Check for caps
@ -633,7 +634,7 @@ public class TFM_PlayerListener implements Listener
// Check for adminchat // Check for adminchat
if (playerdata.inAdminChat()) if (playerdata.inAdminChat())
{ {
TFM_Util.adminChatMessage(player, message, false); TFM_Sync.adminChatMessage(player, message, false);
event.setCancelled(true); event.setCancelled(true);
return; return;
} }

View file

@ -43,7 +43,8 @@ public class TFM_AdminList
seniorConsoleNames = new HashSet<String>(); seniorConsoleNames = new HashSet<String>();
superIps = new HashSet<String>(); superIps = new HashSet<String>();
SUPERADMIN_SERVICE = new Function<Player, Boolean>() { SUPERADMIN_SERVICE = new Function<Player, Boolean>()
{
@Override @Override
public Boolean apply(Player f) public Boolean apply(Player f)
@ -414,6 +415,10 @@ public class TFM_AdminList
return admin != null && admin.isActivated(); return admin != null && admin.isActivated();
} }
public static synchronized boolean isSuperAdminSync(CommandSender sender) {
return isSuperAdmin(sender);
}
public static boolean isSuperAdmin(CommandSender sender) public static boolean isSuperAdmin(CommandSender sender)
{ {
if (!(sender instanceof Player)) if (!(sender instanceof Player))

View file

@ -29,6 +29,14 @@ public class TFM_PlayerData
return PLAYER_DATA.containsKey(TFM_Util.getIp(player)); return PLAYER_DATA.containsKey(TFM_Util.getIp(player));
} }
public static TFM_PlayerData getPlayerDataSync(Player player)
{
synchronized (PLAYER_DATA)
{
return getPlayerData(player);
}
}
public static TFM_PlayerData getPlayerData(Player player) public static TFM_PlayerData getPlayerData(Player player)
{ {
final String ip = TFM_Util.getIp(player); final String ip = TFM_Util.getIp(player);

View file

@ -30,7 +30,8 @@ public class TFM_ServerInterface
{ {
String[] whitelisted = MinecraftServer.getServer().getPlayerList().getWhitelisted(); String[] whitelisted = MinecraftServer.getServer().getPlayerList().getWhitelisted();
int size = whitelisted.length; int size = whitelisted.length;
for (EntityPlayer player : MinecraftServer.getServer().getPlayerList().players) { for (EntityPlayer player : MinecraftServer.getServer().getPlayerList().players)
{
MinecraftServer.getServer().getPlayerList().getWhitelist().remove(player.getProfile()); MinecraftServer.getServer().getPlayerList().getWhitelist().remove(player.getProfile());
} }

View file

@ -0,0 +1,80 @@
package me.StevenLawson.TotalFreedomMod;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
public class TFM_Sync
{
public static void playerMsg(final Player player, final String message)
{
new BukkitRunnable()
{
@Override
public void run()
{
TFM_Util.playerMsg(player, message);
}
}.runTask(TotalFreedomMod.plugin);
}
public static void playerKick(final Player player, final String reason)
{
new BukkitRunnable()
{
@Override
public void run()
{
player.kickPlayer(reason);
}
}.runTask(TotalFreedomMod.plugin);
}
public static void adminChatMessage(final CommandSender sender, final String message, final boolean isRed)
{
new BukkitRunnable()
{
@Override
public void run()
{
TFM_Util.adminChatMessage(sender, message, isRed);
}
}.runTask(TotalFreedomMod.plugin);
}
public static void autoEject(final Player player, final String kickMessage)
{
new BukkitRunnable()
{
@Override
public void run()
{
TFM_Util.autoEject(player, kickMessage);
}
}.runTask(TotalFreedomMod.plugin);
}
public static void bcastMsg(final String message, final ChatColor color)
{
new BukkitRunnable()
{
@Override
public void run()
{
TFM_Util.bcastMsg(message, color);
}
}.runTask(TotalFreedomMod.plugin);
}
}

View file

@ -122,8 +122,10 @@ public class TFM_UuidManager
return generateSpoofUuid(username); return generateSpoofUuid(username);
} }
public static void rawSetUUID(String name, UUID uuid) { public static void rawSetUUID(String name, UUID uuid)
if (name == null || uuid == null || name.isEmpty()) { {
if (name == null || uuid == null || name.isEmpty())
{
TFM_Log.warning("Not setting raw UUID: name and uuid may not be null!"); TFM_Log.warning("Not setting raw UUID: name and uuid may not be null!");
return; return;
} }