diff --git a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitListener.java b/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitListener.java index b892e31..6bebb18 100644 --- a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitListener.java +++ b/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitListener.java @@ -3,13 +3,16 @@ package dev.brighten.antivpn.bukkit; import dev.brighten.antivpn.AntiVPN; import dev.brighten.antivpn.api.APIPlayer; import dev.brighten.antivpn.api.VPNExecutor; +import lombok.val; import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.EventHandler; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; @@ -43,47 +46,45 @@ public class BukkitListener extends VPNExecutor implements Listener { } @EventHandler - public void onListener(final AsyncPlayerPreLoginEvent event) { + public void onListener(final PlayerLoginEvent event) { //If they're exempt, don't check. - if(AntiVPN.getInstance().getExecutor().isWhitelisted(event.getUniqueId())) return; + if(AntiVPN.getInstance().getExecutor().isWhitelisted(event.getPlayer().getUniqueId())) return; checkIp(event.getAddress().getHostAddress(), AntiVPN.getInstance().getConfig().cachedResults(), result -> { if(result.isSuccess() && result.isProxy()) { - if(AntiVPN.getInstance().getConfig().kickPlayersOnDetect()) { - event.setLoginResult(AsyncPlayerPreLoginEvent.Result.KICK_OTHER); - event.setKickMessage(ChatColor.translateAlternateColorCodes('&', - AntiVPN.getInstance().getConfig().getKickString())); - } - Optional.ofNullable(Bukkit.getPlayer(event.getUniqueId())).ifPresent(player -> { - new BukkitRunnable() { - public void run() { - if(!player.hasPermission("antivpn.bypass") //Has bypass permission - //Or has a name that starts with a certain prefix. This is for Bedrock exempting. - || AntiVPN.getInstance().getConfig().getPrefixWhitelists().stream() - .anyMatch(prefix -> player.getName().startsWith(prefix))) { - if (AntiVPN.getInstance().getConfig().kickPlayersOnDetect()) - player.kickPlayer(ChatColor.translateAlternateColorCodes('&', - AntiVPN.getInstance().getConfig().getKickString())); + new BukkitRunnable() { + public void run() { + Player player = event.getPlayer(); - //Ensuring the user wishes to alert to staff - if(AntiVPN.getInstance().getConfig().alertToStaff()) - AntiVPN.getInstance().getPlayerExecutor().getOnlinePlayers().stream() - .filter(APIPlayer::isAlertsEnabled) - .forEach(pl -> pl.sendMessage(AntiVPN.getInstance().getConfig() - .alertMessage())); + if(!player.hasPermission("antivpn.bypass") //Has bypass permission + //Or has a name that starts with a certain prefix. This is for Bedrock exempting. + || AntiVPN.getInstance().getConfig().getPrefixWhitelists().stream() + .anyMatch(prefix -> player.getName().startsWith(prefix))) { + if (AntiVPN.getInstance().getConfig().kickPlayersOnDetect()) + player.kickPlayer(ChatColor.translateAlternateColorCodes('&', + AntiVPN.getInstance().getConfig().getKickString())); - //In case the user wants to run their own commands instead of using the built in kicking - if(AntiVPN.getInstance().getConfig().runCommands()) + //Ensuring the user wishes to alert to staff + if(AntiVPN.getInstance().getConfig().alertToStaff()) + AntiVPN.getInstance().getPlayerExecutor().getOnlinePlayers().stream() + .filter(APIPlayer::isAlertsEnabled) + .forEach(pl -> pl.sendMessage(AntiVPN.getInstance().getConfig() + .alertMessage().replace("%player%", event.getPlayer().getName()) + .replace("%reason%", result.getMethod()) + .replace("%country%", result.getCountryName()) + .replace("%city%", result.getCity()))); + + //In case the user wants to run their own commands instead of using the built in kicking + if(AntiVPN.getInstance().getConfig().runCommands()) for (String command : AntiVPN.getInstance().getConfig().commands()) { Bukkit.dispatchCommand(Bukkit.getConsoleSender(), ChatColor.translateAlternateColorCodes('&', - command.replace("%player%", event.getName()))); + command.replace("%player%", event.getPlayer().getName()))); } - } - Bukkit.getLogger().info(player.getPlayer().getName() - + " joined on a VPN/Proxy (" + result.getMethod() + ")"); } - }.runTask(BukkitPlugin.pluginInstance); - }); + Bukkit.getLogger().info(player.getPlayer().getName() + + " joined on a VPN/Proxy (" + result.getMethod() + ")"); + } + }.runTask(BukkitPlugin.pluginInstance); } else if(!result.isSuccess()) { Bukkit.getLogger().log(Level.WARNING, "The API query was not a success! " + diff --git a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlayerExecutor.java b/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlayerExecutor.java index 608d843..6ecef11 100644 --- a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlayerExecutor.java +++ b/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlayerExecutor.java @@ -6,13 +6,13 @@ import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; -import java.util.List; -import java.util.Optional; -import java.util.UUID; +import java.util.*; import java.util.stream.Collectors; public class BukkitPlayerExecutor implements PlayerExecutor { + private final Map cachedPlayers = new WeakHashMap<>(); + @Override public Optional getPlayer(String name) { final Player player = Bukkit.getPlayer(name); @@ -21,7 +21,7 @@ public class BukkitPlayerExecutor implements PlayerExecutor { return Optional.empty(); } - return Optional.of(new BukkitPlayer(player)); + return Optional.of(cachedPlayers.computeIfAbsent(player, BukkitPlayer::new)); } @Override @@ -32,13 +32,15 @@ public class BukkitPlayerExecutor implements PlayerExecutor { return Optional.empty(); } - return Optional.of(new BukkitPlayer(player)); + return Optional.of(cachedPlayers.computeIfAbsent(player, BukkitPlayer::new)); } @Override public List getOnlinePlayers() { - return Bukkit.getOnlinePlayers().stream().map(BukkitPlayer::new).collect(Collectors.toList()); + return Bukkit.getOnlinePlayers().stream() + .map(pl -> cachedPlayers.computeIfAbsent(pl, BukkitPlayer::new)) + .collect(Collectors.toList()); } } diff --git a/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeeListener.java b/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeeListener.java index 5761b53..15b97b0 100644 --- a/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeeListener.java +++ b/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeeListener.java @@ -61,7 +61,11 @@ public class BungeeListener extends VPNExecutor implements Listener { if(AntiVPN.getInstance().getConfig().alertToStaff()) //Ensuring the user wishes to alert to staff AntiVPN.getInstance().getPlayerExecutor().getOnlinePlayers().stream() .filter(APIPlayer::isAlertsEnabled) - .forEach(pl -> pl.sendMessage(AntiVPN.getInstance().getConfig().alertMessage())); + .forEach(pl -> pl.sendMessage(AntiVPN.getInstance().getConfig().alertMessage() + .replace("%player%", event.getPlayer().getName()) + .replace("%reason%", result.getMethod()) + .replace("%country%", result.getCountryName()) + .replace("%city%", result.getCity()))); //In case the user wants to run their own commands instead of using the built in kicking if(AntiVPN.getInstance().getConfig().runCommands()) { diff --git a/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeePlayerExecutor.java b/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeePlayerExecutor.java index 4221c55..f3b7412 100644 --- a/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeePlayerExecutor.java +++ b/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeePlayerExecutor.java @@ -5,20 +5,20 @@ import dev.brighten.antivpn.api.PlayerExecutor; import net.md_5.bungee.BungeeCord; import net.md_5.bungee.api.connection.ProxiedPlayer; -import java.util.List; -import java.util.Optional; -import java.util.UUID; +import java.util.*; import java.util.stream.Collectors; public class BungeePlayerExecutor implements PlayerExecutor { + private final Map cachedPlayers = new WeakHashMap<>(); + @Override public Optional getPlayer(String name) { ProxiedPlayer player = BungeeCord.getInstance().getPlayer(name); if(player == null) return Optional.empty(); - return Optional.of(new BungeePlayer(player)); + return Optional.of(cachedPlayers.computeIfAbsent(player, BungeePlayer::new)); } @Override @@ -27,11 +27,13 @@ public class BungeePlayerExecutor implements PlayerExecutor { if(player == null) return Optional.empty(); - return Optional.of(new BungeePlayer(player)); + return Optional.of(cachedPlayers.computeIfAbsent(player, BungeePlayer::new)); } @Override public List getOnlinePlayers() { - return BungeeCord.getInstance().getPlayers().stream().map(BungeePlayer::new).collect(Collectors.toList()); + return BungeeCord.getInstance().getPlayers().stream() + .map(pl -> cachedPlayers.computeIfAbsent(pl, BungeePlayer::new)) + .collect(Collectors.toList()); } }