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..105b4ca 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,6 @@ package dev.brighten.antivpn.api; +import dev.brighten.antivpn.AntiVPN; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; @@ -8,17 +9,34 @@ 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; + + AntiVPN.getInstance().getDatabase().alertsState(uuid, enabled -> { + if(enabled) { + alertsEnabled = enabled; //This can be within the if statement. It's not dirty, it lowers field writes. + sendMessage(""); + } + }); + } + 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; + //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/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..f2d6bb2 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 @@ -137,6 +137,38 @@ public class MySqlVPN implements VPNDatabase { VPNExecutor.threadExecutor.execute(() -> result.accept(isWhitelisted(uuid))); } + @Override + public void alertsState(UUID uuid, Consumer result) { + VPNExecutor.threadExecutor.execute(() -> { + ResultSet set = Query.prepare("select * from `alerts` where `uuid` = ?") + .append(uuid.toString()).executeQuery(); + + try { + result.accept(set.next()); + } catch (SQLException e) { + e.printStackTrace(); + result.accept(false); + } + }); + } + + @Override + public void updateAlertsState(UUID uuid, boolean enabled) { + 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 +177,21 @@ 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 -> { + System.out.println("Data type: " + set.getObject("DATA_TYPE")); + }); + } + 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 {