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 0977dc7..343b649 100644 --- a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitListener.java +++ b/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitListener.java @@ -11,13 +11,11 @@ import net.md_5.bungee.api.ChatColor; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; -import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.scheduler.BukkitTask; import java.net.InetAddress; import java.net.InetSocketAddress; @@ -26,11 +24,9 @@ import java.util.concurrent.TimeUnit; import java.util.logging.Level; public class BukkitListener extends VPNExecutor implements Listener { - - private BukkitTask cacheResetTask; private final Cache responseCache = CacheBuilder.newBuilder() .expireAfterWrite(5, TimeUnit.MINUTES) - .maximumSize(10000) + .maximumSize(2000) .build(); @Override @@ -39,22 +35,9 @@ public class BukkitListener extends VPNExecutor implements Listener { .registerEvents(this, BukkitPlugin.pluginInstance); } - @Override - public void runCacheReset() { - // Reset cache every 20 minutes - cacheResetTask = new BukkitRunnable() { - public void run() { - resetCache(); - } - }.runTaskTimerAsynchronously(BukkitPlugin.pluginInstance, 24000, 24000); - - HandlerList.unregisterAll(this); - threadExecutor.shutdown(); - } - @Override public void shutdown() { - if(cacheResetTask != null && !cacheResetTask.isCancelled()) cacheResetTask.cancel(); + } @Override @@ -133,7 +116,7 @@ public class BukkitListener extends VPNExecutor implements Listener { // If the countryList() size is zero, no need to check. // Running country check first - if(AntiVPN.getInstance().getVpnConfig().countryList().size() > 0 + if(!AntiVPN.getInstance().getVpnConfig().countryList().isEmpty() // This bit of code will decide whether or not to kick the player // If it contains the code and it is set to whitelist, it will not kick as they are equal // and vise versa. However, if the contains does not match the state, it will kick. @@ -141,7 +124,7 @@ public class BukkitListener extends VPNExecutor implements Listener { .contains(result.getCountryCode()) != AntiVPN.getInstance().getVpnConfig().whitelistCountries()) { //Using our built in kicking system if no commands are configured - if(AntiVPN.getInstance().getVpnConfig().countryKickCommands().size() == 0) { + if(AntiVPN.getInstance().getVpnConfig().countryKickCommands().isEmpty()) { final String kickReason = AntiVPN.getInstance().getVpnConfig() .countryVanillaKickReason(); // Kicking our player 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 24aab5d..80cbe84 100644 --- a/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeeListener.java +++ b/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeeListener.java @@ -26,7 +26,7 @@ public class BungeeListener extends VPNExecutor implements Listener { private final Cache responseCache = CacheBuilder.newBuilder() .expireAfterWrite(5, TimeUnit.MINUTES) - .maximumSize(10000) + .maximumSize(2000) .build(); @Override @@ -35,12 +35,6 @@ public class BungeeListener extends VPNExecutor implements Listener { .registerListener(BungeePlugin.pluginInstance, this); } - @Override - public void runCacheReset() { - cacheResetTask = BungeePlugin.pluginInstance.getProxy().getScheduler().schedule(BungeePlugin.pluginInstance, - this::resetCache, 20, 20, TimeUnit.MINUTES); - } - @Override public void shutdown() { if(cacheResetTask != null) { diff --git a/Common/pom.xml b/Common/pom.xml index e67537d..2040fe8 100644 --- a/Common/pom.xml +++ b/Common/pom.xml @@ -87,18 +87,18 @@ org.yaml snakeyaml - 2.0 + 2.2 compile com.google.guava guava - 32.0.0-jre + 32.1.3-jre org.mongodb mongo-java-driver - 3.12.11 + 3.12.14 provided diff --git a/Common/src/main/java/dev/brighten/antivpn/AntiVPN.java b/Common/src/main/java/dev/brighten/antivpn/AntiVPN.java index 0273e88..16dd2a5 100644 --- a/Common/src/main/java/dev/brighten/antivpn/AntiVPN.java +++ b/Common/src/main/java/dev/brighten/antivpn/AntiVPN.java @@ -32,7 +32,7 @@ import java.util.List; @Getter @Setter(AccessLevel.PRIVATE) @MavenLibrary(groupId = "com.h2database", artifactId ="h2", version = "2.2.224") -@MavenLibrary(groupId = "org.mongodb", artifactId = "mongo-java-driver", version = "3.12.11") +@MavenLibrary(groupId = "org.mongodb", artifactId = "mongo-java-driver", version = "3.12.14") @MavenLibrary(groupId = "com.mysql", artifactId = "mysql-connector-j", version = "8.2.0") public class AntiVPN { diff --git a/Common/src/main/java/dev/brighten/antivpn/api/VPNExecutor.java b/Common/src/main/java/dev/brighten/antivpn/api/VPNExecutor.java index 8a9cbfc..3f59cae 100644 --- a/Common/src/main/java/dev/brighten/antivpn/api/VPNExecutor.java +++ b/Common/src/main/java/dev/brighten/antivpn/api/VPNExecutor.java @@ -1,36 +1,37 @@ package dev.brighten.antivpn.api; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; import dev.brighten.antivpn.AntiVPN; -import dev.brighten.antivpn.utils.EvictingMap; -import dev.brighten.antivpn.web.objects.VPNResponse; import dev.brighten.antivpn.utils.json.JSONException; import dev.brighten.antivpn.web.FunkemunkyAPI; +import dev.brighten.antivpn.web.objects.VPNResponse; import lombok.Getter; import java.io.IOException; import java.util.*; -import java.util.concurrent.ExecutorService; +import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; import java.util.function.Consumer; import java.util.logging.Level; public abstract class VPNExecutor { - public static ExecutorService threadExecutor = Executors.newSingleThreadExecutor(); + public static ScheduledExecutorService threadExecutor = Executors.newScheduledThreadPool(2); - public static final Map responseCache = new EvictingMap<>(5000); @Getter private final Set whitelisted = Collections.synchronizedSet(new HashSet<>()); @Getter private final Set whitelistedIps = Collections.synchronizedSet(new HashSet<>()); + private final Cache responseCache = CacheBuilder.newBuilder() + .expireAfterWrite(20, TimeUnit.MINUTES) + .maximumSize(4000) + .build(); + public abstract void registerListeners(); - public abstract void runCacheReset(); - - public void resetCache() { - responseCache.clear(); - } - public abstract void shutdown(); public abstract void log(Level level, String log, Object... objects); @@ -52,60 +53,42 @@ public abstract class VPNExecutor { } public void checkIp(String ip, boolean cachedResults, Consumer result) { - threadExecutor.execute(() -> result.accept(responseCache.compute(ip, (key, val) -> { - if(val == null) { - Optional cachedRes = AntiVPN.getInstance().getDatabase().getStoredResponse(ip); - - if(cachedRes.isPresent()) return cachedRes.get(); - else { - try { - VPNResponse response = FunkemunkyAPI - .getVPNResponse(ip, AntiVPN.getInstance().getVpnConfig().getLicense(), cachedResults); - - if(response.isSuccess()) { - AntiVPN.getInstance().getDatabase().cacheResponse(response); - } else { - log("Query to VPN API failed! Reason: " + response.getFailureReason()); - } - - return response; - } catch (JSONException | IOException e) { - log("Query to VPN API failed! Reason: Java Exception"); - e.printStackTrace(); - } + threadExecutor.execute(() -> { + if(cachedResults) { + try { + result.accept(responseCache.get(ip, () -> checkIp(ip))); + } catch (ExecutionException e) { + log("Failed to process checkIp() method! Reason: " + e.getMessage()); + result.accept(VPNResponse.FAILED_RESPONSE); } + } else { + result.accept(checkIp(ip)); } - - return val; - }))); - } - - public VPNResponse checkIp(String ip, boolean cachedResults) { - return responseCache.compute(ip, (key, val) -> { - if(val == null) { - Optional cachedRes = AntiVPN.getInstance().getDatabase().getStoredResponse(ip); - - if(cachedRes.isPresent()) return cachedRes.get(); - else { - try { - VPNResponse response = FunkemunkyAPI - .getVPNResponse(ip, AntiVPN.getInstance().getVpnConfig().getLicense(), cachedResults); - - if(response.isSuccess()) { - threadExecutor.execute(() -> AntiVPN.getInstance().getDatabase().cacheResponse(response)); - } else { - log("Query to VPN API failed! Reason: " + response.getFailureReason()); - } - - return response; - } catch (JSONException | IOException e) { - log("Query to VPN API failed! Reason: Java Exception"); - e.printStackTrace(); - } - } - } - - return val; }); } + + public VPNResponse checkIp(String ip) { + Optional cachedRes = AntiVPN.getInstance().getDatabase().getStoredResponse(ip); + + if(cachedRes.isPresent()) { + return cachedRes.get(); + } + else { + try { + VPNResponse response = FunkemunkyAPI + .getVPNResponse(ip, AntiVPN.getInstance().getVpnConfig().getLicense(), true); + + if (response.isSuccess()) { + AntiVPN.getInstance().getDatabase().cacheResponse(response); + } else { + log("Query to VPN API failed! Reason: " + response.getFailureReason()); + } + + return response; + } catch (JSONException | IOException e) { + log("Query to VPN API failed! Reason: " + e.getMessage()); + return VPNResponse.FAILED_RESPONSE; + } + } + } } diff --git a/Common/src/main/java/dev/brighten/antivpn/command/impl/ClearCacheCommand.java b/Common/src/main/java/dev/brighten/antivpn/command/impl/ClearCacheCommand.java index 0ad648c..3ff5971 100644 --- a/Common/src/main/java/dev/brighten/antivpn/command/impl/ClearCacheCommand.java +++ b/Common/src/main/java/dev/brighten/antivpn/command/impl/ClearCacheCommand.java @@ -1,7 +1,6 @@ package dev.brighten.antivpn.command.impl; import dev.brighten.antivpn.AntiVPN; -import dev.brighten.antivpn.api.VPNExecutor; import dev.brighten.antivpn.command.Command; import dev.brighten.antivpn.command.CommandExecutor; @@ -47,7 +46,6 @@ public class ClearCacheCommand extends Command { @Override public String execute(CommandExecutor executor, String[] args) { AntiVPN.getInstance().getDatabase().clearResponses(); - VPNExecutor.responseCache.clear(); return "&aCleared all cached API response information!"; } diff --git a/Common/src/main/java/dev/brighten/antivpn/command/impl/ReloadCommand.java b/Common/src/main/java/dev/brighten/antivpn/command/impl/ReloadCommand.java index dd007b4..ebba1b4 100644 --- a/Common/src/main/java/dev/brighten/antivpn/command/impl/ReloadCommand.java +++ b/Common/src/main/java/dev/brighten/antivpn/command/impl/ReloadCommand.java @@ -1,13 +1,8 @@ package dev.brighten.antivpn.command.impl; import dev.brighten.antivpn.AntiVPN; -import dev.brighten.antivpn.api.VPNExecutor; import dev.brighten.antivpn.command.Command; import dev.brighten.antivpn.command.CommandExecutor; -import dev.brighten.antivpn.database.local.H2VPN; -import dev.brighten.antivpn.database.mongo.MongoVPN; -import dev.brighten.antivpn.database.sql.MySqlVPN; -import dev.brighten.antivpn.message.VpnString; import java.util.Collections; import java.util.List; @@ -58,9 +53,6 @@ public class ReloadCommand extends Command { AntiVPN.getInstance().getMessageHandler().reloadStrings(); - // Clearing the local response cache - VPNExecutor.responseCache.clear(); - AntiVPN.getInstance().reloadDatabase(); return AntiVPN.getInstance().getMessageHandler().getString("command-reload-complete").getMessage(); diff --git a/Common/src/main/java/dev/brighten/antivpn/database/local/H2VPN.java b/Common/src/main/java/dev/brighten/antivpn/database/local/H2VPN.java index 6e2ea79..c2cd904 100644 --- a/Common/src/main/java/dev/brighten/antivpn/database/local/H2VPN.java +++ b/Common/src/main/java/dev/brighten/antivpn/database/local/H2VPN.java @@ -20,34 +20,20 @@ import java.util.function.Consumer; public class H2VPN implements VPNDatabase { - private Thread whitelistedThread; - public H2VPN() { - whitelistedThread = new Thread(() -> { - try { - Thread.sleep(TimeUnit.SECONDS.toMillis(2)); - } catch (InterruptedException e) { - e.printStackTrace(); - } - while (true) { - // Updating from database - if (AntiVPN.getInstance().getVpnConfig().isDatabaseEnabled()) { - AntiVPN.getInstance().getExecutor().getWhitelisted().clear(); - AntiVPN.getInstance().getExecutor().getWhitelisted() - .addAll(AntiVPN.getInstance().getDatabase().getAllWhitelisted()); - AntiVPN.getInstance().getExecutor().getWhitelistedIps().clear(); - AntiVPN.getInstance().getExecutor().getWhitelistedIps() - .addAll(AntiVPN.getInstance().getDatabase().getAllWhitelistedIps()); - } - try { - Thread.sleep(TimeUnit.SECONDS.toMillis(4)); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - }); + VPNExecutor.threadExecutor.scheduleAtFixedRate(() -> { + if(!AntiVPN.getInstance().getVpnConfig().isDatabaseEnabled() || MySQL.isClosed()) return; - whitelistedThread.start(); + //Refreshing whitelisted players + AntiVPN.getInstance().getExecutor().getWhitelisted().clear(); + AntiVPN.getInstance().getExecutor().getWhitelisted() + .addAll(AntiVPN.getInstance().getDatabase().getAllWhitelisted()); + + //Refreshing whitlisted IPs + AntiVPN.getInstance().getExecutor().getWhitelistedIps().clear(); + AntiVPN.getInstance().getExecutor().getWhitelistedIps() + .addAll(AntiVPN.getInstance().getDatabase().getAllWhitelistedIps()); + }, 2, 30, TimeUnit.SECONDS); } @Override diff --git a/Common/src/main/java/dev/brighten/antivpn/database/mongo/MongoVPN.java b/Common/src/main/java/dev/brighten/antivpn/database/mongo/MongoVPN.java index 6ee677c..900abd4 100644 --- a/Common/src/main/java/dev/brighten/antivpn/database/mongo/MongoVPN.java +++ b/Common/src/main/java/dev/brighten/antivpn/database/mongo/MongoVPN.java @@ -23,8 +23,22 @@ public class MongoVPN implements VPNDatabase { private MongoCollection settingsDocument, cacheDocument; private MongoClient client; - private MongoDatabase antivpnDatabase; + public MongoVPN() { + VPNExecutor.threadExecutor.scheduleAtFixedRate(() -> { + if(!AntiVPN.getInstance().getVpnConfig().isDatabaseEnabled()) return; + + //Refreshing whitelisted players + AntiVPN.getInstance().getExecutor().getWhitelisted().clear(); + AntiVPN.getInstance().getExecutor().getWhitelisted() + .addAll(AntiVPN.getInstance().getDatabase().getAllWhitelisted()); + + //Refreshing whitlisted IPs + AntiVPN.getInstance().getExecutor().getWhitelistedIps().clear(); + AntiVPN.getInstance().getExecutor().getWhitelistedIps() + .addAll(AntiVPN.getInstance().getDatabase().getAllWhitelistedIps()); + }, 2, 30, TimeUnit.SECONDS); + } @Override public Optional getStoredResponse(String ip) { Document rdoc = cacheDocument.find(Filters.eq("ip", ip)).first(); @@ -192,18 +206,20 @@ public class MongoVPN implements VPNDatabase { @Override public void init() { - if(AntiVPN.getInstance().getVpnConfig().mongoDatabaseURL().length() > 0) { //URL + if(!AntiVPN.getInstance().getVpnConfig().mongoDatabaseURL().isEmpty()) { //URL ConnectionString cs = new ConnectionString(AntiVPN.getInstance().getVpnConfig().mongoDatabaseURL()); MongoClientSettings settings = MongoClientSettings.builder().applyConnectionString(cs).build(); client = MongoClients.create(settings); } else { MongoClientSettings.Builder settingsBld = MongoClientSettings.builder().readPreference(ReadPreference.nearest()) - .applyToClusterSettings(builder -> { - builder.hosts(Collections.singletonList(new ServerAddress(AntiVPN.getInstance().getVpnConfig().getIp(), - AntiVPN.getInstance().getVpnConfig().getPort()))); - }); + .applyToClusterSettings(builder -> builder. + hosts(Collections.singletonList( + new ServerAddress( + AntiVPN.getInstance().getVpnConfig().getIp(), + AntiVPN.getInstance().getVpnConfig().getPort()) + ))); if(AntiVPN.getInstance().getVpnConfig().useDatabaseCreds()) { - settingsBld = settingsBld.credential(MongoCredential + settingsBld.credential(MongoCredential .createCredential(AntiVPN.getInstance().getVpnConfig().getUsername(), AntiVPN.getInstance().getVpnConfig().getDatabaseName(), AntiVPN.getInstance().getVpnConfig().getPassword().toCharArray())); @@ -211,7 +227,7 @@ public class MongoVPN implements VPNDatabase { client = MongoClients.create(settingsBld.build()); } - antivpnDatabase = client.getDatabase(AntiVPN.getInstance().getVpnConfig().getDatabaseName()); + MongoDatabase antivpnDatabase = client.getDatabase(AntiVPN.getInstance().getVpnConfig().getDatabaseName()); settingsDocument = antivpnDatabase.getCollection("settings"); if(settingsDocument.listIndexes().first() == null) { 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 b87dff7..1b3babd 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 @@ -20,34 +20,20 @@ import java.util.function.Consumer; public class MySqlVPN implements VPNDatabase { - private Thread whitelistedThread; - public MySqlVPN() { - whitelistedThread = new Thread(() -> { - try { - Thread.sleep(TimeUnit.SECONDS.toMillis(2)); - } catch (InterruptedException e) { - e.printStackTrace(); - } - while (true) { - // Updating from database - if (AntiVPN.getInstance().getVpnConfig().isDatabaseEnabled()) { - AntiVPN.getInstance().getExecutor().getWhitelisted().clear(); - AntiVPN.getInstance().getExecutor().getWhitelisted() - .addAll(AntiVPN.getInstance().getDatabase().getAllWhitelisted()); - AntiVPN.getInstance().getExecutor().getWhitelistedIps().clear(); - AntiVPN.getInstance().getExecutor().getWhitelistedIps() - .addAll(AntiVPN.getInstance().getDatabase().getAllWhitelistedIps()); - } - try { - Thread.sleep(TimeUnit.SECONDS.toMillis(4)); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - }); + VPNExecutor.threadExecutor.scheduleAtFixedRate(() -> { + if(!AntiVPN.getInstance().getVpnConfig().isDatabaseEnabled() || MySQL.isClosed()) return; - whitelistedThread.start(); + //Refreshing whitelisted players + AntiVPN.getInstance().getExecutor().getWhitelisted().clear(); + AntiVPN.getInstance().getExecutor().getWhitelisted() + .addAll(AntiVPN.getInstance().getDatabase().getAllWhitelisted()); + + //Refreshing whitlisted IPs + AntiVPN.getInstance().getExecutor().getWhitelistedIps().clear(); + AntiVPN.getInstance().getExecutor().getWhitelistedIps() + .addAll(AntiVPN.getInstance().getDatabase().getAllWhitelistedIps()); + }, 2, 30, TimeUnit.SECONDS); } @Override diff --git a/Common/src/main/java/dev/brighten/antivpn/depends/URLClassLoaderAccess.java b/Common/src/main/java/dev/brighten/antivpn/depends/URLClassLoaderAccess.java index 54c1100..a0159f0 100644 --- a/Common/src/main/java/dev/brighten/antivpn/depends/URLClassLoaderAccess.java +++ b/Common/src/main/java/dev/brighten/antivpn/depends/URLClassLoaderAccess.java @@ -104,7 +104,7 @@ public abstract class URLClassLoaderAccess { /** * Accesses using sun.misc.Unsafe, supported on Java 9+. * - * @author Vaishnav Anil (https://github.com/slimjar/slimjar) + * @author Vaishnav Anil (...) */ private static class Unsafe extends URLClassLoaderAccess { private static final sun.misc.Unsafe UNSAFE; diff --git a/Common/src/main/java/dev/brighten/antivpn/web/objects/VPNResponse.java b/Common/src/main/java/dev/brighten/antivpn/web/objects/VPNResponse.java index a36a06d..645200e 100644 --- a/Common/src/main/java/dev/brighten/antivpn/web/objects/VPNResponse.java +++ b/Common/src/main/java/dev/brighten/antivpn/web/objects/VPNResponse.java @@ -2,7 +2,9 @@ package dev.brighten.antivpn.web.objects; import dev.brighten.antivpn.utils.json.JSONException; import dev.brighten.antivpn.utils.json.JSONObject; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; @Data @AllArgsConstructor @@ -39,14 +41,18 @@ public class VPNResponse { * * @param json String * @return VPNResponse - * @throws JSONException */ public static VPNResponse fromJson(String json) throws JSONException { return fromJson(new JSONObject(json)); } + public static final VPNResponse FAILED_RESPONSE = VPNResponse.builder() + .success(false) + .failureReason("Internal plugin API error.") + .build(); + /** - * Formats response from https://funkemunky.cc/vpn into {@link VPNResponse} for project use. + * Formats response from ... into {@link VPNResponse} for project use. * * @param jsonObject JSONObject * @return VPNResponse diff --git a/Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityListener.java b/Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityListener.java index e11c2ac..7277244 100644 --- a/Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityListener.java +++ b/Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityListener.java @@ -22,7 +22,7 @@ public class VelocityListener extends VPNExecutor { private ScheduledTask cacheResetTask; private final Cache responseCache = CacheBuilder.newBuilder() .expireAfterWrite(5, TimeUnit.MINUTES) - .maximumSize(10000) + .maximumSize(2000) .build(); @@ -63,7 +63,7 @@ public class VelocityListener extends VPNExecutor { if (result.isSuccess()) { // If the countryList() size is zero, no need to check. // Running country check first - if (AntiVPN.getInstance().getVpnConfig().countryList().size() > 0 + if (!AntiVPN.getInstance().getVpnConfig().countryList().isEmpty() && !(AntiVPN.getInstance().getExecutor() .isWhitelisted(event.getPlayer().getUniqueId()) //Is exempt //Or has a name that starts with a certain prefix. This is for Bedrock exempting. @@ -77,7 +77,7 @@ public class VelocityListener extends VPNExecutor { .contains(result.getCountryCode()) != AntiVPN.getInstance().getVpnConfig().whitelistCountries()) { //Using our built in kicking system if no commands are configured - if (AntiVPN.getInstance().getVpnConfig().countryKickCommands().size() == 0) { + if (AntiVPN.getInstance().getVpnConfig().countryKickCommands().isEmpty()) { final String kickReason = AntiVPN.getInstance().getVpnConfig() .countryVanillaKickReason(); // Kicking our player @@ -152,14 +152,6 @@ public class VelocityListener extends VPNExecutor { }); } - @Override - public void runCacheReset() { - cacheResetTask = VelocityPlugin.INSTANCE.getServer().getScheduler() - .buildTask(VelocityPlugin.INSTANCE, this::resetCache) - .repeat(20, TimeUnit.MINUTES) - .schedule(); - } - @Override public void shutdown() { if (cacheResetTask != null) {