diff --git a/src/main/java/fr/xephi/authme/cache/auth/PlayerCache.java b/src/main/java/fr/xephi/authme/cache/auth/PlayerCache.java index 5908b5d9..a517c756 100644 --- a/src/main/java/fr/xephi/authme/cache/auth/PlayerCache.java +++ b/src/main/java/fr/xephi/authme/cache/auth/PlayerCache.java @@ -1,14 +1,14 @@ package fr.xephi.authme.cache.auth; -import java.util.HashMap; +import java.util.concurrent.ConcurrentHashMap; public class PlayerCache { private static PlayerCache singleton = null; - private HashMap cache; + private ConcurrentHashMap cache; private PlayerCache() { - cache = new HashMap(); + cache = new ConcurrentHashMap(); } public void addPlayer(PlayerAuth auth) { diff --git a/src/main/java/fr/xephi/authme/cache/limbo/LimboCache.java b/src/main/java/fr/xephi/authme/cache/limbo/LimboCache.java index 10631d49..c09c27b3 100644 --- a/src/main/java/fr/xephi/authme/cache/limbo/LimboCache.java +++ b/src/main/java/fr/xephi/authme/cache/limbo/LimboCache.java @@ -1,6 +1,6 @@ package fr.xephi.authme.cache.limbo; -import java.util.HashMap; +import java.util.concurrent.ConcurrentHashMap; import org.bukkit.Bukkit; import org.bukkit.GameMode; @@ -18,13 +18,13 @@ import fr.xephi.authme.settings.Settings; public class LimboCache { private static LimboCache singleton = null; - public HashMap cache; + public ConcurrentHashMap cache; private FileCache playerData; public AuthMe plugin; private LimboCache(AuthMe plugin) { this.plugin = plugin; - this.cache = new HashMap(); + this.cache = new ConcurrentHashMap(); this.playerData = new FileCache(plugin); } @@ -52,9 +52,8 @@ public class LimboCache { playerGroup = playerData.readCache(player).getGroup(); operator = playerData.readCache(player).getOperator(); flying = playerData.readCache(player).isFlying(); - } catch (Exception e) - { - ConsoleLogger.showError("Some error on reading cache of " + name); + } catch (Exception e) { + ConsoleLogger.showError("Some error on reading cache of " + name); } } else { StoreInventoryEvent event = new StoreInventoryEvent(player); diff --git a/src/main/java/fr/xephi/authme/commands/LogoutCommand.java b/src/main/java/fr/xephi/authme/commands/LogoutCommand.java index 134e8d56..cb05b4de 100644 --- a/src/main/java/fr/xephi/authme/commands/LogoutCommand.java +++ b/src/main/java/fr/xephi/authme/commands/LogoutCommand.java @@ -1,138 +1,45 @@ -package fr.xephi.authme.commands; - -import me.muizers.Notifications.Notification; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; -import org.bukkit.scheduler.BukkitScheduler; -import org.bukkit.scheduler.BukkitTask; - -import fr.xephi.authme.AuthMe; -import fr.xephi.authme.ConsoleLogger; -import fr.xephi.authme.Utils; -import fr.xephi.authme.Utils.groupType; -import fr.xephi.authme.cache.auth.PlayerAuth; -import fr.xephi.authme.cache.auth.PlayerCache; -import fr.xephi.authme.cache.backup.DataFileCache; -import fr.xephi.authme.cache.backup.FileCache; -import fr.xephi.authme.cache.limbo.LimboCache; -import fr.xephi.authme.datasource.DataSource; -import fr.xephi.authme.events.AuthMeTeleportEvent; -import fr.xephi.authme.events.LogoutEvent; -import fr.xephi.authme.settings.Messages; -import fr.xephi.authme.settings.Settings; -import fr.xephi.authme.task.MessageTask; -import fr.xephi.authme.task.TimeoutTask; - -public class LogoutCommand implements CommandExecutor { - - private Messages m = Messages.getInstance(); - private AuthMe plugin; - private DataSource database; - private Utils utils = Utils.getInstance(); - private FileCache playerBackup; - - public LogoutCommand(AuthMe plugin, DataSource database) { - this.plugin = plugin; - this.database = database; - this.playerBackup = new FileCache(plugin); - } - - @Override - public boolean onCommand(CommandSender sender, Command cmnd, String label, - String[] args) { - if (!(sender instanceof Player)) { - return true; - } - - if (!plugin.authmePermissible(sender, "authme." + label.toLowerCase())) { - m.send(sender, "no_perm"); - return true; - } - - final Player player = (Player) sender; - String name = player.getName().toLowerCase(); - - if (!PlayerCache.getInstance().isAuthenticated(name)) { - m.send(player, "not_logged_in"); - return true; - } - - PlayerAuth auth = PlayerCache.getInstance().getAuth(name); - if (Settings.isSessionsEnabled) - auth.setLastLogin(0L); - database.updateSession(auth); - auth.setQuitLocX(player.getLocation().getX()); - auth.setQuitLocY(player.getLocation().getY()); - auth.setQuitLocZ(player.getLocation().getZ()); - auth.setWorld(player.getWorld().getName()); - database.updateQuitLoc(auth); - - PlayerCache.getInstance().removePlayer(name); - database.setUnlogged(name); - - if (Settings.isTeleportToSpawnEnabled && !Settings.noTeleport) { - Location spawnLoc = plugin.getSpawnLocation(player); - AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent(player, spawnLoc); - plugin.getServer().getPluginManager().callEvent(tpEvent); - if (!tpEvent.isCancelled()) { - if (tpEvent.getTo() != null) - player.teleport(tpEvent.getTo()); - } - } - - if (LimboCache.getInstance().hasLimboPlayer(name)) - LimboCache.getInstance().deleteLimboPlayer(name); - LimboCache.getInstance().addLimboPlayer(player); - utils.setGroup(player, groupType.NOTLOGGEDIN); - if (Settings.protectInventoryBeforeLogInEnabled) { - player.getInventory().clear(); - // create cache file for handling lost of inventories on unlogged in - // status - DataFileCache playerData = new DataFileCache(LimboCache.getInstance().getLimboPlayer(name).getInventory(), LimboCache.getInstance().getLimboPlayer(name).getArmour()); - if (playerData != null) - playerBackup.createCache(player, playerData, LimboCache.getInstance().getLimboPlayer(name).getGroup(), LimboCache.getInstance().getLimboPlayer(name).getOperator(), LimboCache.getInstance().getLimboPlayer(name).isFlying()); - } - - int delay = Settings.getRegistrationTimeout * 20; - int interval = Settings.getWarnMessageInterval; - BukkitScheduler sched = sender.getServer().getScheduler(); - if (delay != 0) { - BukkitTask id = sched.runTaskLater(plugin, new TimeoutTask(plugin, name), delay); - LimboCache.getInstance().getLimboPlayer(name).setTimeoutTaskId(id); - } - BukkitTask msgT = sched.runTask(plugin, new MessageTask(plugin, name, m.send("login_msg"), interval)); - LimboCache.getInstance().getLimboPlayer(name).setMessageTaskId(msgT); - try { - if (player.isInsideVehicle()) - player.getVehicle().eject(); - } catch (NullPointerException npe) { - } - if (Settings.applyBlindEffect) - player.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, Settings.getRegistrationTimeout * 20, 2)); - player.setOp(false); - player.setAllowFlight(true); - player.setFlying(true); - // Player is now logout... Time to fire event ! - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { - - @Override - public void run() { - Bukkit.getServer().getPluginManager().callEvent(new LogoutEvent(player)); - } - }); - m.send(player, "logout"); - ConsoleLogger.info(player.getDisplayName() + " logged out"); - if (plugin.notifications != null) { - plugin.notifications.showNotification(new Notification("[AuthMe] " + player.getName() + " logged out!")); - } - return true; - } - -} +package fr.xephi.authme.commands; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.Utils; +import fr.xephi.authme.cache.backup.FileCache; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.settings.Messages; + +public class LogoutCommand implements CommandExecutor { + + private Messages m = Messages.getInstance(); + private AuthMe plugin; + private DataSource database; + private Utils utils = Utils.getInstance(); + private FileCache playerBackup; + + public LogoutCommand(AuthMe plugin, DataSource database) { + this.plugin = plugin; + this.database = database; + this.playerBackup = new FileCache(plugin); + } + + @Override + public boolean onCommand(CommandSender sender, Command cmnd, String label, + String[] args) { + if (!(sender instanceof Player)) { + return true; + } + + if (!plugin.authmePermissible(sender, "authme." + label.toLowerCase())) { + m.send(sender, "no_perm"); + return true; + } + + final Player player = (Player) sender; + plugin.management.performLogout(player); + return true; + } + +} diff --git a/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener.java b/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener.java index 78d145d8..0ca95f29 100644 --- a/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener.java +++ b/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener.java @@ -6,9 +6,8 @@ import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Collection; -import java.util.Date; -import java.util.HashMap; import java.util.List; +import java.util.concurrent.ConcurrentHashMap; import java.util.regex.PatternSyntaxException; import org.bukkit.Bukkit; @@ -37,51 +36,35 @@ import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerPickupItemEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerRespawnEvent; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; -import org.bukkit.scheduler.BukkitScheduler; -import org.bukkit.scheduler.BukkitTask; import fr.xephi.authme.AuthMe; import fr.xephi.authme.ConsoleLogger; import fr.xephi.authme.Utils; -import fr.xephi.authme.Utils.groupType; import fr.xephi.authme.api.API; import fr.xephi.authme.cache.auth.PlayerAuth; import fr.xephi.authme.cache.auth.PlayerCache; -import fr.xephi.authme.cache.backup.DataFileCache; -import fr.xephi.authme.cache.backup.FileCache; import fr.xephi.authme.cache.limbo.LimboCache; import fr.xephi.authme.cache.limbo.LimboPlayer; import fr.xephi.authme.datasource.DataSource; -import fr.xephi.authme.events.AuthMeTeleportEvent; -import fr.xephi.authme.events.ProtectInventoryEvent; -import fr.xephi.authme.events.RestoreInventoryEvent; -import fr.xephi.authme.events.SessionEvent; -import fr.xephi.authme.events.SpawnTeleportEvent; import fr.xephi.authme.plugin.manager.CombatTagComunicator; import fr.xephi.authme.settings.Messages; import fr.xephi.authme.settings.Settings; -import fr.xephi.authme.task.MessageTask; -import fr.xephi.authme.task.TimeoutTask; public class AuthMePlayerListener implements Listener { public static GameMode gm = GameMode.SURVIVAL; - public static HashMap gameMode = new HashMap(); - public static HashMap joinMessage = new HashMap(); + public static ConcurrentHashMap gameMode = new ConcurrentHashMap(); + public static ConcurrentHashMap joinMessage = new ConcurrentHashMap(); private Utils utils = Utils.getInstance(); private Messages m = Messages.getInstance(); public AuthMe plugin; private DataSource data; - private FileCache playerBackup; - public static HashMap causeByAuthMe = new HashMap(); + public static ConcurrentHashMap causeByAuthMe = new ConcurrentHashMap(); private List antibot = new ArrayList(); public AuthMePlayerListener(AuthMe plugin, DataSource data) { this.plugin = plugin; this.data = data; - this.playerBackup = new FileCache(plugin); } @EventHandler(priority = EventPriority.LOWEST) @@ -460,15 +443,12 @@ public class AuthMePlayerListener implements Listener { return; } - if (data.isAuthAvailable(name) && !LimboCache.getInstance().hasLimboPlayer(name)) { - if (!Settings.isSessionsEnabled) { - } else if (PlayerCache.getInstance().isAuthenticated(name)) { - if (!Settings.sessionExpireOnIpChange) - if (LimboCache.getInstance().hasLimboPlayer(player.getName().toLowerCase())) { + if (data.isAuthAvailable(name) && LimboCache.getInstance().hasLimboPlayer(name)) + if (Settings.isSessionsEnabled) + if (PlayerCache.getInstance().isAuthenticated(name)) + if (!Settings.sessionExpireOnIpChange) LimboCache.getInstance().deleteLimboPlayer(name); - } - } - } + // Check if forceSingleSession is set to true, so kick player that has // joined with same nick of online player if (player.isOnline() && Settings.isForceSingleSessionEnabled) { @@ -578,188 +558,9 @@ public class AuthMePlayerListener implements Listener { return; } Player player = event.getPlayer(); - final String name = player.getName().toLowerCase(); - gm = player.getGameMode(); - gameMode.put(name, gm); - BukkitScheduler sched = plugin.getServer().getScheduler(); + String name = player.getName().toLowerCase(); - if (plugin.getCitizensCommunicator().isNPC(player, plugin) || Utils.getInstance().isUnrestricted(player) || CombatTagComunicator.isNPC(player)) { - return; - } - - if (plugin.ess != null && Settings.disableSocialSpy) { - try { - plugin.ess.getUser(player.getName().toLowerCase()).setSocialSpyEnabled(false); - } catch (Exception e) { - } catch (NoSuchMethodError e) { - } - } - - String ip = plugin.getIP(player); - if (Settings.isAllowRestrictedIp && !Settings.getRestrictedIp(name, ip)) { - GameMode gM = gameMode.get(name); - causeByAuthMe.put(name, true); - player.setGameMode(gM); - causeByAuthMe.put(name, false); - player.kickPlayer("You are not the Owner of this account, please try another name!"); - if (Settings.banUnsafeIp) - plugin.getServer().banIP(ip); - return; - } - if (Settings.getMaxJoinPerIp > 0 && !plugin.authmePermissible(player, "authme.allow2accounts") && !ip.equalsIgnoreCase("127.0.0.1") && !ip.equalsIgnoreCase("localhost")) { - if (plugin.hasJoinedIp(player.getName(), ip)) { - player.kickPlayer("A player with the same IP is already in game!"); - return; - } - } - Location spawnLoc = plugin.getSpawnLocation(player); - if (data.isAuthAvailable(name)) { - if (Settings.isSessionsEnabled) { - PlayerAuth auth = data.getAuth(name); - long timeout = Settings.getSessionTimeout * 60000; - long lastLogin = auth.getLastLogin(); - long cur = new Date().getTime(); - if ((cur - lastLogin < timeout || timeout == 0) && !auth.getIp().equals("198.18.0.1")) { - if (auth.getNickname().equalsIgnoreCase(name) && auth.getIp().equals(ip)) { - if (PlayerCache.getInstance().getAuth(name) != null) { - PlayerCache.getInstance().updatePlayer(auth); - } else { - PlayerCache.getInstance().addPlayer(auth); - data.setLogged(name); - } - m.send(player, "valid_session"); - // Restore Permission Group - utils.setGroup(player, Utils.groupType.LOGGEDIN); - plugin.getServer().getPluginManager().callEvent(new SessionEvent(auth, true)); - return; - } else if (!Settings.sessionExpireOnIpChange) { - GameMode gM = gameMode.get(name); - causeByAuthMe.put(name, true); - player.setGameMode(gM); - causeByAuthMe.put(name, false); - player.kickPlayer(m.send("unvalid_session")[0]); - return; - } else if (auth.getNickname().equalsIgnoreCase(name)) { - if (Settings.isForceSurvivalModeEnabled && !Settings.forceOnlyAfterLogin) { - causeByAuthMe.put(name, true); - Utils.forceGM(player); - causeByAuthMe.put(name, false); - } - // Player change his IP between 2 relog-in - PlayerCache.getInstance().removePlayer(name); - data.setUnlogged(name); - } else { - GameMode gM = gameMode.get(name); - causeByAuthMe.put(name, true); - player.setGameMode(gM); - causeByAuthMe.put(name, false); - player.kickPlayer(m.send("unvalid_session")[0]); - return; - } - } else { - // Session is ended correctly - PlayerCache.getInstance().removePlayer(name); - data.setUnlogged(name); - } - } - // isent in session or session was ended correctly - if (Settings.isForceSurvivalModeEnabled && !Settings.forceOnlyAfterLogin) { - causeByAuthMe.put(name, true); - Utils.forceGM(player); - causeByAuthMe.put(name, false); - } - if (!Settings.noTeleport) - if (Settings.isTeleportToSpawnEnabled || (Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName()))) { - SpawnTeleportEvent tpEvent = new SpawnTeleportEvent(player, player.getLocation(), spawnLoc, PlayerCache.getInstance().isAuthenticated(name)); - plugin.getServer().getPluginManager().callEvent(tpEvent); - if (!tpEvent.isCancelled()) { - if (player != null && player.isOnline() && tpEvent.getTo() != null) { - if (tpEvent.getTo().getWorld() != null) - player.teleport(tpEvent.getTo()); - } - } - } - placePlayerSafely(player, spawnLoc); - LimboCache.getInstance().updateLimboPlayer(player); - try { - DataFileCache dataFile = new DataFileCache(LimboCache.getInstance().getLimboPlayer(name).getInventory(), LimboCache.getInstance().getLimboPlayer(name).getArmour()); - playerBackup.createCache(player, dataFile, LimboCache.getInstance().getLimboPlayer(name).getGroup(), LimboCache.getInstance().getLimboPlayer(name).getOperator(), LimboCache.getInstance().getLimboPlayer(name).isFlying()); - } catch (Exception e) { - ConsoleLogger.showError("Error on creating an inventory cache for " + name + ", maybe inventory wipe in preparation..."); - } - } else { - if (Settings.isForceSurvivalModeEnabled && !Settings.forceOnlyAfterLogin) { - causeByAuthMe.put(name, true); - Utils.forceGM(player); - causeByAuthMe.put(name, false); - } - if (!Settings.unRegisteredGroup.isEmpty()) { - utils.setGroup(player, Utils.groupType.UNREGISTERED); - } - if (!Settings.isForcedRegistrationEnabled) { - return; - } - if (!Settings.noTeleport) - if (Settings.isTeleportToSpawnEnabled || (Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName()))) { - SpawnTeleportEvent tpEvent = new SpawnTeleportEvent(player, player.getLocation(), spawnLoc, PlayerCache.getInstance().isAuthenticated(name)); - plugin.getServer().getPluginManager().callEvent(tpEvent); - if (!tpEvent.isCancelled()) { - if (player != null && player.isOnline() && tpEvent.getTo() != null) { - if (tpEvent.getTo().getWorld() != null) - player.teleport(tpEvent.getTo()); - } - } - } - - } - if (Settings.protectInventoryBeforeLogInEnabled) { - try { - LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(player.getName().toLowerCase()); - ProtectInventoryEvent ev = new ProtectInventoryEvent(player, limbo.getInventory(), limbo.getArmour()); - plugin.getServer().getPluginManager().callEvent(ev); - if (ev.isCancelled()) { - if (!Settings.noConsoleSpam) - ConsoleLogger.info("ProtectInventoryEvent has been cancelled for " + player.getName() + " ..."); - } else { - API.setPlayerInventory(player, ev.getEmptyInventory(), ev.getEmptyArmor()); - } - } catch (NullPointerException ex) { - } - } - String[] msg; - if (Settings.emailRegistration) { - msg = data.isAuthAvailable(name) ? m.send("login_msg") : m.send("reg_email_msg"); - } else { - msg = data.isAuthAvailable(name) ? m.send("login_msg") : m.send("reg_msg"); - } - int time = Settings.getRegistrationTimeout * 20; - int msgInterval = Settings.getWarnMessageInterval; - if (time != 0) { - BukkitTask id = sched.runTaskLater(plugin, new TimeoutTask(plugin, name), time); - if (!LimboCache.getInstance().hasLimboPlayer(name)) - LimboCache.getInstance().addLimboPlayer(player); - LimboCache.getInstance().getLimboPlayer(name).setTimeoutTaskId(id); - } - if (!LimboCache.getInstance().hasLimboPlayer(name)) - LimboCache.getInstance().addLimboPlayer(player); - if (data.isAuthAvailable(name)) { - utils.setGroup(player, groupType.NOTLOGGEDIN); - } else { - utils.setGroup(player, groupType.UNREGISTERED); - } - if (player.isOp()) - player.setOp(false); - if (!Settings.isMovementAllowed) { - player.setAllowFlight(true); - player.setFlying(true); - } - BukkitTask msgT = sched.runTask(plugin, new MessageTask(plugin, name, msg, msgInterval)); - LimboCache.getInstance().getLimboPlayer(name).setMessageTaskId(msgT); - player.setNoDamageTicks(Settings.getRegistrationTimeout * 20); - if (Settings.useEssentialsMotd) - player.performCommand("motd"); - if (Settings.applyBlindEffect) - player.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, Settings.getRegistrationTimeout * 20, 2)); + plugin.management.performJoin(player); // Remove the join message while the player isn't logging in if (Settings.enableProtection || Settings.delayJoinMessage) { @@ -797,61 +598,11 @@ public class AuthMePlayerListener implements Listener { Player player = event.getPlayer(); String name = player.getName().toLowerCase(); - Location loc = player.getLocation(); - if (plugin.getCitizensCommunicator().isNPC(player, plugin) || Utils.getInstance().isUnrestricted(player) || CombatTagComunicator.isNPC(player)) { - return; - } - - String ip = plugin.getIP(player); - - if (PlayerCache.getInstance().isAuthenticated(name) && !player.isDead()) { - if (Settings.isSaveQuitLocationEnabled && data.isAuthAvailable(name)) { - final PlayerAuth auth = new PlayerAuth(name, loc.getX(), loc.getY(), loc.getZ(), loc.getWorld().getName()); - try { - data.updateQuitLoc(auth); - } catch (NullPointerException npe) { - } - } - PlayerAuth auth = new PlayerAuth(name, ip, System.currentTimeMillis()); - data.updateSession(auth); - } + plugin.management.performQuit(player); if (data.getAuth(name) != null && !PlayerCache.getInstance().isAuthenticated(name) && Settings.enableProtection) event.setQuitMessage(null); - - if (LimboCache.getInstance().hasLimboPlayer(name)) { - LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(name); - if (Settings.protectInventoryBeforeLogInEnabled && player.hasPlayedBefore()) { - RestoreInventoryEvent ev = new RestoreInventoryEvent(player, limbo.getInventory(), limbo.getArmour()); - plugin.getServer().getPluginManager().callEvent(ev); - if (!ev.isCancelled()) { - API.setPlayerInventory(player, ev.getInventory(), ev.getArmor()); - } - } - utils.addNormal(player, limbo.getGroup()); - player.setOp(limbo.getOperator()); - if (player.getGameMode() != GameMode.CREATIVE && !Settings.isMovementAllowed) { - player.setAllowFlight(limbo.isFlying()); - player.setFlying(limbo.isFlying()); - } - if (limbo.getTimeoutTaskId() != null) - limbo.getTimeoutTaskId().cancel(); - if (limbo.getMessageTaskId() != null) - limbo.getMessageTaskId().cancel(); - LimboCache.getInstance().deleteLimboPlayer(name); - if (playerBackup.doesCacheExist(player)) { - playerBackup.removeCache(player); - } - } - PlayerCache.getInstance().removePlayer(name); - data.setUnlogged(name); - try { - player.getVehicle().eject(); - } catch (NullPointerException ex) { - } - if (gameMode.containsKey(name)) - gameMode.remove(name); } @EventHandler(priority = EventPriority.MONITOR) @@ -864,83 +615,13 @@ public class AuthMePlayerListener implements Listener { } Player player = event.getPlayer(); - Location loc = player.getLocation(); - - if ((plugin.getCitizensCommunicator().isNPC(player, plugin)) || (Utils.getInstance().isUnrestricted(player)) || (CombatTagComunicator.isNPC(player))) { - return; - } if ((Settings.isForceSingleSessionEnabled) && (event.getReason().contains("You logged in from another location"))) { event.setCancelled(true); return; } - String name = player.getName().toLowerCase(); - - String ip = plugin.getIP(player); - if ((PlayerCache.getInstance().isAuthenticated(name)) && (!player.isDead())) { - if ((Settings.isSaveQuitLocationEnabled) && data.isAuthAvailable(name)) { - final PlayerAuth auth = new PlayerAuth(name, loc.getX(), loc.getY(), loc.getZ(), loc.getWorld().getName()); - try { - data.updateQuitLoc(auth); - } catch (NullPointerException npe) { - } - } - PlayerAuth auth = new PlayerAuth(name, ip, System.currentTimeMillis()); - data.updateSession(auth); - } - - if (data.getAuth(name) != null && !PlayerCache.getInstance().isAuthenticated(name) && Settings.enableProtection) - event.setLeaveMessage(null); - - if (LimboCache.getInstance().hasLimboPlayer(name)) { - LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(name); - if (Settings.protectInventoryBeforeLogInEnabled) { - try { - RestoreInventoryEvent ev = new RestoreInventoryEvent(player, limbo.getInventory(), limbo.getArmour()); - plugin.getServer().getPluginManager().callEvent(ev); - if (!ev.isCancelled()) { - API.setPlayerInventory(player, ev.getInventory(), ev.getArmor()); - } - } catch (NullPointerException npe) { - ConsoleLogger.showError("Problem while restore " + name + " inventory after a kick"); - } - } - if (!Settings.noTeleport) - try { - AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent(player, limbo.getLoc()); - plugin.getServer().getPluginManager().callEvent(tpEvent); - if (!tpEvent.isCancelled()) { - if (player != null && player.isOnline() && tpEvent.getTo() != null) { - if (tpEvent.getTo().getWorld() != null) - player.teleport(tpEvent.getTo()); - } - } - } catch (NullPointerException npe) { - } - this.utils.addNormal(player, limbo.getGroup()); - player.setOp(limbo.getOperator()); - if (player.getGameMode() != GameMode.CREATIVE && !Settings.isMovementAllowed) { - player.setAllowFlight(limbo.isFlying()); - player.setFlying(limbo.isFlying()); - } - if (limbo.getTimeoutTaskId() != null) - limbo.getTimeoutTaskId().cancel(); - if (limbo.getMessageTaskId() != null) - limbo.getMessageTaskId().cancel(); - LimboCache.getInstance().deleteLimboPlayer(name); - if (this.playerBackup.doesCacheExist(player)) { - this.playerBackup.removeCache(player); - } - } - PlayerCache.getInstance().removePlayer(name); - data.setUnlogged(name); - if (gameMode.containsKey(name)) - gameMode.remove(name); - try { - player.getVehicle().eject(); - } catch (NullPointerException ex) { - } + plugin.management.performQuit(player); } @EventHandler(priority = EventPriority.HIGHEST) diff --git a/src/main/java/fr/xephi/authme/plugin/manager/CombatTagComunicator.java b/src/main/java/fr/xephi/authme/plugin/manager/CombatTagComunicator.java index 974be678..314a4f19 100644 --- a/src/main/java/fr/xephi/authme/plugin/manager/CombatTagComunicator.java +++ b/src/main/java/fr/xephi/authme/plugin/manager/CombatTagComunicator.java @@ -1,13 +1,15 @@ package fr.xephi.authme.plugin.manager; -import com.trc202.CombatTag.CombatTag; -import com.trc202.CombatTagApi.CombatTagApi; import net.minelink.ctplus.CombatTagPlus; + import org.bukkit.Bukkit; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; +import com.trc202.CombatTag.CombatTag; +import com.trc202.CombatTagApi.CombatTagApi; + public abstract class CombatTagComunicator { public static CombatTagApi combatApi; @@ -28,6 +30,9 @@ public abstract class CombatTagComunicator { return false; } return combatApi.isNPC(player); + } else { + Plugin plugin = Bukkit.getServer().getPluginManager().getPlugin("CombatTagPlus"); + return (plugin != null && plugin instanceof CombatTagPlus && player instanceof Player && ((CombatTagPlus) plugin).getNpcPlayerHelper().isNpc((Player) player)); } } catch (ClassCastException ex) { return false; @@ -36,10 +41,6 @@ public abstract class CombatTagComunicator { } catch (NoClassDefFoundError ncdfe) { return false; } - - Plugin plugin = Bukkit.getServer().getPluginManager().getPlugin("CombatTagPlus"); - return (plugin != null && plugin instanceof CombatTagPlus && - player instanceof Player && ((CombatTagPlus) plugin).getNpcPlayerHelper().isNpc((Player) player)); } } diff --git a/src/main/java/fr/xephi/authme/process/Management.java b/src/main/java/fr/xephi/authme/process/Management.java index 44b4fb5e..ca3a7ae5 100644 --- a/src/main/java/fr/xephi/authme/process/Management.java +++ b/src/main/java/fr/xephi/authme/process/Management.java @@ -6,7 +6,10 @@ import org.bukkit.plugin.PluginManager; import fr.xephi.authme.AuthMe; import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.process.join.AsyncronousJoin; import fr.xephi.authme.process.login.AsyncronousLogin; +import fr.xephi.authme.process.logout.AsyncronousLogout; +import fr.xephi.authme.process.quit.AsyncronousQuit; import fr.xephi.authme.process.register.AsyncronousRegister; import fr.xephi.authme.security.RandomString; import fr.xephi.authme.settings.Settings; @@ -51,4 +54,36 @@ public class Management { } }); } + + public void performLogout(final Player player) { + Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() { + + @Override + public void run() { + new AsyncronousLogout(player, plugin, database).process(); + } + }); + } + + public void performQuit(final Player player) { + Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() { + + @Override + public void run() { + new AsyncronousQuit(player, plugin, database).process(); + } + + }); + } + + public void performJoin(final Player player) { + Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() { + + @Override + public void run() { + new AsyncronousJoin(player, plugin, database).process(); + } + + }); + } } diff --git a/src/main/java/fr/xephi/authme/process/join/AsyncronousJoin.java b/src/main/java/fr/xephi/authme/process/join/AsyncronousJoin.java new file mode 100644 index 00000000..3e0605cf --- /dev/null +++ b/src/main/java/fr/xephi/authme/process/join/AsyncronousJoin.java @@ -0,0 +1,343 @@ +package fr.xephi.authme.process.join; + +import java.util.Date; + +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scheduler.BukkitScheduler; +import org.bukkit.scheduler.BukkitTask; + +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.Utils; +import fr.xephi.authme.Utils.groupType; +import fr.xephi.authme.api.API; +import fr.xephi.authme.cache.auth.PlayerAuth; +import fr.xephi.authme.cache.auth.PlayerCache; +import fr.xephi.authme.cache.backup.DataFileCache; +import fr.xephi.authme.cache.backup.FileCache; +import fr.xephi.authme.cache.limbo.LimboCache; +import fr.xephi.authme.cache.limbo.LimboPlayer; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.events.ProtectInventoryEvent; +import fr.xephi.authme.events.SessionEvent; +import fr.xephi.authme.events.SpawnTeleportEvent; +import fr.xephi.authme.listener.AuthMePlayerListener; +import fr.xephi.authme.plugin.manager.CombatTagComunicator; +import fr.xephi.authme.settings.Messages; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.task.MessageTask; +import fr.xephi.authme.task.TimeoutTask; + +public class AsyncronousJoin { + + protected Player player; + protected DataSource database; + protected AuthMe plugin; + protected String name; + private Utils utils = Utils.getInstance(); + private Messages m = Messages.getInstance(); + private FileCache playerBackup; + + public AsyncronousJoin(Player player, AuthMe plugin, DataSource database) { + this.player = player; + this.plugin = plugin; + this.database = database; + this.playerBackup = new FileCache(plugin); + this.name = player.getName().toLowerCase(); + } + + public void process() { + AuthMePlayerListener.gameMode.put(name, player.getGameMode()); + BukkitScheduler sched = plugin.getServer().getScheduler(); + + if (plugin.getCitizensCommunicator().isNPC(player, plugin) || Utils.getInstance().isUnrestricted(player) || CombatTagComunicator.isNPC(player)) { + return; + } + + if (plugin.ess != null && Settings.disableSocialSpy) { + try { + plugin.ess.getUser(player.getName().toLowerCase()).setSocialSpyEnabled(false); + } catch (Exception e) { + } catch (NoSuchMethodError e) { + } + } + + final String ip = plugin.getIP(player); + if (Settings.isAllowRestrictedIp && !Settings.getRestrictedIp(name, ip)) { + final GameMode gM = AuthMePlayerListener.gameMode.get(name); + sched.scheduleSyncDelayedTask(plugin, new Runnable() { + + @Override + public void run() { + AuthMePlayerListener.causeByAuthMe.put(name, true); + player.setGameMode(gM); + AuthMePlayerListener.causeByAuthMe.put(name, false); + player.kickPlayer("You are not the Owner of this account, please try another name!"); + if (Settings.banUnsafeIp) + plugin.getServer().banIP(ip); + } + + }); + return; + } + if (Settings.getMaxJoinPerIp > 0 && !plugin.authmePermissible(player, "authme.allow2accounts") && !ip.equalsIgnoreCase("127.0.0.1") && !ip.equalsIgnoreCase("localhost")) { + if (plugin.hasJoinedIp(player.getName(), ip)) { + player.kickPlayer("A player with the same IP is already in game!"); + return; + } + } + final Location spawnLoc = plugin.getSpawnLocation(player); + if (database.isAuthAvailable(name)) { + if (Settings.isSessionsEnabled) { + PlayerAuth auth = database.getAuth(name); + long timeout = Settings.getSessionTimeout * 60000; + long lastLogin = auth.getLastLogin(); + long cur = new Date().getTime(); + if ((cur - lastLogin < timeout || timeout == 0) && !auth.getIp().equals("198.18.0.1")) { + if (auth.getNickname().equalsIgnoreCase(name) && auth.getIp().equals(ip)) { + if (PlayerCache.getInstance().getAuth(name) != null) { + PlayerCache.getInstance().updatePlayer(auth); + } else { + PlayerCache.getInstance().addPlayer(auth); + database.setLogged(name); + } + m.send(player, "valid_session"); + // Restore Permission Group + utils.setGroup(player, Utils.groupType.LOGGEDIN); + plugin.getServer().getPluginManager().callEvent(new SessionEvent(auth, true)); + return; + } else if (!Settings.sessionExpireOnIpChange) { + final GameMode gM = AuthMePlayerListener.gameMode.get(name); + sched.scheduleSyncDelayedTask(plugin, new Runnable() { + + @Override + public void run() { + AuthMePlayerListener.causeByAuthMe.put(name, true); + player.setGameMode(gM); + AuthMePlayerListener.causeByAuthMe.put(name, false); + player.kickPlayer(m.send("unvalid_session")[0]); + } + + }); + return; + } else if (auth.getNickname().equalsIgnoreCase(name)) { + if (Settings.isForceSurvivalModeEnabled && !Settings.forceOnlyAfterLogin) { + sched.scheduleSyncDelayedTask(plugin, new Runnable() { + + @Override + public void run() { + AuthMePlayerListener.causeByAuthMe.put(name, true); + Utils.forceGM(player); + AuthMePlayerListener.causeByAuthMe.put(name, false); + } + + }); + } + // Player change his IP between 2 relog-in + PlayerCache.getInstance().removePlayer(name); + database.setUnlogged(name); + } else { + final GameMode gM = AuthMePlayerListener.gameMode.get(name); + sched.scheduleSyncDelayedTask(plugin, new Runnable() { + + @Override + public void run() { + AuthMePlayerListener.causeByAuthMe.put(name, true); + player.setGameMode(gM); + AuthMePlayerListener.causeByAuthMe.put(name, false); + player.kickPlayer(m.send("unvalid_session")[0]); + } + + }); + return; + } + } else { + // Session is ended correctly + PlayerCache.getInstance().removePlayer(name); + database.setUnlogged(name); + } + } + // isent in session or session was ended correctly + if (Settings.isForceSurvivalModeEnabled && !Settings.forceOnlyAfterLogin) { + sched.scheduleSyncDelayedTask(plugin, new Runnable() { + + @Override + public void run() { + AuthMePlayerListener.causeByAuthMe.put(name, true); + Utils.forceGM(player); + AuthMePlayerListener.causeByAuthMe.put(name, false); + } + + }); + } + if (!Settings.noTeleport) + if (Settings.isTeleportToSpawnEnabled || (Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName()))) { + sched.scheduleSyncDelayedTask(plugin, new Runnable() { + + @Override + public void run() { + SpawnTeleportEvent tpEvent = new SpawnTeleportEvent(player, player.getLocation(), spawnLoc, PlayerCache.getInstance().isAuthenticated(name)); + plugin.getServer().getPluginManager().callEvent(tpEvent); + if (!tpEvent.isCancelled()) { + if (player != null && player.isOnline() && tpEvent.getTo() != null) { + if (tpEvent.getTo().getWorld() != null) + player.teleport(tpEvent.getTo()); + } + } + } + + }); + } + placePlayerSafely(player, spawnLoc); + LimboCache.getInstance().updateLimboPlayer(player); + try { + DataFileCache dataFile = new DataFileCache(LimboCache.getInstance().getLimboPlayer(name).getInventory(), LimboCache.getInstance().getLimboPlayer(name).getArmour()); + playerBackup.createCache(player, dataFile, LimboCache.getInstance().getLimboPlayer(name).getGroup(), LimboCache.getInstance().getLimboPlayer(name).getOperator(), LimboCache.getInstance().getLimboPlayer(name).isFlying()); + } catch (Exception e) { + ConsoleLogger.showError("Error on creating an inventory cache for " + name + ", maybe inventory wipe in preparation..."); + } + } else { + if (Settings.isForceSurvivalModeEnabled && !Settings.forceOnlyAfterLogin) { + sched.scheduleSyncDelayedTask(plugin, new Runnable() { + + @Override + public void run() { + AuthMePlayerListener.causeByAuthMe.put(name, true); + Utils.forceGM(player); + AuthMePlayerListener.causeByAuthMe.put(name, false); + } + + }); + } + if (!Settings.unRegisteredGroup.isEmpty()) { + utils.setGroup(player, Utils.groupType.UNREGISTERED); + } + if (!Settings.isForcedRegistrationEnabled) { + return; + } + if (!Settings.noTeleport) + if (Settings.isTeleportToSpawnEnabled || (Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName()))) { + sched.scheduleSyncDelayedTask(plugin, new Runnable() { + + @Override + public void run() { + SpawnTeleportEvent tpEvent = new SpawnTeleportEvent(player, player.getLocation(), spawnLoc, PlayerCache.getInstance().isAuthenticated(name)); + plugin.getServer().getPluginManager().callEvent(tpEvent); + if (!tpEvent.isCancelled()) { + if (player != null && player.isOnline() && tpEvent.getTo() != null) { + if (tpEvent.getTo().getWorld() != null) + player.teleport(tpEvent.getTo()); + } + } + } + + }); + } + + } + if (Settings.protectInventoryBeforeLogInEnabled) { + sched.scheduleSyncDelayedTask(plugin, new Runnable() { + + @Override + public void run() { + try { + LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(player.getName().toLowerCase()); + ProtectInventoryEvent ev = new ProtectInventoryEvent(player, limbo.getInventory(), limbo.getArmour()); + plugin.getServer().getPluginManager().callEvent(ev); + if (ev.isCancelled()) { + if (!Settings.noConsoleSpam) + ConsoleLogger.info("ProtectInventoryEvent has been cancelled for " + player.getName() + " ..."); + } else { + API.setPlayerInventory(player, ev.getEmptyInventory(), ev.getEmptyArmor()); + } + } catch (NullPointerException ex) { + } + } + + }); + } + String[] msg; + if (Settings.emailRegistration) { + msg = database.isAuthAvailable(name) ? m.send("login_msg") : m.send("reg_email_msg"); + } else { + msg = database.isAuthAvailable(name) ? m.send("login_msg") : m.send("reg_msg"); + } + int time = Settings.getRegistrationTimeout * 20; + int msgInterval = Settings.getWarnMessageInterval; + if (time != 0) { + BukkitTask id = sched.runTaskLater(plugin, new TimeoutTask(plugin, name), time); + if (!LimboCache.getInstance().hasLimboPlayer(name)) + LimboCache.getInstance().addLimboPlayer(player); + LimboCache.getInstance().getLimboPlayer(name).setTimeoutTaskId(id); + } + if (!LimboCache.getInstance().hasLimboPlayer(name)) + LimboCache.getInstance().addLimboPlayer(player); + if (database.isAuthAvailable(name)) { + utils.setGroup(player, groupType.NOTLOGGEDIN); + } else { + utils.setGroup(player, groupType.UNREGISTERED); + } + sched.scheduleSyncDelayedTask(plugin, new Runnable() { + + @Override + public void run() { + if (player.isOp()) + player.setOp(false); + if (!Settings.isMovementAllowed) { + player.setAllowFlight(true); + player.setFlying(true); + } + player.setNoDamageTicks(Settings.getRegistrationTimeout * 20); + if (Settings.useEssentialsMotd) + player.performCommand("motd"); + if (Settings.applyBlindEffect) + player.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, Settings.getRegistrationTimeout * 20, 2)); + } + + }); + BukkitTask msgT = sched.runTask(plugin, new MessageTask(plugin, name, msg, msgInterval)); + LimboCache.getInstance().getLimboPlayer(name).setMessageTaskId(msgT); + } + + private void placePlayerSafely(final Player player, final Location spawnLoc) { + Location loc = null; + if (spawnLoc == null) + return; + if (!Settings.noTeleport) + return; + if (Settings.isTeleportToSpawnEnabled || (Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName()))) + return; + Block b = player.getLocation().getBlock(); + if (b.getType() == Material.PORTAL || b.getType() == Material.ENDER_PORTAL || b.getType() == Material.LAVA || b.getType() == Material.STATIONARY_LAVA) { + m.send(player, "unsafe_spawn"); + if (spawnLoc.getWorld() != null) + loc = spawnLoc; + } else { + Block c = player.getLocation().add(0D, 1D, 0D).getBlock(); + if (c.getType() == Material.PORTAL || c.getType() == Material.ENDER_PORTAL || c.getType() == Material.LAVA || c.getType() == Material.STATIONARY_LAVA) { + m.send(player, "unsafe_spawn"); + if (spawnLoc.getWorld() != null) + loc = spawnLoc; + } + } + if (loc != null) { + final Location floc = loc; + Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { + + @Override + public void run() { + player.teleport(floc); + } + + }); + } + } + +} diff --git a/src/main/java/fr/xephi/authme/process/logout/AsyncronousLogout.java b/src/main/java/fr/xephi/authme/process/logout/AsyncronousLogout.java new file mode 100644 index 00000000..c50be63d --- /dev/null +++ b/src/main/java/fr/xephi/authme/process/logout/AsyncronousLogout.java @@ -0,0 +1,94 @@ +package fr.xephi.authme.process.logout; + +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitScheduler; + +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.Utils; +import fr.xephi.authme.Utils.groupType; +import fr.xephi.authme.cache.auth.PlayerAuth; +import fr.xephi.authme.cache.auth.PlayerCache; +import fr.xephi.authme.cache.backup.DataFileCache; +import fr.xephi.authme.cache.backup.FileCache; +import fr.xephi.authme.cache.limbo.LimboCache; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.events.AuthMeTeleportEvent; +import fr.xephi.authme.settings.Messages; +import fr.xephi.authme.settings.Settings; + +public class AsyncronousLogout { + + protected Player player; + protected String name; + protected AuthMe plugin; + protected DataSource database; + protected boolean canLogout = true; + private Messages m = Messages.getInstance(); + private Utils utils = Utils.getInstance(); + private FileCache playerBackup; + + public AsyncronousLogout(Player player, AuthMe plugin, DataSource database) { + this.player = player; + this.plugin = plugin; + this.database = database; + this.name = player.getName().toLowerCase(); + this.playerBackup = new FileCache(plugin); + } + + private void preLogout() { + if (!PlayerCache.getInstance().isAuthenticated(name)) { + m.send(player, "not_logged_in"); + canLogout = false; + } + } + + public void process() { + preLogout(); + if (!canLogout) + return; + final Player p = player; + BukkitScheduler sched = p.getServer().getScheduler(); + PlayerAuth auth = PlayerCache.getInstance().getAuth(name); + if (Settings.isSessionsEnabled) + auth.setLastLogin(0L); + database.updateSession(auth); + auth.setQuitLocX(p.getLocation().getX()); + auth.setQuitLocY(p.getLocation().getY()); + auth.setQuitLocZ(p.getLocation().getZ()); + auth.setWorld(p.getWorld().getName()); + database.updateQuitLoc(auth); + + PlayerCache.getInstance().removePlayer(name); + database.setUnlogged(name); + if (Settings.isTeleportToSpawnEnabled && !Settings.noTeleport) { + Location spawnLoc = plugin.getSpawnLocation(p); + final AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent(p, spawnLoc); + sched.scheduleSyncDelayedTask(plugin, new Runnable() { + + @Override + public void run() { + plugin.getServer().getPluginManager().callEvent(tpEvent); + if (!tpEvent.isCancelled()) { + if (tpEvent.getTo() != null) + p.teleport(tpEvent.getTo()); + } + } + }); + } + + if (LimboCache.getInstance().hasLimboPlayer(name)) + LimboCache.getInstance().deleteLimboPlayer(name); + LimboCache.getInstance().addLimboPlayer(player); + utils.setGroup(player, groupType.NOTLOGGEDIN); + if (Settings.protectInventoryBeforeLogInEnabled) { + player.getInventory().clear(); + // create cache file for handling lost of inventories on unlogged in + // status + DataFileCache playerData = new DataFileCache(LimboCache.getInstance().getLimboPlayer(name).getInventory(), LimboCache.getInstance().getLimboPlayer(name).getArmour()); + if (playerData != null) + playerBackup.createCache(player, playerData, LimboCache.getInstance().getLimboPlayer(name).getGroup(), LimboCache.getInstance().getLimboPlayer(name).getOperator(), LimboCache.getInstance().getLimboPlayer(name).isFlying()); + } + sched.scheduleSyncDelayedTask(plugin, new ProcessSyncronousPlayerLogout(p, plugin)); + } +} diff --git a/src/main/java/fr/xephi/authme/process/logout/ProcessSyncronousPlayerLogout.java b/src/main/java/fr/xephi/authme/process/logout/ProcessSyncronousPlayerLogout.java new file mode 100644 index 00000000..80122c40 --- /dev/null +++ b/src/main/java/fr/xephi/authme/process/logout/ProcessSyncronousPlayerLogout.java @@ -0,0 +1,70 @@ +package fr.xephi.authme.process.logout; + +import me.muizers.Notifications.Notification; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scheduler.BukkitScheduler; +import org.bukkit.scheduler.BukkitTask; + +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.cache.limbo.LimboCache; +import fr.xephi.authme.events.LogoutEvent; +import fr.xephi.authme.settings.Messages; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.task.MessageTask; +import fr.xephi.authme.task.TimeoutTask; + +public class ProcessSyncronousPlayerLogout implements Runnable { + + protected Player player; + protected AuthMe plugin; + protected String name; + private Messages m = Messages.getInstance(); + + public ProcessSyncronousPlayerLogout(Player player, AuthMe plugin) { + this.player = player; + this.plugin = plugin; + this.name = player.getName().toLowerCase(); + } + + @Override + public void run() { + int delay = Settings.getRegistrationTimeout * 20; + int interval = Settings.getWarnMessageInterval; + BukkitScheduler sched = player.getServer().getScheduler(); + if (delay != 0) { + BukkitTask id = sched.runTaskLater(plugin, new TimeoutTask(plugin, name), delay); + LimboCache.getInstance().getLimboPlayer(name).setTimeoutTaskId(id); + } + BukkitTask msgT = sched.runTask(plugin, new MessageTask(plugin, name, m.send("login_msg"), interval)); + LimboCache.getInstance().getLimboPlayer(name).setMessageTaskId(msgT); + try { + if (player.isInsideVehicle()) + player.getVehicle().eject(); + } catch (NullPointerException npe) { + } + if (Settings.applyBlindEffect) + player.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, Settings.getRegistrationTimeout * 20, 2)); + player.setOp(false); + player.setAllowFlight(true); + player.setFlying(true); + // Player is now logout... Time to fire event ! + sched.scheduleSyncDelayedTask(plugin, new Runnable() { + + @Override + public void run() { + Bukkit.getServer().getPluginManager().callEvent(new LogoutEvent(player)); + } + }); + m.send(player, "logout"); + ConsoleLogger.info(player.getDisplayName() + " logged out"); + if (plugin.notifications != null) { + plugin.notifications.showNotification(new Notification("[AuthMe] " + player.getName() + " logged out!")); + } + } + +} diff --git a/src/main/java/fr/xephi/authme/process/quit/AsyncronousQuit.java b/src/main/java/fr/xephi/authme/process/quit/AsyncronousQuit.java new file mode 100644 index 00000000..05aa45c1 --- /dev/null +++ b/src/main/java/fr/xephi/authme/process/quit/AsyncronousQuit.java @@ -0,0 +1,87 @@ +package fr.xephi.authme.process.quit; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.Utils; +import fr.xephi.authme.cache.auth.PlayerAuth; +import fr.xephi.authme.cache.auth.PlayerCache; +import fr.xephi.authme.cache.backup.FileCache; +import fr.xephi.authme.cache.limbo.LimboCache; +import fr.xephi.authme.cache.limbo.LimboPlayer; +import fr.xephi.authme.datasource.DataSource; +import fr.xephi.authme.listener.AuthMePlayerListener; +import fr.xephi.authme.plugin.manager.CombatTagComunicator; +import fr.xephi.authme.settings.Settings; + +public class AsyncronousQuit { + + protected AuthMe plugin; + protected DataSource database; + protected Player p; + protected Utils utils = Utils.getInstance(); + private String name; + private FileCache playerBackup; + private ItemStack[] armor = null; + private ItemStack[] inv = null; + private boolean isOp = false; + private boolean isFlying = false; + private boolean needToChange = false; + + public AsyncronousQuit(Player p, AuthMe plugin, DataSource database) { + this.p = p; + this.plugin = plugin; + this.database = database; + this.name = p.getName().toLowerCase(); + this.playerBackup = new FileCache(plugin); + } + + public void process() { + final Player player = p; + if (plugin.getCitizensCommunicator().isNPC(player, plugin) || Utils.getInstance().isUnrestricted(player) || CombatTagComunicator.isNPC(player)) { + return; + } + + Location loc = player.getLocation(); + String ip = plugin.getIP(player); + + if (PlayerCache.getInstance().isAuthenticated(name) && !player.isDead()) { + if (Settings.isSaveQuitLocationEnabled && database.isAuthAvailable(name)) { + final PlayerAuth auth = new PlayerAuth(name, loc.getX(), loc.getY(), loc.getZ(), loc.getWorld().getName()); + try { + database.updateQuitLoc(auth); + } catch (NullPointerException npe) { + } + } + PlayerAuth auth = new PlayerAuth(name, ip, System.currentTimeMillis()); + database.updateSession(auth); + } + + if (LimboCache.getInstance().hasLimboPlayer(name)) { + LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(name); + if (Settings.protectInventoryBeforeLogInEnabled && player.hasPlayedBefore()) { + inv = limbo.getInventory(); + armor = limbo.getArmour(); + } + utils.addNormal(player, limbo.getGroup()); + needToChange = true; + isOp = limbo.getOperator(); + isFlying = limbo.isFlying(); + if (limbo.getTimeoutTaskId() != null) + limbo.getTimeoutTaskId().cancel(); + if (limbo.getMessageTaskId() != null) + limbo.getMessageTaskId().cancel(); + LimboCache.getInstance().deleteLimboPlayer(name); + if (playerBackup.doesCacheExist(player)) { + playerBackup.removeCache(player); + } + } + PlayerCache.getInstance().removePlayer(name); + database.setUnlogged(name); + AuthMePlayerListener.gameMode.remove(name); + Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new ProcessSyncronousPlayerQuit(player, inv, armor, isOp, isFlying, needToChange)); + } +} diff --git a/src/main/java/fr/xephi/authme/process/quit/ProcessSyncronousPlayerQuit.java b/src/main/java/fr/xephi/authme/process/quit/ProcessSyncronousPlayerQuit.java new file mode 100644 index 00000000..83e088ff --- /dev/null +++ b/src/main/java/fr/xephi/authme/process/quit/ProcessSyncronousPlayerQuit.java @@ -0,0 +1,52 @@ +package fr.xephi.authme.process.quit; + +import org.bukkit.GameMode; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import fr.xephi.authme.api.API; +import fr.xephi.authme.events.RestoreInventoryEvent; +import fr.xephi.authme.settings.Settings; + +public class ProcessSyncronousPlayerQuit implements Runnable { + + protected Player player; + protected boolean isOp; + protected boolean isFlying; + protected ItemStack[] inv; + protected ItemStack[] armor; + protected boolean needToChange; + + public ProcessSyncronousPlayerQuit(Player player, ItemStack[] inv, + ItemStack[] armor, boolean isOp, boolean isFlying, + boolean needToChange) { + this.player = player; + this.isOp = isOp; + this.isFlying = isFlying; + this.armor = armor; + this.inv = inv; + this.needToChange = needToChange; + } + + @Override + public void run() { + if (inv != null && armor != null) { + RestoreInventoryEvent ev = new RestoreInventoryEvent(player, inv, armor); + player.getServer().getPluginManager().callEvent(ev); + if (!ev.isCancelled()) { + API.setPlayerInventory(player, ev.getInventory(), ev.getArmor()); + } + } + if (needToChange) { + player.setOp(isOp); + if (player.getGameMode() != GameMode.CREATIVE && !Settings.isMovementAllowed) { + player.setAllowFlight(isFlying); + player.setFlying(isFlying); + } + } + try { + player.getVehicle().eject(); + } catch (Exception e) { + } + } +}