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 6bebb18..aa6d288 100644 --- a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitListener.java +++ b/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitListener.java @@ -3,6 +3,7 @@ package dev.brighten.antivpn.bukkit; import dev.brighten.antivpn.AntiVPN; import dev.brighten.antivpn.api.APIPlayer; import dev.brighten.antivpn.api.VPNExecutor; +import dev.brighten.antivpn.message.VpnString; import lombok.val; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -12,6 +13,7 @@ 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.PlayerJoinEvent; import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; @@ -45,6 +47,22 @@ public class BukkitListener extends VPNExecutor implements Listener { if(cacheResetTask != null && !cacheResetTask.isCancelled()) cacheResetTask.cancel(); } + @EventHandler + public void onJoin(final PlayerJoinEvent event) { + AntiVPN.getInstance().getPlayerExecutor().getPlayer(event.getPlayer().getUniqueId()) + .ifPresent(player -> { + AntiVPN.getInstance().getDatabase().alertsState(player.getUuid(), enabled -> { + if(enabled) { + System.out.println("Enabled"); + player.setAlertsEnabled(true); + player.sendMessage(AntiVPN.getInstance().getMessageHandler() + .getString("command-alerts-toggled") + .getFormattedMessage(new VpnString.Var<>("state", true))); + } else System.out.println("Not enabled"); + }); + }); + } + @EventHandler public void onListener(final PlayerLoginEvent event) { //If they're exempt, don't check. diff --git a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlugin.java b/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlugin.java index a0727da..d8b4c14 100644 --- a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlugin.java +++ b/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlugin.java @@ -1,6 +1,7 @@ package dev.brighten.antivpn.bukkit; import dev.brighten.antivpn.AntiVPN; +import dev.brighten.antivpn.bukkit.util.ConfigDefault; import dev.brighten.antivpn.command.Command; import lombok.val; import net.md_5.bungee.api.ChatColor; @@ -125,6 +126,16 @@ public class BukkitPlugin extends JavaPlugin { registeredCommands.add(newCommand); commandMap.register(pluginInstance.getName(), newCommand); } + + AntiVPN.getInstance().getMessageHandler().initStrings(vpnString -> new ConfigDefault<> + (vpnString.getDefaultMessage(), "messages." + vpnString.getKey(), BukkitPlugin.pluginInstance) + .get()); + //TODO Finish system before implementing on startup + /*Bukkit.getLogger().info("Getting strings..."); + AntiVPN.getInstance().getMessageHandler().initStrings(vpnString -> new ConfigDefault<> + (vpnString.getDefaultMessage(), "messages." + vpnString.getKey(), BukkitPlugin.pluginInstance) + .get()); + AntiVPN.getInstance().getMessageHandler().reloadStrings();*/ } @Override diff --git a/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeePlugin.java b/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeePlugin.java index d812c6c..2fa9535 100644 --- a/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeePlugin.java +++ b/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeePlugin.java @@ -2,6 +2,7 @@ package dev.brighten.antivpn.bungee; import dev.brighten.antivpn.AntiVPN; import dev.brighten.antivpn.bungee.util.Config; +import dev.brighten.antivpn.bungee.util.ConfigDefault; import dev.brighten.antivpn.command.Command; import lombok.Getter; import lombok.val; @@ -27,7 +28,7 @@ public class BungeePlugin extends Plugin { private Config config; private SingleLineChart vpnDetections, ipsChecked; - private static BaseComponent[] noPermission = new ComponentBuilder("No permission").color(ChatColor.RED) + private static final BaseComponent[] noPermission = new ComponentBuilder("No permission").color(ChatColor.RED) .create(); @Override @@ -38,6 +39,7 @@ public class BungeePlugin extends Plugin { BungeeCord.getInstance().getLogger().info("Loading config..."); config = new Config(); + //Loading plugin BungeeCord.getInstance().getLogger().info("Starting AntiVPN services..."); AntiVPN.start(new BungeeConfig(), new BungeeListener(), new BungeePlayerExecutor()); @@ -98,6 +100,17 @@ public class BungeePlugin extends Plugin { } }); } + + BungeeCord.getInstance().getLogger().info("Getting strings..."); + AntiVPN.getInstance().getMessageHandler().initStrings(vpnString -> new ConfigDefault<> + (vpnString.getDefaultMessage(), "messages." + vpnString.getKey(), BungeePlugin.pluginInstance) + .get()); + //TODO Finish system before implementing on startup + /*BungeeCord.getInstance().getLogger().info("Getting strings..."); + AntiVPN.getInstance().getMessageHandler().initStrings(vpnString -> new ConfigDefault<> + (vpnString.getDefaultMessage(), "messages." + vpnString.getKey(), BungeePlugin.pluginInstance) + .get()); + AntiVPN.getInstance().getMessageHandler().reloadStrings();*/ } @Override diff --git a/Common/src/main/java/dev/brighten/antivpn/AntiVPN.java b/Common/src/main/java/dev/brighten/antivpn/AntiVPN.java index 58bae49..62541df 100644 --- a/Common/src/main/java/dev/brighten/antivpn/AntiVPN.java +++ b/Common/src/main/java/dev/brighten/antivpn/AntiVPN.java @@ -5,7 +5,6 @@ import dev.brighten.antivpn.api.VPNConfig; import dev.brighten.antivpn.api.VPNExecutor; import dev.brighten.antivpn.command.Command; import dev.brighten.antivpn.command.impl.AntiVPNCommand; -import dev.brighten.antivpn.command.impl.LookupCommand; import dev.brighten.antivpn.database.VPNDatabase; import dev.brighten.antivpn.database.sql.MySqlVPN; import dev.brighten.antivpn.message.MessageHandler; @@ -71,6 +70,16 @@ public class AntiVPN { //Registering commands INSTANCE.registerCommands(); + + //Turning on alerts of players who are already online. + playerExecutor.getOnlinePlayers().forEach(player -> { + //We want to make sure they even have permission to see alerts before we make a bunch + //of unnecessary database queries. + if(player.hasPermission("antivpn.command.alerts")) { + //Running database check for enabled alerts. + INSTANCE.database.alertsState(player.getUuid(), player::setAlertsEnabled); + } + }); } public void stop() { diff --git a/Common/src/main/java/dev/brighten/antivpn/api/APIPlayer.java b/Common/src/main/java/dev/brighten/antivpn/api/APIPlayer.java index cbe93f7..bfa4ccc 100644 --- a/Common/src/main/java/dev/brighten/antivpn/api/APIPlayer.java +++ b/Common/src/main/java/dev/brighten/antivpn/api/APIPlayer.java @@ -1,5 +1,7 @@ package dev.brighten.antivpn.api; +import dev.brighten.antivpn.AntiVPN; +import dev.brighten.antivpn.message.VpnString; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; @@ -8,17 +10,30 @@ import java.net.InetAddress; import java.util.UUID; @Getter -@RequiredArgsConstructor public abstract class APIPlayer { private final UUID uuid; private final String name; private final InetAddress ip; - @Setter private boolean alertsEnabled; + public APIPlayer(UUID uuid, String name, InetAddress ip) { + this.uuid = uuid; + this.name = name; + this.ip = ip; + } + public abstract void sendMessage(String message); public abstract void kickPlayer(String reason); public abstract boolean hasPermission(String permission); + + public void setAlertsEnabled(boolean alertsEnabled) { + this.alertsEnabled = alertsEnabled; + } + + public void updateAlertsState() { + //Updating into database so its synced across servers and saved on logout. + AntiVPN.getInstance().getDatabase().updateAlertsState(uuid, alertsEnabled); + } } diff --git a/Common/src/main/java/dev/brighten/antivpn/command/impl/AlertsCommand.java b/Common/src/main/java/dev/brighten/antivpn/command/impl/AlertsCommand.java index a7f5d8c..113bea4 100644 --- a/Common/src/main/java/dev/brighten/antivpn/command/impl/AlertsCommand.java +++ b/Common/src/main/java/dev/brighten/antivpn/command/impl/AlertsCommand.java @@ -55,6 +55,7 @@ public class AlertsCommand extends Command { APIPlayer player = pgetter.get(); player.setAlertsEnabled(!player.isAlertsEnabled()); + player.updateAlertsState(); return AntiVPN.getInstance().getMessageHandler().getString("command-alerts-toggled") .getFormattedMessage(new VpnString.Var<>("state", player.isAlertsEnabled())); diff --git a/Common/src/main/java/dev/brighten/antivpn/database/VPNDatabase.java b/Common/src/main/java/dev/brighten/antivpn/database/VPNDatabase.java index 3e64f57..ad6036a 100644 --- a/Common/src/main/java/dev/brighten/antivpn/database/VPNDatabase.java +++ b/Common/src/main/java/dev/brighten/antivpn/database/VPNDatabase.java @@ -22,6 +22,10 @@ public interface VPNDatabase { void isWhitelistedAsync(UUID uuid, Consumer result); + void alertsState(UUID uuid, Consumer result); + + void updateAlertsState(UUID uuid, boolean state); + void init(); void shutdown(); diff --git a/Common/src/main/java/dev/brighten/antivpn/database/sql/MySqlVPN.java b/Common/src/main/java/dev/brighten/antivpn/database/sql/MySqlVPN.java index 92ce325..69d8730 100644 --- a/Common/src/main/java/dev/brighten/antivpn/database/sql/MySqlVPN.java +++ b/Common/src/main/java/dev/brighten/antivpn/database/sql/MySqlVPN.java @@ -44,8 +44,9 @@ public class MySqlVPN implements VPNDatabase { @Override public Optional getStoredResponse(String ip) { - if (!AntiVPN.getInstance().getConfig().isDatabaseEnabled()) + if (!AntiVPN.getInstance().getConfig().isDatabaseEnabled()|| MySQL.isClosed()) return Optional.empty(); + ResultSet rs = Query.prepare("select * from `responses` where `ip` = ? limit 1").append(ip).executeQuery(); try { @@ -77,8 +78,9 @@ public class MySqlVPN implements VPNDatabase { */ @Override public void cacheResponse(VPNResponse toCache) { - if (!AntiVPN.getInstance().getConfig().isDatabaseEnabled()) + if (!AntiVPN.getInstance().getConfig().isDatabaseEnabled() || MySQL.isClosed()) return; + Query.prepare("insert into `responses` (`ip`,`asn`,`countryName`,`countryCode`,`city`,`timeZone`," + "`method`,`isp`,`proxy`,`cached`,`inserted`,`latitude`,`longitude`) values (?,?,?,?,?,?,?,?,?,?,?,?,?)") .append(toCache.getIp()).append(toCache.getAsn()).append(toCache.getCountryName()) @@ -91,16 +93,18 @@ public class MySqlVPN implements VPNDatabase { @SneakyThrows @Override public boolean isWhitelisted(UUID uuid) { - if (!AntiVPN.getInstance().getConfig().isDatabaseEnabled()) + if (!AntiVPN.getInstance().getConfig().isDatabaseEnabled() || MySQL.isClosed()) return false; ResultSet set = Query.prepare("select uuid from `whitelisted` where `uuid` = ? limit 1").append(uuid.toString()) .executeQuery(); - return set != null && set.getFetchSize() > 0 && set.next() && set.getString("uuid") != null; + return set != null && set.next() && set.getString("uuid") != null; } @Override public void setWhitelisted(UUID uuid, boolean whitelisted) { + if(MySQL.isClosed()) return; + if (whitelisted) { if (!isWhitelisted(uuid)) { Query.prepare("insert into `whitelisted` (`uuid`) values (?)").append(uuid.toString()).execute(); @@ -115,6 +119,9 @@ public class MySqlVPN implements VPNDatabase { @Override public List getAllWhitelisted() { List uuids = new ArrayList<>(); + + if(MySQL.isClosed()) return uuids; + ResultSet set = Query.prepare("select uuid from `whitelisted`").executeQuery(); try { @@ -129,14 +136,54 @@ public class MySqlVPN implements VPNDatabase { @Override public void getStoredResponseAsync(String ip, Consumer> result) { + if(MySQL.isClosed()) return; + VPNExecutor.threadExecutor.execute(() -> result.accept(getStoredResponse(ip))); } @Override public void isWhitelistedAsync(UUID uuid, Consumer result) { + if(MySQL.isClosed()) return; + VPNExecutor.threadExecutor.execute(() -> result.accept(isWhitelisted(uuid))); } + @Override + public void alertsState(UUID uuid, Consumer result) { + if(MySQL.isClosed()) return; + + VPNExecutor.threadExecutor.execute(() -> { + ResultSet set = Query.prepare("select * from `alerts` where `uuid` = ? limit 1") + .append(uuid.toString()).executeQuery(); + + try { + result.accept(set != null && set.next() && set.getString("uuid") != null); + } catch (SQLException e) { + e.printStackTrace(); + result.accept(false); + } + }); + } + + @Override + public void updateAlertsState(UUID uuid, boolean enabled) { + if(MySQL.isClosed()) return; + + if(enabled) { + //We want to make sure there isn't already a uuid inserted to prevent double insertions + alertsState(uuid, alreadyEnabled -> { //No need to make another thread execute, already async + if(!alreadyEnabled) { + Query.prepare("insert into `alerts` (`uuid`) values (?)").append(uuid.toString()) + .execute(); + } //No need to insert again of already enabled + }); + //Removing any uuid from the alerts table will disable alerts globally. + } else VPNExecutor.threadExecutor.execute(() -> + Query.prepare("delete from `alerts` where `uuid` = ?") + .append(uuid.toString()) + .execute()); + } + @Override public void init() { if (!AntiVPN.getInstance().getConfig().isDatabaseEnabled()) @@ -145,11 +192,27 @@ public class MySqlVPN implements VPNDatabase { MySQL.init(); System.out.println("Creating tables..."); + + //Running check for old table types to update + oldTableCheck: { + Query.prepare("select `DATA_TYPE` from INFORMATION_SCHEMA.COLUMNS " + + "WHERE table_name = 'responses' AND COLUMN_NAME = 'isp';").execute(set -> { + if(set.getObject("DATA_TYPE").toString().contains("varchar")) { + System.out.println("Using old database format for storing responses! " + + "Dropping table and creating a new one..."); + if(Query.prepare("drop table `responses`").execute() > 0) { + System.out.println("Successfully dropped table!"); + } + } + }); + } + Query.prepare("create table if not exists `whitelisted` (`uuid` varchar(36) not null)").execute(); Query.prepare("create table if not exists `responses` (`ip` varchar(45) not null, `asn` varchar(12)," - + "`countryName` varchar(64), `countryCode` varchar(10), `city` varchar(64), `timeZone` varchar(64), " - + "`method` varchar(32), `isp` varchar(64), `proxy` boolean, `cached` boolean, `inserted` timestamp," + + "`countryName` text, `countryCode` varchar(10), `city` text, `timeZone` varchar(64), " + + "`method` varchar(32), `isp` text, `proxy` boolean, `cached` boolean, `inserted` timestamp," + "`latitude` double, `longitude` double)").execute(); + Query.prepare("create table if not exists `alerts` (`uuid` varchar(36) not null)").execute(); System.out.println("Creating indexes..."); try { diff --git a/Common/src/main/java/dev/brighten/antivpn/database/sql/utils/MySQL.java b/Common/src/main/java/dev/brighten/antivpn/database/sql/utils/MySQL.java index a46bb1b..7718312 100644 --- a/Common/src/main/java/dev/brighten/antivpn/database/sql/utils/MySQL.java +++ b/Common/src/main/java/dev/brighten/antivpn/database/sql/utils/MySQL.java @@ -4,6 +4,7 @@ import dev.brighten.antivpn.AntiVPN; import java.sql.Connection; import java.sql.DriverManager; +import java.sql.SQLException; public class MySQL { private static Connection conn; @@ -47,4 +48,16 @@ public class MySQL { e.printStackTrace(); } } + + public static boolean isClosed() { + if(conn == null) + return true; + + try { + return conn.isClosed(); + } catch (SQLException e) { + e.printStackTrace(); + return true; + } + } }