Fixing bug that prevented players from getting kicked and fixes alerts not being populated

This commit is contained in:
Dawson Hessler
2021-08-27 14:44:40 -04:00
parent 3b15a4c919
commit 334c894fe2
4 changed files with 53 additions and 44 deletions
@@ -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! " +
@@ -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<Player, BukkitPlayer> cachedPlayers = new WeakHashMap<>();
@Override
public Optional<APIPlayer> 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<APIPlayer> 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());
}
}