diff --git a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitConfig.java b/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitConfig.java deleted file mode 100644 index d4daec3..0000000 --- a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitConfig.java +++ /dev/null @@ -1,199 +0,0 @@ -package dev.brighten.antivpn.bukkit; - -import dev.brighten.antivpn.api.VPNConfig; -import dev.brighten.antivpn.bukkit.util.ConfigDefault; -import org.bukkit.Bukkit; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -public class BukkitConfig implements VPNConfig { - private final ConfigDefault licenseDefault = new ConfigDefault<>("", - "license", BukkitPlugin.pluginInstance), kickStringDefault = - new ConfigDefault<>("Proxies are not allowed on our server", - "kickMessage", BukkitPlugin.pluginInstance), - defaultDatabaseType = new ConfigDefault<>("H2", - "database.type", BukkitPlugin.pluginInstance), - defaultDatabaseName = new ConfigDefault<>("kaurivpn", - "database.database", BukkitPlugin.pluginInstance), - defaultMongoURL = new ConfigDefault<>("", "database.mongoURL", BukkitPlugin.pluginInstance), - defaultUsername = new ConfigDefault<>("root", - "database.username", BukkitPlugin.pluginInstance), - defaultPassword = new ConfigDefault<>("password", - "database.password", BukkitPlugin.pluginInstance), - - - defaultIp = new ConfigDefault<>("localhost", "database.ip", BukkitPlugin.pluginInstance), - defaultAlertMsg = new ConfigDefault<>("&8[&6KauriVPN&8] &e%player% &7has joined on a VPN/proxy" + - " &8(&f%reason%&8) &7in location &8(&f%city%&7, &f%country%&8)", "alerts.message", - BukkitPlugin.pluginInstance); - private final ConfigDefault cacheResultsDefault = new ConfigDefault<>(true, - "cachedResults", BukkitPlugin.pluginInstance), - defaultUseCredentials = new ConfigDefault<>(true, - "database.useCredentials", BukkitPlugin.pluginInstance), - defaultDatabaseEnabled = new ConfigDefault<>(false, "database.enabled", - BukkitPlugin.pluginInstance), defaultCommandsEnable = new ConfigDefault<>(false, - "commands.enabled", BukkitPlugin.pluginInstance), defaultKickPlayers - = new ConfigDefault<>(true, "kickPlayers", BukkitPlugin.pluginInstance), - defaultAlertToStaff = new ConfigDefault<>(true, "alerts.enabled", - BukkitPlugin.pluginInstance), - defaultMetrics = new ConfigDefault<>(true, "bstats", BukkitPlugin.pluginInstance); - private final ConfigDefault - defaultPort = new ConfigDefault<>(-1, "database.port", BukkitPlugin.pluginInstance); - private final ConfigDefault> prefixWhitelistsDefault = new ConfigDefault<>(new ArrayList<>(), - "prefixWhitelists", BukkitPlugin.pluginInstance), defaultCommands = new ConfigDefault<>( - Collections.singletonList("kick %player% VPNs are not allowed on our server!"), "commands.execute", - BukkitPlugin.pluginInstance), - defBlockedCountries = new ConfigDefault<>(new ArrayList<>(), "blockedCountries", - BukkitPlugin.pluginInstance), - defAllowedCountries = new ConfigDefault<>(new ArrayList<>(), "allowedCountries", - BukkitPlugin.pluginInstance); - - private String license, kickMessage, databaseType, databaseName, mongoURL, username, password, ip, alertMsg; - private List prefixWhitelists, commands, allowedCountries, blockedCountries; - private int port; - private boolean cacheResults, databaseEnabled, useCredentials, commandsEnabled, kickPlayers, alertToStaff, metrics; - - @Override - public String getLicense() { - return license; - } - - @Override - public boolean cachedResults() { - return cacheResults; - } - - @Override - public String getKickString() { - return kickMessage; - } - - @Override - public String alertMessage() { - return alertMsg; - } - - @Override - public boolean alertToStaff() { - return alertToStaff; - } - - @Override - public boolean runCommands() { - return commandsEnabled; - } - - @Override - public List commands() { - return commands; - } - - @Override - public boolean kickPlayersOnDetect() { - return kickPlayers; - } - - @Override - public List getPrefixWhitelists() { - return prefixWhitelists; - } - - @Override - public boolean isDatabaseEnabled() { - return databaseEnabled; - } - - @Override - public boolean useDatabaseCreds() { - return useCredentials; - } - - @Override - public String mongoDatabaseURL() { - return mongoURL; - } - - @Override - public String getDatabaseType() { - return databaseType; - } - - @Override - public String getDatabaseName() { - return databaseName; - } - - @Override - public String getUsername() { - return username; - } - - @Override - public String getPassword() { - return password; - } - - @Override - public String getIp() { - return ip; - } - - @Override - public List allowedCountries() { - return allowedCountries; - } - - @Override - public List blockedCountries() { - return blockedCountries; - } - - @Override - public int getPort() { - if(port == -1) { - switch (getDatabaseType().toLowerCase()) { - case "mongodb": - case "mongo": - case "mongod": - return 27017; - case "sql": - case "mysql": - return 3306; - } - } - - return port; - } - - @Override - public boolean metrics() { - return metrics; - } - - public void update() { - license = licenseDefault.get(); - kickMessage = kickStringDefault.get(); - cacheResults = cacheResultsDefault.get(); - prefixWhitelists = prefixWhitelistsDefault.get(); - databaseEnabled = defaultDatabaseEnabled.get(); - useCredentials = defaultUseCredentials.get(); - databaseType = defaultDatabaseType.get(); - databaseName = defaultDatabaseName.get(); - mongoURL = defaultMongoURL.get(); - username = defaultUsername.get(); - password = defaultPassword.get(); - ip = defaultIp.get(); - port = defaultPort.get(); - commandsEnabled = defaultCommandsEnable.get(); - commands = defaultCommands.get(); - kickPlayers = defaultKickPlayers.get(); - alertToStaff = defaultAlertToStaff.get(); - alertMsg = defaultAlertMsg.get(); - metrics = defaultMetrics.get(); - blockedCountries = defBlockedCountries.get(); - allowedCountries = defAllowedCountries.get(); - } -} 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 6cb0e35..bb369a2 100644 --- a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitListener.java +++ b/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitListener.java @@ -73,7 +73,7 @@ public class BukkitListener extends VPNExecutor implements Listener { //If they're exempt, don't check. if(AntiVPN.getInstance().getExecutor().isWhitelisted(event.getPlayer().getUniqueId()) || AntiVPN.getInstance().getExecutor().isWhitelisted(event.getAddress().getHostAddress())) return; - checkIp(event.getAddress().getHostAddress(), AntiVPN.getInstance().getConfig().cachedResults(), result -> { + checkIp(event.getAddress().getHostAddress(), AntiVPN.getInstance().getVpnConfig().cachedResults(), result -> { if(result.isSuccess() && result.isProxy()) { new BukkitRunnable() { public void run() { @@ -81,25 +81,25 @@ public class BukkitListener extends VPNExecutor implements Listener { 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() + && AntiVPN.getInstance().getVpnConfig().getPrefixWhitelists().stream() .noneMatch(prefix -> player.getName().startsWith(prefix))) { - if (AntiVPN.getInstance().getConfig().kickPlayersOnDetect()) + if (AntiVPN.getInstance().getVpnConfig().kickPlayersOnDetect()) player.kickPlayer(ChatColor.translateAlternateColorCodes('&', - AntiVPN.getInstance().getConfig().getKickString())); + AntiVPN.getInstance().getVpnConfig().getKickString())); //Ensuring the user wishes to alert to staff - if(AntiVPN.getInstance().getConfig().alertToStaff()) + if(AntiVPN.getInstance().getVpnConfig().alertToStaff()) AntiVPN.getInstance().getPlayerExecutor().getOnlinePlayers().stream() .filter(APIPlayer::isAlertsEnabled) - .forEach(pl -> pl.sendMessage(AntiVPN.getInstance().getConfig() + .forEach(pl -> pl.sendMessage(AntiVPN.getInstance().getVpnConfig() .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()) { + if(AntiVPN.getInstance().getVpnConfig().runCommands()) + for (String command : AntiVPN.getInstance().getVpnConfig().commands()) { Bukkit.dispatchCommand(Bukkit.getConsoleSender(), ChatColor.translateAlternateColorCodes('&', command.replace("%player%", event.getPlayer().getName()))); 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 8282a13..74428e8 100644 --- a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlugin.java +++ b/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlugin.java @@ -1,14 +1,13 @@ package dev.brighten.antivpn.bukkit; import dev.brighten.antivpn.AntiVPN; -import dev.brighten.antivpn.bukkit.util.ConfigDefault; import dev.brighten.antivpn.command.Command; +import dev.brighten.antivpn.utils.ConfigDefault; import dev.brighten.antivpn.utils.MiscUtils; import dev.brighten.antivpn.utils.config.Configuration; import lombok.val; import net.md_5.bungee.api.ChatColor; import org.bstats.bukkit.Metrics; -import org.bstats.charts.MultiLineChart; import org.bstats.charts.SingleLineChart; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; @@ -46,9 +45,9 @@ public class BukkitPlugin extends JavaPlugin { } Bukkit.getLogger().info("Starting AntiVPN services..."); - AntiVPN.start(new BukkitConfig(), new BukkitListener(), new BukkitPlayerExecutor(), getDataFolder()); + AntiVPN.start(new BukkitListener(), new BukkitPlayerExecutor(), getDataFolder()); - if(AntiVPN.getInstance().getConfig().metrics()) { + if(AntiVPN.getInstance().getVpnConfig().metrics()) { Bukkit.getLogger().info("Starting bStats metrics..."); Metrics metrics = new Metrics(this, 12615); metrics.addCustomChart(vpnDetections = new SingleLineChart("vpn_detections", @@ -136,7 +135,7 @@ public class BukkitPlugin extends JavaPlugin { } AntiVPN.getInstance().getMessageHandler().initStrings(vpnString -> new ConfigDefault<> - (vpnString.getDefaultMessage(), "messages." + vpnString.getKey(), BukkitPlugin.pluginInstance) + (vpnString.getDefaultMessage(), "messages." + vpnString.getKey(), AntiVPN.getInstance()) .get()); //TODO Finish system before implementing on startup /*Bukkit.getLogger().info("Getting strings..."); diff --git a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/util/ConfigDefault.java b/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/util/ConfigDefault.java deleted file mode 100644 index d5c2477..0000000 --- a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/util/ConfigDefault.java +++ /dev/null @@ -1,32 +0,0 @@ -package dev.brighten.antivpn.bukkit.util; - -import dev.brighten.antivpn.utils.MiscUtils; -import dev.brighten.antivpn.utils.config.Configuration; -import lombok.AllArgsConstructor; -import org.bukkit.plugin.Plugin; - -import java.io.File; - -@AllArgsConstructor -public class ConfigDefault { - - private final A defaultValue; - private final String path; - private final Plugin plugin; - - public A get() { - if(plugin.getConfig().get(path) != null) - return (A) plugin.getConfig().get(path); - else { - plugin.getConfig().set(path, defaultValue); - plugin.saveConfig(); - return defaultValue; - } - } - - public A set(A value) { - plugin.getConfig().set(path, value); - - return value; - } -} diff --git a/Bukkit/src/main/resources/config.yml b/Bukkit/src/main/resources/config.yml deleted file mode 100644 index 2f61a3f..0000000 --- a/Bukkit/src/main/resources/config.yml +++ /dev/null @@ -1,46 +0,0 @@ -##################################################### -# KauriVPN Config # -# by Brighten Development # -##################################################### -# If you find that you run out of your free 20,000 queries, you may purchase a license on https://funkemunky.cc/shop -license: '' -# Message only sent with commands disabled below. Supports color codes ('&') -kickMessage: Proxies are not allowed on our server -# Caching results will lower your query usage, but results may be out of date. -cachedResults: true -# All players with any of the following characters in the beginning of their name will be whitelisted -# This is a useful feature for servers that allow players through Geyser and their IPs are not forwarded, causing -# players to be removed falsely for use of proxy. -prefixWhitelists: [] -# Configure your database here. -database: - enabled: false # Enable to cache queries and save alerts state beyond restarts - useCredentials: true - type: MySQL #Options Mongo and MySQL - database: kaurivpn # The database name you would like to use - mongoURL: '' # Can be used if you prefer to authenticate via Mongo URL - username: root # Your database username - password: password # Your database password - ip: localhost #The IP of your database goes here - port: -1 #-1 will use default port of databases (MySQL:3306, Mongo:27017). Otherwise, enter alternative ports here. -commands: - # Enable this to override the default kick function of the plugin with your own commands - enabled: false - # List of commands to run when a player is detected to be using a proxy. Supports color codes ('&') - execute: - - kick %player% VPNs are not allowed on our server! -# Enable/disable the default kicking feature of KauriVPN. -kickPlayers: true -# Configure all alerting functionality -alerts: - # You may set to 'false' to disable all alerts functionality - enabled: true - # Message to send to users with alerts enabled - # Placeholders: %country% (Country name), %player% (Player name), %reason% (Proxy detection method), - # %city% (City name). - message: '&8[&6KauriVPN&8] &e%player% &7has joined on a VPN/proxy &8(&f%reason%&8) - &7in location &8(&f%city%&7, &f%country%&8)' -# This will disable any information being sent to https://bstats.org. We recommend you keep this enabled as it helps -# us understand our users and put effort where it is needed. All information sent goes under their privacy as seen -# here: https://bstats.org/privacy-policy -bstats: true diff --git a/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeeConfig.java b/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeeConfig.java deleted file mode 100644 index 9e0598a..0000000 --- a/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeeConfig.java +++ /dev/null @@ -1,195 +0,0 @@ -package dev.brighten.antivpn.bungee; - -import dev.brighten.antivpn.api.VPNConfig; -import dev.brighten.antivpn.bungee.util.ConfigDefault; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public class BungeeConfig implements VPNConfig { - private final ConfigDefault licenseDefault = new ConfigDefault<>("", - "license", BungeePlugin.pluginInstance), kickStringDefault = - new ConfigDefault<>("Proxies are not allowed on our server", - "kickMessage", BungeePlugin.pluginInstance), - defaultDatabaseType = new ConfigDefault<>("H2", - "database.type", BungeePlugin.pluginInstance), - defaultDatabaseName = new ConfigDefault<>("kaurivpn", - "database.database", BungeePlugin.pluginInstance), - defaultMongoURL = new ConfigDefault<>("", "database.mongoURL", BungeePlugin.pluginInstance), - defaultUsername = new ConfigDefault<>("root", - "database.username", BungeePlugin.pluginInstance), - defaultPassword = new ConfigDefault<>("password", - "database.password", BungeePlugin.pluginInstance), - defaultIp = new ConfigDefault<>("localhost", "database.ip", BungeePlugin.pluginInstance), - defaultAlertMsg = new ConfigDefault<>("&8[&6KauriVPN&8] &e%player% &7has joined on a VPN/proxy" + - " &8(&f%reason%&8) &7in location &8(&f%city%&7, &f%country%&8)", "alerts.message", - BungeePlugin.pluginInstance); - private final ConfigDefault cacheResultsDefault = new ConfigDefault<>(true, - "cachedResults", BungeePlugin.pluginInstance), - defaultDatabaseEnabled = new ConfigDefault<>(false, "database.enabled", - BungeePlugin.pluginInstance), defaultCommandsEnable = new ConfigDefault<>(false, - "commands.enabled", BungeePlugin.pluginInstance), defaultKickPlayers - = new ConfigDefault<>(true, "kickPlayers", BungeePlugin.pluginInstance), - defaultAlertToStaff = new ConfigDefault<>(true, "alerts.enabled", - BungeePlugin.pluginInstance), - defaultUseCredentials = new ConfigDefault<>(true, - "database.useCredentials", BungeePlugin.pluginInstance), - defaultMetrics = new ConfigDefault<>(true, "bstats", BungeePlugin.pluginInstance); - private final ConfigDefault - defaultPort = new ConfigDefault<>(-1, "database.port", BungeePlugin.pluginInstance); - private final ConfigDefault> prefixWhitelistsDefault = new ConfigDefault<>(new ArrayList<>(), - "prefixWhitelists", BungeePlugin.pluginInstance), defaultCommands = new ConfigDefault<>( - Collections.singletonList("kick %player% VPNs are not allowed on our server!"), "commands.execute", - BungeePlugin.pluginInstance), - defBlockedCountries = new ConfigDefault<>(new ArrayList<>(), "blockedCountries", - BungeePlugin.pluginInstance), - defAllowedCountries = new ConfigDefault<>(new ArrayList<>(), "allowedCountries", - BungeePlugin.pluginInstance); - - private String license, kickMessage, databaseType, databaseName, mongoURL, username, password, ip, alertMsg; - private List prefixWhitelists, commands, allowedCountries, blockedCountries; - private int port; - private boolean cacheResults, useCredentials, databaseEnabled, commandsEnabled, kickPlayers, alertToStaff, metrics; - - @Override - public String getLicense() { - return license; - } - - @Override - public boolean cachedResults() { - return cacheResults; - } - - @Override - public String getKickString() { - return kickMessage; - } - - @Override - public String alertMessage() { - return alertMsg; - } - - @Override - public boolean alertToStaff() { - return alertToStaff; - } - - @Override - public boolean runCommands() { - return commandsEnabled; - } - - @Override - public List commands() { - return commands; - } - - @Override - public boolean kickPlayersOnDetect() { - return kickPlayers; - } - - @Override - public List getPrefixWhitelists() { - return prefixWhitelists; - } - - @Override - public boolean isDatabaseEnabled() { - return databaseEnabled; - } - - @Override - public boolean useDatabaseCreds() { - return useCredentials; - } - - @Override - public String mongoDatabaseURL() { - return mongoURL; - } - - @Override - public String getDatabaseType() { - return databaseType; - } - - @Override - public String getDatabaseName() { - return databaseName; - } - - @Override - public String getUsername() { - return username; - } - - @Override - public String getPassword() { - return password; - } - - @Override - public String getIp() { - return ip; - } - - @Override - public List allowedCountries() { - return allowedCountries; - } - - @Override - public List blockedCountries() { - return blockedCountries; - } - - @Override - public int getPort() { - if(port == -1) { - switch (getDatabaseType().toLowerCase()) { - case "mongodb": - case "mongo": - case "mongod": - return 27017; - case "sql": - case "mysql": - return 3306; - } - } - - return port; - } - - @Override - public boolean metrics() { - return metrics; - } - - public void update() { - license = licenseDefault.get(); - kickMessage = kickStringDefault.get(); - cacheResults = cacheResultsDefault.get(); - prefixWhitelists = prefixWhitelistsDefault.get(); - databaseEnabled = defaultDatabaseEnabled.get(); - useCredentials = defaultUseCredentials.get(); - databaseType = defaultDatabaseType.get(); - databaseName = defaultDatabaseName.get(); - mongoURL = defaultMongoURL.get(); - username = defaultUsername.get(); - password = defaultPassword.get(); - ip = defaultIp.get(); - port = defaultPort.get(); - commandsEnabled = defaultCommandsEnable.get(); - commands = defaultCommands.get(); - kickPlayers = defaultKickPlayers.get(); - alertToStaff = defaultAlertToStaff.get(); - alertMsg = defaultAlertMsg.get(); - metrics = defaultMetrics.get(); - blockedCountries = defBlockedCountries.get(); - allowedCountries = defAllowedCountries.get(); - } -} 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 2c23438..66b7fa3 100644 --- a/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeeListener.java +++ b/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeeListener.java @@ -52,31 +52,31 @@ public class BungeeListener extends VPNExecutor implements Listener { //Or has a name that starts with a certain prefix. This is for Bedrock exempting. || AntiVPN.getInstance().getExecutor().isWhitelisted(event.getPlayer().getAddress().getAddress() .getHostAddress()) - || AntiVPN.getInstance().getConfig().getPrefixWhitelists().stream() + || AntiVPN.getInstance().getVpnConfig().getPrefixWhitelists().stream() .anyMatch(prefix -> event.getPlayer().getName().startsWith(prefix))) return; checkIp(event.getPlayer().getAddress().getAddress().getHostAddress(), - AntiVPN.getInstance().getConfig().cachedResults(), result -> { + AntiVPN.getInstance().getVpnConfig().cachedResults(), result -> { if(result.isSuccess() && result.isProxy()) { - if(AntiVPN.getInstance().getConfig().kickPlayersOnDetect()) + if(AntiVPN.getInstance().getVpnConfig().kickPlayersOnDetect()) event.getPlayer().disconnect(TextComponent.fromLegacyText(ChatColor .translateAlternateColorCodes('&', - AntiVPN.getInstance().getConfig().getKickString()))); + AntiVPN.getInstance().getVpnConfig().getKickString()))); BungeeCord.getInstance().getLogger().info(event.getPlayer().getName() + " joined on a VPN/Proxy (" + result.getMethod() + ")"); - if(AntiVPN.getInstance().getConfig().alertToStaff()) //Ensuring the user wishes to alert to staff + if(AntiVPN.getInstance().getVpnConfig().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().getVpnConfig().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()) { + if(AntiVPN.getInstance().getVpnConfig().runCommands()) { + for (String command : AntiVPN.getInstance().getVpnConfig().commands()) { BungeeCord.getInstance().getPluginManager() .dispatchCommand(BungeeCord.getInstance().getConsole(), ChatColor.translateAlternateColorCodes('&', 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 9ed49ea..d87dba8 100644 --- a/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeePlugin.java +++ b/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeePlugin.java @@ -1,10 +1,8 @@ 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 dev.brighten.antivpn.utils.ConfigDefault; import lombok.val; import net.md_5.bungee.BungeeCord; import net.md_5.bungee.api.ChatColor; @@ -24,8 +22,6 @@ public class BungeePlugin extends Plugin { public static BungeePlugin pluginInstance; - @Getter - private Config config; private SingleLineChart vpnDetections, ipsChecked; private static final BaseComponent[] noPermission = new ComponentBuilder("No permission").color(ChatColor.RED) @@ -37,14 +33,13 @@ public class BungeePlugin extends Plugin { //Setting up config 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(), getDataFolder()); + AntiVPN.start(new BungeeListener(), new BungeePlayerExecutor(), getDataFolder()); - if(AntiVPN.getInstance().getConfig().metrics()) { + if(AntiVPN.getInstance().getVpnConfig().metrics()) { BungeeCord.getInstance().getLogger().info("Starting bStats metrics..."); Metrics metrics = new Metrics(this, 12616); metrics.addCustomChart(vpnDetections = new SingleLineChart("vpn_detections", @@ -103,7 +98,7 @@ 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) + (vpnString.getDefaultMessage(), "messages." + vpnString.getKey(), AntiVPN.getInstance()) .get()); //TODO Finish system before implementing on startup /*BungeeCord.getInstance().getLogger().info("Getting strings..."); diff --git a/Bungee/src/main/java/dev/brighten/antivpn/bungee/util/Config.java b/Bungee/src/main/java/dev/brighten/antivpn/bungee/util/Config.java deleted file mode 100644 index 28dc453..0000000 --- a/Bungee/src/main/java/dev/brighten/antivpn/bungee/util/Config.java +++ /dev/null @@ -1,114 +0,0 @@ -package dev.brighten.antivpn.bungee.util; - -import com.google.common.io.ByteStreams; -import dev.brighten.antivpn.bungee.BungeePlugin; -import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.config.Configuration; -import net.md_5.bungee.config.ConfigurationProvider; -import net.md_5.bungee.config.YamlConfiguration; - -import java.io.*; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -/** - * Author: nitramleo (Martin) - * Date created: 10-Aug-18 - */ -public class Config { - - private File file; - private Configuration configuration; - - public Config() { - this.file = new File(BungeePlugin.pluginInstance.getDataFolder(), "config.yml"); - try { - if (!this.file.exists()) { - if (!BungeePlugin.pluginInstance.getDataFolder().exists()) { - BungeePlugin.pluginInstance.getDataFolder().mkdir(); - } - this.file.createNewFile(); - try (final InputStream is = BungeePlugin.pluginInstance.getResourceAsStream("config.yml"); - final OutputStream os = new FileOutputStream(this.file)) { - ByteStreams.copy(is, os); - } - } - this.configuration = ConfigurationProvider.getProvider(YamlConfiguration.class).load(this.file); - } - catch (IOException e) { - e.printStackTrace(); - } - } - - public void load() { - this.file = new File(BungeePlugin.pluginInstance.getDataFolder(), "config.yml"); - try { - this.configuration = ConfigurationProvider.getProvider(YamlConfiguration.class).load(this.file); - } - catch (IOException e) { - e.printStackTrace(); - } - } - - public void save() { - try { - ConfigurationProvider.getProvider( YamlConfiguration.class).save(this.configuration, this.file); - } - catch (IOException e) { - e.printStackTrace(); - } - } - - public Configuration getConfiguration() { - return this.configuration; - } - - public File getFile() { - return this.file; - } - - public double getDouble(final String path) { - if (this.configuration.get(path) != null) { - return this.configuration.getDouble(path); - } - return 0.0; - } - - public int getInt(final String path) { - if (this.configuration.get(path) != null) { - return this.configuration.getInt(path); - } - return 0; - } - - public Object get(final String path) { - return this.configuration.get(path); - } - - public void set(final String path, final Object object) { - configuration.set(path, object); - } - - public boolean getBoolean(final String path) { - return this.configuration.get(path) != null && this.configuration.getBoolean(path); - } - - public String getString(final String path) { - if (this.configuration.get(path) != null) { - return ChatColor.translateAlternateColorCodes('&', this.configuration.getString(path)); - } - return "String at path: " + path + " not found!"; - } - - public List getStringList(final String path) { - if (this.configuration.get(path) != null) { - final ArrayList strings = new ArrayList(); - for (final String string : this.configuration.getStringList(path)) { - strings.add(ChatColor.translateAlternateColorCodes('&', string)); - } - return strings; - } - return Arrays.asList("String List at path: " + path + " not found!"); - } -} diff --git a/Common/pom.xml b/Common/pom.xml index 8bef495..8573408 100644 --- a/Common/pom.xml +++ b/Common/pom.xml @@ -67,7 +67,7 @@ org.yaml snakeyaml - 1.15 + 1.30 compile diff --git a/Common/src/main/java/dev/brighten/antivpn/AntiVPN.java b/Common/src/main/java/dev/brighten/antivpn/AntiVPN.java index 9a9aef4..07a1215 100644 --- a/Common/src/main/java/dev/brighten/antivpn/AntiVPN.java +++ b/Common/src/main/java/dev/brighten/antivpn/AntiVPN.java @@ -9,7 +9,11 @@ import dev.brighten.antivpn.database.VPNDatabase; import dev.brighten.antivpn.database.mongo.MongoVPN; import dev.brighten.antivpn.database.sql.MySqlVPN; import dev.brighten.antivpn.message.MessageHandler; +import dev.brighten.antivpn.utils.MiscUtils; import dev.brighten.antivpn.utils.VPNResponse; +import dev.brighten.antivpn.utils.config.Configuration; +import dev.brighten.antivpn.utils.config.ConfigurationProvider; +import dev.brighten.antivpn.utils.config.YamlConfiguration; import dev.brighten.antivpn.utils.json.JSONException; import dev.brighten.antivpn.utils.json.JSONObject; import dev.brighten.antivpn.utils.json.JsonReader; @@ -19,6 +23,9 @@ import lombok.Setter; import java.io.File; import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; import java.util.ArrayList; import java.util.List; @@ -27,31 +34,44 @@ import java.util.List; public class AntiVPN { private static AntiVPN INSTANCE; - private VPNConfig config; + private VPNConfig vpnConfig; private VPNExecutor executor; private PlayerExecutor playerExecutor; private VPNDatabase database; private MessageHandler messageHandler; + private Configuration config; private List commands = new ArrayList<>(); public int detections, checked; private File pluginFolder; - public static void start(VPNConfig config, VPNExecutor executor, PlayerExecutor playerExecutor, File pluginFolder) { + public static void start(VPNExecutor executor, PlayerExecutor playerExecutor, File pluginFolder) { //Initializing INSTANCE = new AntiVPN(); INSTANCE.pluginFolder = pluginFolder; - INSTANCE.config = config; INSTANCE.executor = executor; INSTANCE.playerExecutor = playerExecutor; + try { + File configFile = new File(pluginFolder, "config.yml"); + if(!configFile.exists()){ + configFile.getParentFile().mkdirs(); + MiscUtils.copy(INSTANCE.getResource( "config.yml"), configFile); + } + INSTANCE.config = ConfigurationProvider.getProvider(YamlConfiguration.class) + .load(configFile); + } catch (IOException e) { + e.printStackTrace(); + } + + INSTANCE.vpnConfig = new VPNConfig(); INSTANCE.executor.registerListeners(); - INSTANCE.config.update(); + INSTANCE.vpnConfig.update(); INSTANCE.messageHandler = new MessageHandler(); - switch(INSTANCE.config.getDatabaseType().toLowerCase()) { + switch(INSTANCE.vpnConfig.getDatabaseType().toLowerCase()) { case "mysql": case "h2": case "sql":{ @@ -68,7 +88,7 @@ public class AntiVPN { break; } default: { - AntiVPN.getInstance().getExecutor().log("Could not find database type \"" + INSTANCE.config.getDatabaseType() + "\". " + + AntiVPN.getInstance().getExecutor().log("Could not find database type \"" + INSTANCE.vpnConfig.getDatabaseType() + "\". " + "Options: [MySQL]"); break; } @@ -88,6 +108,25 @@ public class AntiVPN { }); } + public InputStream getResource(String filename) { + if (filename == null) { + throw new IllegalArgumentException("Filename cannot be null"); + } else { + try { + URL url = executor.getClass().getClassLoader().getResource(filename); + if (url == null) { + return null; + } else { + URLConnection connection = url.openConnection(); + connection.setUseCaches(false); + return connection.getInputStream(); + } + } catch (IOException var4) { + return null; + } + } + } + public void stop() { executor.shutdown(); if(database != null) database.shutdown(); @@ -99,6 +138,15 @@ public class AntiVPN { return INSTANCE; } + public void saveConfig() { + try { + ConfigurationProvider.getProvider(YamlConfiguration.class) + .save(getConfig(), new File(pluginFolder.getPath() + File.separator + "config.yml")); + } catch (IOException e) { + e.printStackTrace(); + } + } + public static VPNResponse getVPNResponse(String ip, String license, boolean cachedResults /* faster if set to true*/) throws JSONException, IOException { JSONObject result = JsonReader.readJsonFromUrl(String diff --git a/Common/src/main/java/dev/brighten/antivpn/api/VPNConfig.java b/Common/src/main/java/dev/brighten/antivpn/api/VPNConfig.java index 3927507..b6d700a 100644 --- a/Common/src/main/java/dev/brighten/antivpn/api/VPNConfig.java +++ b/Common/src/main/java/dev/brighten/antivpn/api/VPNConfig.java @@ -1,51 +1,181 @@ package dev.brighten.antivpn.api; +import dev.brighten.antivpn.AntiVPN; +import dev.brighten.antivpn.utils.ConfigDefault; + +import java.util.ArrayList; +import java.util.Collections; import java.util.List; -public interface VPNConfig { +public class VPNConfig { + private final ConfigDefault licenseDefault = new ConfigDefault<>("", + "license", AntiVPN.getInstance()), kickStringDefault = + new ConfigDefault<>("Proxies are not allowed on our server", + "kickMessage", AntiVPN.getInstance()), + defaultDatabaseType = new ConfigDefault<>("H2", + "database.type", AntiVPN.getInstance()), + defaultDatabaseName = new ConfigDefault<>("kaurivpn", + "database.database", AntiVPN.getInstance()), + defaultMongoURL = new ConfigDefault<>("", "database.mongoURL", AntiVPN.getInstance()), + defaultUsername = new ConfigDefault<>("root", + "database.username", AntiVPN.getInstance()), + defaultPassword = new ConfigDefault<>("password", + "database.password", AntiVPN.getInstance()), - String getLicense(); - boolean cachedResults(); + defaultIp = new ConfigDefault<>("localhost", "database.ip", AntiVPN.getInstance()), + defaultAlertMsg = new ConfigDefault<>("&8[&6KauriVPN&8] &e%player% &7has joined on a VPN/proxy" + + " &8(&f%reason%&8) &7in location &8(&f%city%&7, &f%country%&8)", "alerts.message", + AntiVPN.getInstance()); + private final ConfigDefault cacheResultsDefault = new ConfigDefault<>(true, + "cachedResults", AntiVPN.getInstance()), + defaultUseCredentials = new ConfigDefault<>(true, + "database.useCredentials", AntiVPN.getInstance()), + defaultDatabaseEnabled = new ConfigDefault<>(false, "database.enabled", + AntiVPN.getInstance()), defaultCommandsEnable = new ConfigDefault<>(false, + "commands.enabled", AntiVPN.getInstance()), defaultKickPlayers + = new ConfigDefault<>(true, "kickPlayers", AntiVPN.getInstance()), + defaultAlertToStaff = new ConfigDefault<>(true, "alerts.enabled", + AntiVPN.getInstance()), + defaultMetrics = new ConfigDefault<>(true, "bstats", AntiVPN.getInstance()); + private final ConfigDefault + defaultPort = new ConfigDefault<>(-1, "database.port", AntiVPN.getInstance()); + private final ConfigDefault> prefixWhitelistsDefault = new ConfigDefault<>(new ArrayList<>(), + "prefixWhitelists", AntiVPN.getInstance()), defaultCommands = new ConfigDefault<>( + Collections.singletonList("kick %player% VPNs are not allowed on our server!"), "commands.execute", + AntiVPN.getInstance()), + defBlockedCountries = new ConfigDefault<>(new ArrayList<>(), "blockedCountries", + AntiVPN.getInstance()), + defAllowedCountries = new ConfigDefault<>(new ArrayList<>(), "allowedCountries", + AntiVPN.getInstance()); - String getKickString(); + private String license, kickMessage, databaseType, databaseName, mongoURL, username, password, ip, alertMsg; + private List prefixWhitelists, commands, allowedCountries, blockedCountries; + private int port; + private boolean cacheResults, databaseEnabled, useCredentials, commandsEnabled, kickPlayers, alertToStaff, metrics; - String alertMessage(); + public String getLicense() { + return license; + } - boolean alertToStaff(); + public boolean cachedResults() { + return cacheResults; + } - boolean runCommands(); + public String getKickString() { + return kickMessage; + } + + public String alertMessage() { + return alertMsg; + } + + public boolean alertToStaff() { + return alertToStaff; + } - List commands(); + public boolean runCommands() { + return commandsEnabled; + } + + public List commands() { + return commands; + } - boolean kickPlayersOnDetect(); + public boolean kickPlayersOnDetect() { + return kickPlayers; + } + + public List getPrefixWhitelists() { + return prefixWhitelists; + } + + public boolean isDatabaseEnabled() { + return databaseEnabled; + } - List getPrefixWhitelists(); + public boolean useDatabaseCreds() { + return useCredentials; + } - boolean isDatabaseEnabled(); + public String mongoDatabaseURL() { + return mongoURL; + } + + public String getDatabaseType() { + return databaseType; + } + + public String getDatabaseName() { + return databaseName; + } - boolean useDatabaseCreds(); + public String getUsername() { + return username; + } + + public String getPassword() { + return password; + } - String mongoDatabaseURL(); + public String getIp() { + return ip; + } - String getDatabaseType(); + + public List allowedCountries() { + return allowedCountries; + } - String getDatabaseName(); + + public List blockedCountries() { + return blockedCountries; + } - String getUsername(); + + public int getPort() { + if(port == -1) { + switch (getDatabaseType().toLowerCase()) { + case "mongodb": + case "mongo": + case "mongod": + return 27017; + case "sql": + case "mysql": + return 3306; + } + } - String getPassword(); + return port; + } - String getIp(); + + public boolean metrics() { + return metrics; + } - List allowedCountries(); - - List blockedCountries(); - - int getPort(); - - boolean metrics(); - - void update(); + public void update() { + license = licenseDefault.get(); + kickMessage = kickStringDefault.get(); + cacheResults = cacheResultsDefault.get(); + prefixWhitelists = prefixWhitelistsDefault.get(); + databaseEnabled = defaultDatabaseEnabled.get(); + useCredentials = defaultUseCredentials.get(); + databaseType = defaultDatabaseType.get(); + databaseName = defaultDatabaseName.get(); + mongoURL = defaultMongoURL.get(); + username = defaultUsername.get(); + password = defaultPassword.get(); + ip = defaultIp.get(); + port = defaultPort.get(); + commandsEnabled = defaultCommandsEnable.get(); + commands = defaultCommands.get(); + kickPlayers = defaultKickPlayers.get(); + alertToStaff = defaultAlertToStaff.get(); + alertMsg = defaultAlertMsg.get(); + metrics = defaultMetrics.get(); + blockedCountries = defBlockedCountries.get(); + allowedCountries = defAllowedCountries.get(); + } } 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 02884fc..817fac9 100644 --- a/Common/src/main/java/dev/brighten/antivpn/api/VPNExecutor.java +++ b/Common/src/main/java/dev/brighten/antivpn/api/VPNExecutor.java @@ -51,7 +51,7 @@ public abstract class VPNExecutor { else { try { VPNResponse response = AntiVPN - .getVPNResponse(ip, AntiVPN.getInstance().getConfig().getLicense(), cachedResults); + .getVPNResponse(ip, AntiVPN.getInstance().getVpnConfig().getLicense(), cachedResults); if(response.isSuccess()) { AntiVPN.getInstance().getDatabase().cacheResponse(response); @@ -80,7 +80,7 @@ public abstract class VPNExecutor { else { try { VPNResponse response = AntiVPN - .getVPNResponse(ip, AntiVPN.getInstance().getConfig().getLicense(), cachedResults); + .getVPNResponse(ip, AntiVPN.getInstance().getVpnConfig().getLicense(), cachedResults); if(response.isSuccess()) { threadExecutor.execute(() -> AntiVPN.getInstance().getDatabase().cacheResponse(response)); diff --git a/Common/src/main/java/dev/brighten/antivpn/command/impl/AllowlistCommand.java b/Common/src/main/java/dev/brighten/antivpn/command/impl/AllowlistCommand.java index 304b9e2..1a0c297 100644 --- a/Common/src/main/java/dev/brighten/antivpn/command/impl/AllowlistCommand.java +++ b/Common/src/main/java/dev/brighten/antivpn/command/impl/AllowlistCommand.java @@ -57,7 +57,7 @@ public class AllowlistCommand extends Command { if(args.length == 1) return "&cYou have to provide a player to allow or deny exemption."; - boolean databaseEnabled = AntiVPN.getInstance().getConfig().isDatabaseEnabled(); + boolean databaseEnabled = AntiVPN.getInstance().getVpnConfig().isDatabaseEnabled(); if(!databaseEnabled) executor.sendMessage("&cThe database is currently not setup, " + "so any changes here will disappear after a restart."); 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 5c85444..fd9ead4 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 @@ -170,26 +170,26 @@ public class MongoVPN implements VPNDatabase { @Override public void init() { - if(AntiVPN.getInstance().getConfig().mongoDatabaseURL().length() > 0) { //URL - ConnectionString cs = new ConnectionString(AntiVPN.getInstance().getConfig().mongoDatabaseURL()); + if(AntiVPN.getInstance().getVpnConfig().mongoDatabaseURL().length() > 0) { //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().getConfig().getIp(), - AntiVPN.getInstance().getConfig().getPort()))); + builder.hosts(Collections.singletonList(new ServerAddress(AntiVPN.getInstance().getVpnConfig().getIp(), + AntiVPN.getInstance().getVpnConfig().getPort()))); }); - if(AntiVPN.getInstance().getConfig().useDatabaseCreds()) { + if(AntiVPN.getInstance().getVpnConfig().useDatabaseCreds()) { settingsBld = settingsBld.credential(MongoCredential - .createCredential(AntiVPN.getInstance().getConfig().getUsername(), - AntiVPN.getInstance().getConfig().getDatabaseName(), - AntiVPN.getInstance().getConfig().getPassword().toCharArray())); + .createCredential(AntiVPN.getInstance().getVpnConfig().getUsername(), + AntiVPN.getInstance().getVpnConfig().getDatabaseName(), + AntiVPN.getInstance().getVpnConfig().getPassword().toCharArray())); } client = MongoClients.create(settingsBld.build()); } - antivpnDatabase = client.getDatabase(AntiVPN.getInstance().getConfig().getDatabaseName()); + 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 e33fcfa..3acad28 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 @@ -26,7 +26,7 @@ public class MySqlVPN implements VPNDatabase { } while (true) { // Updating from database - if (AntiVPN.getInstance().getConfig().isDatabaseEnabled()) { + if (AntiVPN.getInstance().getVpnConfig().isDatabaseEnabled()) { AntiVPN.getInstance().getExecutor().getWhitelisted().clear(); AntiVPN.getInstance().getExecutor().getWhitelisted() .addAll(AntiVPN.getInstance().getDatabase().getAllWhitelisted()); @@ -47,7 +47,7 @@ public class MySqlVPN implements VPNDatabase { @Override public Optional getStoredResponse(String ip) { - if (!AntiVPN.getInstance().getConfig().isDatabaseEnabled()|| MySQL.isClosed()) + if (!AntiVPN.getInstance().getVpnConfig().isDatabaseEnabled()|| MySQL.isClosed()) return Optional.empty(); ResultSet rs = Query.prepare("select * from `responses` where `ip` = ? limit 1").append(ip).executeQuery(); @@ -81,7 +81,7 @@ public class MySqlVPN implements VPNDatabase { */ @Override public void cacheResponse(VPNResponse toCache) { - if (!AntiVPN.getInstance().getConfig().isDatabaseEnabled() || MySQL.isClosed()) + if (!AntiVPN.getInstance().getVpnConfig().isDatabaseEnabled() || MySQL.isClosed()) return; Query.prepare("insert into `responses` (`ip`,`asn`,`countryName`,`countryCode`,`city`,`timeZone`," @@ -96,7 +96,7 @@ public class MySqlVPN implements VPNDatabase { @SneakyThrows @Override public boolean isWhitelisted(UUID uuid) { - if (!AntiVPN.getInstance().getConfig().isDatabaseEnabled() || MySQL.isClosed()) + if (!AntiVPN.getInstance().getVpnConfig().isDatabaseEnabled() || MySQL.isClosed()) return false; ResultSet set = Query.prepare("select uuid from `whitelisted` where `uuid` = ? limit 1") .append(uuid.toString()).executeQuery(); @@ -107,7 +107,7 @@ public class MySqlVPN implements VPNDatabase { @SneakyThrows @Override public boolean isWhitelisted(String ip) { - if (!AntiVPN.getInstance().getConfig().isDatabaseEnabled() || MySQL.isClosed()) + if (!AntiVPN.getInstance().getVpnConfig().isDatabaseEnabled() || MySQL.isClosed()) return false; ResultSet set = Query.prepare("select `ip` from `whitelisted-ips` where `ip` = ? limit 1") .append(ip).executeQuery(); @@ -118,7 +118,7 @@ public class MySqlVPN implements VPNDatabase { @Override public void setWhitelisted(UUID uuid, boolean whitelisted) { - if (!AntiVPN.getInstance().getConfig().isDatabaseEnabled() || MySQL.isClosed()) + if (!AntiVPN.getInstance().getVpnConfig().isDatabaseEnabled() || MySQL.isClosed()) return; if (whitelisted) { @@ -134,7 +134,7 @@ public class MySqlVPN implements VPNDatabase { @Override public void setWhitelisted(String ip, boolean whitelisted) { - if (!AntiVPN.getInstance().getConfig().isDatabaseEnabled() || MySQL.isClosed()) + if (!AntiVPN.getInstance().getVpnConfig().isDatabaseEnabled() || MySQL.isClosed()) return; if(whitelisted) { @@ -234,10 +234,10 @@ public class MySqlVPN implements VPNDatabase { @Override public void init() { - if (!AntiVPN.getInstance().getConfig().isDatabaseEnabled()) + if (!AntiVPN.getInstance().getVpnConfig().isDatabaseEnabled()) return; AntiVPN.getInstance().getExecutor().log("Initializing MySQL..."); - if(AntiVPN.getInstance().getConfig().getDatabaseType().contains("sql")) { + if(AntiVPN.getInstance().getVpnConfig().getDatabaseType().contains("sql")) { MySQL.init(); } else MySQL.initH2(); @@ -333,7 +333,7 @@ public class MySqlVPN implements VPNDatabase { @Override public void shutdown() { - if (!AntiVPN.getInstance().getConfig().isDatabaseEnabled()) + if (!AntiVPN.getInstance().getVpnConfig().isDatabaseEnabled()) return; MySQL.shutdown(); } 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 bab0bc1..3afdb55 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 @@ -20,16 +20,16 @@ public class MySQL { } catch (ClassNotFoundException e) { Class.forName("com.mysql.jdbc.Driver"); } - conn = DriverManager.getConnection("jdbc:mysql://" + AntiVPN.getInstance().getConfig().getIp() - + ":" + AntiVPN.getInstance().getConfig().getPort() + conn = DriverManager.getConnection("jdbc:mysql://" + AntiVPN.getInstance().getVpnConfig().getIp() + + ":" + AntiVPN.getInstance().getVpnConfig().getPort() + "/?useSSL=true&autoReconnect=true", - AntiVPN.getInstance().getConfig().getUsername(), - AntiVPN.getInstance().getConfig().getPassword()); + AntiVPN.getInstance().getVpnConfig().getUsername(), + AntiVPN.getInstance().getVpnConfig().getPassword()); conn.setAutoCommit(true); Query.use(conn); Query.prepare("CREATE DATABASE IF NOT EXISTS `" - + AntiVPN.getInstance().getConfig().getDatabaseName() + "`").execute(); - Query.prepare("USE `" + AntiVPN.getInstance().getConfig().getDatabaseName() + "`").execute(); + + AntiVPN.getInstance().getVpnConfig().getDatabaseName() + "`").execute(); + Query.prepare("USE `" + AntiVPN.getInstance().getVpnConfig().getDatabaseName() + "`").execute(); AntiVPN.getInstance().getExecutor().log("Connection to MySQL has been established."); } } catch (Exception e) { @@ -44,7 +44,7 @@ public class MySQL { Class.forName("org.h2.Driver"); conn = new NonClosableConnection(DriverManager.getConnection ("jdbc:h2:file:" + dataFolder.getAbsolutePath(), - AntiVPN.getInstance().getConfig().getUsername(),AntiVPN.getInstance().getConfig().getPassword())); + AntiVPN.getInstance().getVpnConfig().getUsername(),AntiVPN.getInstance().getVpnConfig().getPassword())); conn.setAutoCommit(true); Query.use(conn); AntiVPN.getInstance().getExecutor().log("Connection to SQlLite has been established."); diff --git a/Bungee/src/main/java/dev/brighten/antivpn/bungee/util/ConfigDefault.java b/Common/src/main/java/dev/brighten/antivpn/utils/ConfigDefault.java similarity index 74% rename from Bungee/src/main/java/dev/brighten/antivpn/bungee/util/ConfigDefault.java rename to Common/src/main/java/dev/brighten/antivpn/utils/ConfigDefault.java index 7f430de..9a2ec06 100644 --- a/Bungee/src/main/java/dev/brighten/antivpn/bungee/util/ConfigDefault.java +++ b/Common/src/main/java/dev/brighten/antivpn/utils/ConfigDefault.java @@ -1,6 +1,6 @@ -package dev.brighten.antivpn.bungee.util; +package dev.brighten.antivpn.utils; -import dev.brighten.antivpn.bungee.BungeePlugin; +import dev.brighten.antivpn.AntiVPN; import lombok.AllArgsConstructor; @AllArgsConstructor @@ -8,14 +8,14 @@ public class ConfigDefault { private final A defaultValue; private final String path; - private final BungeePlugin plugin; + private final AntiVPN plugin; public A get() { if(plugin.getConfig().get(path) != null) return (A) plugin.getConfig().get(path); else { plugin.getConfig().set(path, defaultValue); - plugin.getConfig().save(); + plugin.saveConfig(); return defaultValue; } } diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/config/Configuration.java b/Common/src/main/java/dev/brighten/antivpn/utils/config/Configuration.java index b9408cf..a84a372 100644 --- a/Common/src/main/java/dev/brighten/antivpn/utils/config/Configuration.java +++ b/Common/src/main/java/dev/brighten/antivpn/utils/config/Configuration.java @@ -53,7 +53,7 @@ public final class Configuration String line = iterator.next(); String trimmed = line.trim(); - if(trimmed.startsWith("##") || trimmed.isEmpty()) { + if(trimmed.startsWith("#") || trimmed.isEmpty()) { addCommentLine(currentPath, line); continue; } diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/config/YamlConfiguration.java b/Common/src/main/java/dev/brighten/antivpn/utils/config/YamlConfiguration.java index 81bdf33..b61f0a6 100644 --- a/Common/src/main/java/dev/brighten/antivpn/utils/config/YamlConfiguration.java +++ b/Common/src/main/java/dev/brighten/antivpn/utils/config/YamlConfiguration.java @@ -2,13 +2,19 @@ package dev.brighten.antivpn.utils.config; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import lombok.SneakyThrows; import org.yaml.snakeyaml.DumperOptions; +import org.yaml.snakeyaml.LoaderOptions; import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.constructor.Constructor; +import org.yaml.snakeyaml.error.YAMLException; +import org.yaml.snakeyaml.nodes.Node; +import org.yaml.snakeyaml.representer.Represent; +import org.yaml.snakeyaml.representer.Representer; import java.io.*; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -import java.nio.file.Files; import java.util.*; @NoArgsConstructor(access = AccessLevel.PACKAGE) @@ -20,11 +26,17 @@ public class YamlConfiguration extends ConfigurationProvider @Override protected Yaml initialValue() { + Representer representer = new Representer() + { + { + representers.put( Configuration.class, data -> represent( ( (Configuration) data ).self )); + } + }; DumperOptions options = new DumperOptions(); options.setDefaultFlowStyle( DumperOptions.FlowStyle.BLOCK ); - - return new Yaml(options); + representer.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); + return new Yaml( new Constructor(), representer, options ); } }; @@ -41,6 +53,9 @@ public class YamlConfiguration extends ConfigurationProvider public void save(Configuration config, Writer writer) { String contents = this.yaml.get().dump(config.self); + if (contents.equals("{}\n")) { + contents = ""; + } List list = new ArrayList<>(); Collections.addAll(list, contents.split("\n")); @@ -85,7 +100,7 @@ public class YamlConfiguration extends ConfigurationProvider } try { - writer.write(contents); + writer.write(sb.toString()); } catch (IOException e) { e.printStackTrace(); } @@ -111,34 +126,37 @@ public class YamlConfiguration extends ConfigurationProvider return load( reader, null ); } + @SneakyThrows @Override - @SuppressWarnings("unchecked") public Configuration load(Reader reader, Configuration defaults) { - Map map = yaml.get().loadAs( reader, LinkedHashMap.class ); - if ( map == null ) - { - map = new LinkedHashMap<>(); + BufferedReader input = reader instanceof BufferedReader ? (BufferedReader)reader : new BufferedReader(reader); + StringBuilder builder = new StringBuilder(); + + String line; + try { + while((line = input.readLine()) != null) { + builder.append(line); + builder.append('\n'); + } + } finally { + input.close(); } - return new Configuration( map, defaults ); + + + return load(builder.toString(), defaults); } @Override public Configuration load(InputStream is) { - return load( is, null ); + return this.load(new InputStreamReader(is, Charset.defaultCharset())); } @Override - @SuppressWarnings("unchecked") public Configuration load(InputStream is, Configuration defaults) { - Map map = yaml.get().loadAs( is, LinkedHashMap.class ); - if ( map == null ) - { - map = new LinkedHashMap<>(); - } - return new Configuration( map, defaults ); + return this.load(new InputStreamReader(is, Charset.defaultCharset()), defaults); } @Override @@ -147,15 +165,20 @@ public class YamlConfiguration extends ConfigurationProvider return load( string, null ); } + @Override @SuppressWarnings("unchecked") - public Configuration load(String string, Configuration defaults) + public Configuration load(String contents, Configuration defaults) { - Map map = yaml.get().loadAs( string, LinkedHashMap.class ); - if ( map == null ) - { - map = new LinkedHashMap<>(); - } - return new Configuration( map, defaults ); + Map map; + LoaderOptions loaderOptions = new LoaderOptions(); + loaderOptions.setMaxAliasesForCollections(2147483647); + map = this.yaml.get().loadAs(contents, LinkedHashMap.class); + + Configuration config = new Configuration( map, defaults ); + config.loadFromString(contents); + + return config; } + } \ No newline at end of file diff --git a/Common/src/main/resources/config.yml b/Common/src/main/resources/config.yml index e69de29..e02ea71 100644 --- a/Common/src/main/resources/config.yml +++ b/Common/src/main/resources/config.yml @@ -0,0 +1,54 @@ +##################################################### +# KauriVPN Config # +# by Brighten Development # +##################################################### +# If you find that you run out of your free 20,000 queries, you may purchase a license on https://funkemunky.cc/shop +license: '' +# Message only sent with commands disabled below. Supports color codes ('&') +kickMessage: Proxies are not allowed on our server +# Caching results will lower your query usage, but results may be out of date. +cachedResults: true +# All players with any of the following characters in the beginning of their name will be whitelisted +# This is a useful feature for servers that allow players through Geyser and their IPs are not forwarded, causing +# players to be removed falsely for use of proxy. +prefixWhitelists: [] +# Configure your database here. +database: + # Enable to cache queries and save alerts state beyond restarts + enabled: false + useCredentials: true + #Options Mongo and MySQL + type: MySQL + # The database name you would like to use + database: kaurivpn + # Can be used if you prefer to authenticate via Mongo URL + mongoURL: '' + # Your database username + username: root + # Your database password + password: password + # The IP of your database goes here + ip: localhost + # -1 will use default port of databases (MySQL:3306, Mongo:27017). Otherwise, enter alternative ports here. + port: -1 +commands: + # Enable this to override the default kick function of the plugin with your own commands + enabled: false + # List of commands to run when a player is detected to be using a proxy. Supports color codes ('&') + execute: + - kick %player% VPNs are not allowed on our server! +# Enable/disable the default kicking feature of KauriVPN. +kickPlayers: true +# Configure all alerting functionality +alerts: + # You may set to 'false' to disable all alerts functionality + enabled: true + # Message to send to users with alerts enabled + # Placeholders: %country% (Country name), %player% (Player name), %reason% (Proxy detection method), + # %city% (City name). + message: '&8[&6KauriVPN&8] &e%player% &7has joined on a VPN/proxy &8(&f%reason%&8) + &7in location &8(&f%city%&7, &f%country%&8)' +# This will disable any information being sent to https://bstats.org. We recommend you keep this enabled as it helps +# us understand our users and put effort where it is needed. All information sent goes under their privacy as seen +# here: https://bstats.org/privacy-policy +bstats: true diff --git a/Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityConfig.java b/Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityConfig.java deleted file mode 100644 index 32f21a7..0000000 --- a/Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityConfig.java +++ /dev/null @@ -1,195 +0,0 @@ -package dev.brighten.antivpn.velocity; - -import dev.brighten.antivpn.api.VPNConfig; -import dev.brighten.antivpn.velocity.util.ConfigDefault; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public class VelocityConfig implements VPNConfig { - private final ConfigDefault licenseDefault = new ConfigDefault<>("", - "license", VelocityPlugin.INSTANCE), kickStringDefault = - new ConfigDefault<>("Proxies are not allowed on our server", - "kickMessage", VelocityPlugin.INSTANCE), - defaultDatabaseType = new ConfigDefault<>("H2", - "database.type", VelocityPlugin.INSTANCE), - defaultDatabaseName = new ConfigDefault<>("kaurivpn", - "database.database", VelocityPlugin.INSTANCE), - defaultMongoURL = new ConfigDefault<>("", "database.mongoURL", VelocityPlugin.INSTANCE), - defaultUsername = new ConfigDefault<>("root", - "database.username", VelocityPlugin.INSTANCE), - defaultPassword = new ConfigDefault<>("password", - "database.password", VelocityPlugin.INSTANCE), - defaultIp = new ConfigDefault<>("localhost", "database.ip", VelocityPlugin.INSTANCE), - defaultAlertMsg = new ConfigDefault<>("&8[&6KauriVPN&8] &e%player% &7has joined on a VPN/proxy" + - " &8(&f%reason%&8) &7in location &8(&f%city%&7, &f%country%&8)", "alerts.message", - VelocityPlugin.INSTANCE); - private final ConfigDefault cacheResultsDefault = new ConfigDefault<>(true, - "cachedResults", VelocityPlugin.INSTANCE), - defaultDatabaseEnabled = new ConfigDefault<>(false, "database.enabled", - VelocityPlugin.INSTANCE), defaultCommandsEnable = new ConfigDefault<>(false, - "commands.enabled", VelocityPlugin.INSTANCE), defaultKickPlayers - = new ConfigDefault<>(true, "kickPlayers", VelocityPlugin.INSTANCE), - defaultUseCredentials = new ConfigDefault<>(true, - "database.useCredentials", VelocityPlugin.INSTANCE), - defaultAlertToStaff = new ConfigDefault<>(true, "alerts.enabled", - VelocityPlugin.INSTANCE), - defaultMetrics = new ConfigDefault<>(true, "bstats", VelocityPlugin.INSTANCE); - private final ConfigDefault - defaultPort = new ConfigDefault<>(-1, "database.port", VelocityPlugin.INSTANCE); - private final ConfigDefault> prefixWhitelistsDefault = new ConfigDefault<>(new ArrayList<>(), - "prefixWhitelists", VelocityPlugin.INSTANCE), defaultCommands = new ConfigDefault<>( - Collections.singletonList("kick %player% VPNs are not allowed on our server!"), "commands.execute", - VelocityPlugin.INSTANCE), - defBlockedCountries = new ConfigDefault<>(new ArrayList<>(), "blockedCountries", - VelocityPlugin.INSTANCE), - defAllowedCountries = new ConfigDefault<>(new ArrayList<>(), "allowedCountries", - VelocityPlugin.INSTANCE); - - private String license, kickMessage, databaseType, databaseName, mongoURL, username, password, ip, alertMsg; - private List prefixWhitelists, commands, allowedCountries, blockedCountries; - private int port; - private boolean cacheResults, useCredentials, databaseEnabled, commandsEnabled, kickPlayers, alertToStaff, metrics; - - @Override - public String getLicense() { - return license; - } - - @Override - public boolean cachedResults() { - return cacheResults; - } - - @Override - public String getKickString() { - return kickMessage; - } - - @Override - public String alertMessage() { - return alertMsg; - } - - @Override - public boolean alertToStaff() { - return alertToStaff; - } - - @Override - public boolean runCommands() { - return commandsEnabled; - } - - @Override - public List commands() { - return commands; - } - - @Override - public boolean kickPlayersOnDetect() { - return kickPlayers; - } - - @Override - public List getPrefixWhitelists() { - return prefixWhitelists; - } - - @Override - public boolean isDatabaseEnabled() { - return databaseEnabled; - } - - @Override - public boolean useDatabaseCreds() { - return useCredentials; - } - - @Override - public String mongoDatabaseURL() { - return mongoURL; - } - - @Override - public String getDatabaseType() { - return databaseType; - } - - @Override - public String getDatabaseName() { - return databaseName; - } - - @Override - public String getUsername() { - return username; - } - - @Override - public String getPassword() { - return password; - } - - @Override - public String getIp() { - return ip; - } - - @Override - public List allowedCountries() { - return allowedCountries; - } - - @Override - public List blockedCountries() { - return blockedCountries; - } - - @Override - public int getPort() { - if(port == -1) { - switch (getDatabaseType().toLowerCase()) { - case "mongodb": - case "mongo": - case "mongod": - return 27017; - case "sql": - case "mysql": - return 3306; - } - } - - return port; - } - - @Override - public boolean metrics() { - return metrics; - } - - public void update() { - license = licenseDefault.get(); - kickMessage = kickStringDefault.get(); - cacheResults = cacheResultsDefault.get(); - prefixWhitelists = prefixWhitelistsDefault.get(); - databaseEnabled = defaultDatabaseEnabled.get(); - useCredentials = defaultUseCredentials.get(); - databaseType = defaultDatabaseType.get(); - databaseName = defaultDatabaseName.get(); - mongoURL = defaultMongoURL.get(); - username = defaultUsername.get(); - password = defaultPassword.get(); - ip = defaultIp.get(); - port = defaultPort.get(); - commandsEnabled = defaultCommandsEnable.get(); - commands = defaultCommands.get(); - kickPlayers = defaultKickPlayers.get(); - alertToStaff = defaultAlertToStaff.get(); - alertMsg = defaultAlertMsg.get(); - metrics = defaultMetrics.get(); - blockedCountries = defBlockedCountries.get(); - allowedCountries = defAllowedCountries.get(); - } -} 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 1f81baa..a14bd27 100644 --- a/Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityListener.java +++ b/Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityListener.java @@ -28,30 +28,30 @@ public class VelocityListener extends VPNExecutor { //Or has a name that starts with a certain prefix. This is for Bedrock exempting. || AntiVPN.getInstance().getExecutor().isWhitelisted(event.getPlayer().getRemoteAddress() .getAddress().getHostAddress()) - || AntiVPN.getInstance().getConfig().getPrefixWhitelists().stream() + || AntiVPN.getInstance().getVpnConfig().getPrefixWhitelists().stream() .anyMatch(prefix -> event.getPlayer().getUsername().startsWith(prefix))) return; checkIp(event.getPlayer().getRemoteAddress().getAddress().getHostAddress(), - AntiVPN.getInstance().getConfig().cachedResults(), result -> { + AntiVPN.getInstance().getVpnConfig().cachedResults(), result -> { if(result.isSuccess() && result.isProxy()) { - if(AntiVPN.getInstance().getConfig().kickPlayersOnDetect()) + if(AntiVPN.getInstance().getVpnConfig().kickPlayersOnDetect()) event.getPlayer().disconnect(LegacyComponentSerializer.builder().character('&') - .build().deserialize(AntiVPN.getInstance().getConfig().getKickString())); + .build().deserialize(AntiVPN.getInstance().getVpnConfig().getKickString())); VelocityPlugin.INSTANCE.getLogger().info(event.getPlayer().getUsername() + " joined on a VPN/Proxy (" + result.getMethod() + ")"); - if(AntiVPN.getInstance().getConfig().alertToStaff()) //Ensuring the user wishes to alert to staff + if(AntiVPN.getInstance().getVpnConfig().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().getVpnConfig().alertMessage() .replace("%player%", event.getPlayer().getUsername()) .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()) { + if(AntiVPN.getInstance().getVpnConfig().runCommands()) { + for (String command : AntiVPN.getInstance().getVpnConfig().commands()) { VelocityPlugin.INSTANCE.getServer().getCommandManager() .executeAsync(VelocityPlugin.INSTANCE.getServer() .getConsoleCommandSource(), diff --git a/Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityPlugin.java b/Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityPlugin.java index d227492..f0494b8 100644 --- a/Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityPlugin.java +++ b/Velocity/src/main/java/dev/brighten/antivpn/velocity/VelocityPlugin.java @@ -10,7 +10,6 @@ import com.velocitypowered.api.plugin.annotation.DataDirectory; import com.velocitypowered.api.proxy.ProxyServer; import dev.brighten.antivpn.AntiVPN; import dev.brighten.antivpn.command.Command; -import dev.brighten.antivpn.velocity.util.Config; import lombok.Getter; import lombok.val; import net.kyori.adventure.text.Component; @@ -37,8 +36,6 @@ public class VelocityPlugin { @DataDirectory private Path configDir; - private Config config; - @Inject public VelocityPlugin(ProxyServer server, Logger logger, Metrics.Factory metricsFactory) { this.server = server; @@ -50,13 +47,12 @@ public class VelocityPlugin { public void onInit(ProxyInitializeEvent event) { INSTANCE = this; logger.info("Loading config..."); - config = new Config(); //Loading plugin logger.info("Starting AntiVPN services..."); - AntiVPN.start(new VelocityConfig(), new VelocityListener(), new VelocityPlayerExecutor(), configDir.toFile()); + AntiVPN.start(new VelocityListener(), new VelocityPlayerExecutor(), configDir.toFile()); - if(AntiVPN.getInstance().getConfig().metrics()) { + if(AntiVPN.getInstance().getVpnConfig().metrics()) { logger.info("Starting metrics..."); Metrics metrics = metricsFactory.make(this, 12791); } diff --git a/Velocity/src/main/java/dev/brighten/antivpn/velocity/config/Configuration.java b/Velocity/src/main/java/dev/brighten/antivpn/velocity/config/Configuration.java deleted file mode 100644 index f576f9b..0000000 --- a/Velocity/src/main/java/dev/brighten/antivpn/velocity/config/Configuration.java +++ /dev/null @@ -1,414 +0,0 @@ -package dev.brighten.antivpn.velocity.config; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; - -public final class Configuration -{ - - private static final char SEPARATOR = '.'; - final Map self; - private final Configuration defaults; - - public Configuration() - { - this( null ); - } - - public Configuration(Configuration defaults) - { - this( new LinkedHashMap(), defaults ); - } - - Configuration(Map map, Configuration defaults) - { - this.self = new LinkedHashMap<>(); - this.defaults = defaults; - - for ( Map.Entry entry : map.entrySet() ) - { - String key = ( entry.getKey() == null ) ? "null" : entry.getKey().toString(); - - if ( entry.getValue() instanceof Map ) - { - this.self.put( key, new Configuration( (Map) entry.getValue(), ( defaults == null ) ? null : defaults.getSection( key ) ) ); - } else - { - this.self.put( key, entry.getValue() ); - } - } - } - - private Configuration getSectionFor(String path) - { - int index = path.indexOf( SEPARATOR ); - if ( index == -1 ) - { - return this; - } - - String root = path.substring( 0, index ); - Object section = self.get( root ); - if ( section == null ) - { - section = new Configuration( ( defaults == null ) ? null : defaults.getSection( root ) ); - self.put( root, section ); - } - - return (Configuration) section; - } - - private String getChild(String path) - { - int index = path.indexOf( SEPARATOR ); - return ( index == -1 ) ? path : path.substring( index + 1 ); - } - - /*------------------------------------------------------------------------*/ - @SuppressWarnings("unchecked") - public T get(String path, T def) - { - Configuration section = getSectionFor( path ); - Object val; - if ( section == this ) - { - val = self.get( path ); - } else - { - val = section.get( getChild( path ), def ); - } - - if ( val == null && def instanceof Configuration ) - { - self.put( path, def ); - } - - return ( val != null ) ? (T) val : def; - } - - public boolean contains(String path) - { - return get( path, null ) != null; - } - - public Object get(String path) - { - return get( path, getDefault( path ) ); - } - - public Object getDefault(String path) - { - return ( defaults == null ) ? null : defaults.get( path ); - } - - public void set(String path, Object value) - { - if ( value instanceof Map ) - { - value = new Configuration( (Map) value, ( defaults == null ) ? null : defaults.getSection( path ) ); - } - - Configuration section = getSectionFor( path ); - if ( section == this ) - { - if ( value == null ) - { - self.remove( path ); - } else - { - self.put( path, value ); - } - } else - { - section.set( getChild( path ), value ); - } - } - - /*------------------------------------------------------------------------*/ - public Configuration getSection(String path) - { - Object def = getDefault( path ); - return (Configuration) get( path, ( def instanceof Configuration ) ? def : new Configuration( ( defaults == null ) ? null : defaults.getSection( path ) ) ); - } - - /** - * Gets keys, not deep by default. - * - * @return top level keys for this section - */ - public Collection getKeys() - { - return new LinkedHashSet<>( self.keySet() ); - } - - /*------------------------------------------------------------------------*/ - public byte getByte(String path) - { - Object def = getDefault( path ); - return getByte( path, ( def instanceof Number ) ? ( (Number) def ).byteValue() : 0 ); - } - - public byte getByte(String path, byte def) - { - Object val = get( path, def ); - return ( val instanceof Number ) ? ( (Number) val ).byteValue() : def; - } - - public List getByteList(String path) - { - List list = getList( path ); - List result = new ArrayList<>(); - - for ( Object object : list ) - { - if ( object instanceof Number ) - { - result.add( ( (Number) object ).byteValue() ); - } - } - - return result; - } - - public short getShort(String path) - { - Object def = getDefault( path ); - return getShort( path, ( def instanceof Number ) ? ( (Number) def ).shortValue() : 0 ); - } - - public short getShort(String path, short def) - { - Object val = get( path, def ); - return ( val instanceof Number ) ? ( (Number) val ).shortValue() : def; - } - - public List getShortList(String path) - { - List list = getList( path ); - List result = new ArrayList<>(); - - for ( Object object : list ) - { - if ( object instanceof Number ) - { - result.add( ( (Number) object ).shortValue() ); - } - } - - return result; - } - - public int getInt(String path) - { - Object def = getDefault( path ); - return getInt( path, ( def instanceof Number ) ? ( (Number) def ).intValue() : 0 ); - } - - public int getInt(String path, int def) - { - Object val = get( path, def ); - return ( val instanceof Number ) ? ( (Number) val ).intValue() : def; - } - - public List getIntList(String path) - { - List list = getList( path ); - List result = new ArrayList<>(); - - for ( Object object : list ) - { - if ( object instanceof Number ) - { - result.add( ( (Number) object ).intValue() ); - } - } - - return result; - } - - public long getLong(String path) - { - Object def = getDefault( path ); - return getLong( path, ( def instanceof Number ) ? ( (Number) def ).longValue() : 0 ); - } - - public long getLong(String path, long def) - { - Object val = get( path, def ); - return ( val instanceof Number ) ? ( (Number) val ).longValue() : def; - } - - public List getLongList(String path) - { - List list = getList( path ); - List result = new ArrayList<>(); - - for ( Object object : list ) - { - if ( object instanceof Number ) - { - result.add( ( (Number) object ).longValue() ); - } - } - - return result; - } - - public float getFloat(String path) - { - Object def = getDefault( path ); - return getFloat( path, ( def instanceof Number ) ? ( (Number) def ).floatValue() : 0 ); - } - - public float getFloat(String path, float def) - { - Object val = get( path, def ); - return ( val instanceof Number ) ? ( (Number) val ).floatValue() : def; - } - - public List getFloatList(String path) - { - List list = getList( path ); - List result = new ArrayList<>(); - - for ( Object object : list ) - { - if ( object instanceof Number ) - { - result.add( ( (Number) object ).floatValue() ); - } - } - - return result; - } - - public double getDouble(String path) - { - Object def = getDefault( path ); - return getDouble( path, ( def instanceof Number ) ? ( (Number) def ).doubleValue() : 0 ); - } - - public double getDouble(String path, double def) - { - Object val = get( path, def ); - return ( val instanceof Number ) ? ( (Number) val ).doubleValue() : def; - } - - public List getDoubleList(String path) - { - List list = getList( path ); - List result = new ArrayList<>(); - - for ( Object object : list ) - { - if ( object instanceof Number ) - { - result.add( ( (Number) object ).doubleValue() ); - } - } - - return result; - } - - public boolean getBoolean(String path) - { - Object def = getDefault( path ); - return getBoolean( path, ( def instanceof Boolean ) ? (Boolean) def : false ); - } - - public boolean getBoolean(String path, boolean def) - { - Object val = get( path, def ); - return ( val instanceof Boolean ) ? (Boolean) val : def; - } - - public List getBooleanList(String path) - { - List list = getList( path ); - List result = new ArrayList<>(); - - for ( Object object : list ) - { - if ( object instanceof Boolean ) - { - result.add( (Boolean) object ); - } - } - - return result; - } - - public char getChar(String path) - { - Object def = getDefault( path ); - return getChar( path, ( def instanceof Character ) ? (Character) def : '\u0000' ); - } - - public char getChar(String path, char def) - { - Object val = get( path, def ); - return ( val instanceof Character ) ? (Character) val : def; - } - - public List getCharList(String path) - { - List list = getList( path ); - List result = new ArrayList<>(); - - for ( Object object : list ) - { - if ( object instanceof Character ) - { - result.add( (Character) object ); - } - } - - return result; - } - - public String getString(String path) - { - Object def = getDefault( path ); - return getString( path, ( def instanceof String ) ? (String) def : "" ); - } - - public String getString(String path, String def) - { - Object val = get( path, def ); - return ( val instanceof String ) ? (String) val : def; - } - - public List getStringList(String path) - { - List list = getList( path ); - List result = new ArrayList<>(); - - for ( Object object : list ) - { - if ( object instanceof String ) - { - result.add( (String) object ); - } - } - - return result; - } - - /*------------------------------------------------------------------------*/ - public List getList(String path) - { - Object def = getDefault( path ); - return getList( path, ( def instanceof List ) ? (List) def : Collections.EMPTY_LIST ); - } - - public List getList(String path, List def) - { - Object val = get( path, def ); - return ( val instanceof List ) ? (List) val : def; - } -} \ No newline at end of file diff --git a/Velocity/src/main/java/dev/brighten/antivpn/velocity/config/ConfigurationProvider.java b/Velocity/src/main/java/dev/brighten/antivpn/velocity/config/ConfigurationProvider.java deleted file mode 100644 index cf5189e..0000000 --- a/Velocity/src/main/java/dev/brighten/antivpn/velocity/config/ConfigurationProvider.java +++ /dev/null @@ -1,60 +0,0 @@ -package dev.brighten.antivpn.velocity.config; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.Reader; -import java.io.Writer; -import java.util.HashMap; -import java.util.Map; - -public abstract class ConfigurationProvider -{ - - private static final Map, ConfigurationProvider> providers = new HashMap<>(); - - static - { - try - { - providers.put( YamlConfiguration.class, new YamlConfiguration() ); - } catch ( NoClassDefFoundError ex ) - { - // Ignore, no SnakeYAML - } - - try - { - providers.put( JsonConfiguration.class, new JsonConfiguration() ); - } catch ( NoClassDefFoundError ex ) - { - // Ignore, no Gson - } - } - - public static ConfigurationProvider getProvider(Class provider) - { - return providers.get( provider ); - } - - /*------------------------------------------------------------------------*/ - public abstract void save(Configuration config, File file) throws IOException; - - public abstract void save(Configuration config, Writer writer); - - public abstract Configuration load(File file) throws IOException; - - public abstract Configuration load(File file, Configuration defaults) throws IOException; - - public abstract Configuration load(Reader reader); - - public abstract Configuration load(Reader reader, Configuration defaults); - - public abstract Configuration load(InputStream is); - - public abstract Configuration load(InputStream is, Configuration defaults); - - public abstract Configuration load(String string); - - public abstract Configuration load(String string, Configuration defaults); -} \ No newline at end of file diff --git a/Velocity/src/main/java/dev/brighten/antivpn/velocity/config/JsonConfiguration.java b/Velocity/src/main/java/dev/brighten/antivpn/velocity/config/JsonConfiguration.java deleted file mode 100644 index 83ea436..0000000 --- a/Velocity/src/main/java/dev/brighten/antivpn/velocity/config/JsonConfiguration.java +++ /dev/null @@ -1,114 +0,0 @@ -package dev.brighten.antivpn.velocity.config; - -import com.google.common.base.Charsets; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonElement; -import com.google.gson.JsonSerializationContext; -import com.google.gson.JsonSerializer; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; -import java.io.Reader; -import java.io.Writer; -import java.lang.reflect.Type; -import java.util.LinkedHashMap; -import java.util.Map; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -@NoArgsConstructor(access = AccessLevel.PACKAGE) -public class JsonConfiguration extends ConfigurationProvider -{ - - private final Gson json = new GsonBuilder().serializeNulls().setPrettyPrinting().registerTypeAdapter( Configuration.class, new JsonSerializer() - { - @Override - public JsonElement serialize(Configuration src, Type typeOfSrc, JsonSerializationContext context) - { - return context.serialize( ( (Configuration) src ).self ); - } - } ).create(); - - @Override - public void save(Configuration config, File file) throws IOException - { - try ( Writer writer = new OutputStreamWriter( new FileOutputStream( file ), Charsets.UTF_8 ) ) - { - save( config, writer ); - } - } - - @Override - public void save(Configuration config, Writer writer) - { - json.toJson( config.self, writer ); - } - - @Override - public Configuration load(File file) throws IOException - { - return load( file, null ); - } - - @Override - public Configuration load(File file, Configuration defaults) throws IOException - { - try ( FileInputStream is = new FileInputStream( file ) ) - { - return load( is, defaults ); - } - } - - @Override - public Configuration load(Reader reader) - { - return load( reader, null ); - } - - @Override - @SuppressWarnings("unchecked") - public Configuration load(Reader reader, Configuration defaults) - { - Map map = json.fromJson( reader, LinkedHashMap.class ); - if ( map == null ) - { - map = new LinkedHashMap<>(); - } - return new Configuration( map, defaults ); - } - - @Override - public Configuration load(InputStream is) - { - return load( is, null ); - } - - @Override - public Configuration load(InputStream is, Configuration defaults) - { - return load( new InputStreamReader( is, Charsets.UTF_8 ), defaults ); - } - - @Override - public Configuration load(String string) - { - return load( string, null ); - } - - @Override - @SuppressWarnings("unchecked") - public Configuration load(String string, Configuration defaults) - { - Map map = json.fromJson( string, LinkedHashMap.class ); - if ( map == null ) - { - map = new LinkedHashMap<>(); - } - return new Configuration( map, defaults ); - } -} \ No newline at end of file diff --git a/Velocity/src/main/java/dev/brighten/antivpn/velocity/config/YamlConfiguration.java b/Velocity/src/main/java/dev/brighten/antivpn/velocity/config/YamlConfiguration.java deleted file mode 100644 index b69584a..0000000 --- a/Velocity/src/main/java/dev/brighten/antivpn/velocity/config/YamlConfiguration.java +++ /dev/null @@ -1,136 +0,0 @@ -package dev.brighten.antivpn.velocity.config; - -import com.google.common.base.Charsets; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStreamWriter; -import java.io.Reader; -import java.io.Writer; -import java.util.LinkedHashMap; -import java.util.Map; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.yaml.snakeyaml.DumperOptions; -import org.yaml.snakeyaml.Yaml; -import org.yaml.snakeyaml.constructor.Constructor; -import org.yaml.snakeyaml.nodes.Node; -import org.yaml.snakeyaml.representer.Represent; -import org.yaml.snakeyaml.representer.Representer; - -@NoArgsConstructor(access = AccessLevel.PACKAGE) -public class YamlConfiguration extends ConfigurationProvider -{ - - private final ThreadLocal yaml = new ThreadLocal() - { - @Override - protected Yaml initialValue() - { - Representer representer = new Representer() - { - { - representers.put( Configuration.class, new Represent() - { - @Override - public Node representData(Object data) - { - return represent( ( (Configuration) data ).self ); - } - } ); - } - }; - - DumperOptions options = new DumperOptions(); - options.setDefaultFlowStyle( DumperOptions.FlowStyle.BLOCK ); - - return new Yaml( new Constructor(), representer, options ); - } - }; - - @Override - public void save(Configuration config, File file) throws IOException - { - try ( Writer writer = new OutputStreamWriter( new FileOutputStream( file ), Charsets.UTF_8 ) ) - { - save( config, writer ); - } - } - - @Override - public void save(Configuration config, Writer writer) - { - yaml.get().dump( config.self, writer ); - } - - @Override - public Configuration load(File file) throws IOException - { - return load( file, null ); - } - - @Override - public Configuration load(File file, Configuration defaults) throws IOException - { - try ( FileInputStream is = new FileInputStream( file ) ) - { - return load( is, defaults ); - } - } - - @Override - public Configuration load(Reader reader) - { - return load( reader, null ); - } - - @Override - @SuppressWarnings("unchecked") - public Configuration load(Reader reader, Configuration defaults) - { - Map map = yaml.get().loadAs( reader, LinkedHashMap.class ); - if ( map == null ) - { - map = new LinkedHashMap<>(); - } - return new Configuration( map, defaults ); - } - - @Override - public Configuration load(InputStream is) - { - return load( is, null ); - } - - @Override - @SuppressWarnings("unchecked") - public Configuration load(InputStream is, Configuration defaults) - { - Map map = yaml.get().loadAs( is, LinkedHashMap.class ); - if ( map == null ) - { - map = new LinkedHashMap<>(); - } - return new Configuration( map, defaults ); - } - - @Override - public Configuration load(String string) - { - return load( string, null ); - } - - @Override - @SuppressWarnings("unchecked") - public Configuration load(String string, Configuration defaults) - { - Map map = yaml.get().loadAs( string, LinkedHashMap.class ); - if ( map == null ) - { - map = new LinkedHashMap<>(); - } - return new Configuration( map, defaults ); - } -} \ No newline at end of file diff --git a/Velocity/src/main/java/dev/brighten/antivpn/velocity/util/Config.java b/Velocity/src/main/java/dev/brighten/antivpn/velocity/util/Config.java deleted file mode 100644 index aec2ecb..0000000 --- a/Velocity/src/main/java/dev/brighten/antivpn/velocity/util/Config.java +++ /dev/null @@ -1,111 +0,0 @@ -package dev.brighten.antivpn.velocity.util; - -import com.google.common.io.ByteStreams; -import dev.brighten.antivpn.velocity.VelocityPlugin; -import dev.brighten.antivpn.velocity.config.Configuration; -import dev.brighten.antivpn.velocity.config.ConfigurationProvider; -import dev.brighten.antivpn.velocity.config.YamlConfiguration; - -import java.io.*; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -/** - * Author: nitramleo (Martin) - * Date created: 10-Aug-18 - */ -public class Config { - - private File file; - private Configuration configuration; - - public Config() { - File dataFolder = VelocityPlugin.INSTANCE.getConfigDir().toFile(); - this.file = new File(dataFolder, "config.yml"); - try { - if (!this.file.exists()) { - if (!dataFolder.exists()) { - dataFolder.mkdir(); - } - this.file.createNewFile(); - } - this.configuration = ConfigurationProvider.getProvider(YamlConfiguration.class).load(this.file); - } - catch (IOException e) { - e.printStackTrace(); - } - } - - public void load() { - File dataFolder = VelocityPlugin.INSTANCE.getConfigDir().toFile(); - this.file = new File(dataFolder, "config.yml"); - try { - this.configuration = ConfigurationProvider.getProvider(YamlConfiguration.class).load(this.file); - } - catch (IOException e) { - e.printStackTrace(); - } - } - - public void save() { - try { - ConfigurationProvider.getProvider( YamlConfiguration.class).save(this.configuration, this.file); - } - catch (IOException e) { - e.printStackTrace(); - } - } - - public Configuration getConfiguration() { - return this.configuration; - } - - public File getFile() { - return this.file; - } - - public double getDouble(final String path) { - if (this.configuration.get(path) != null) { - return this.configuration.getDouble(path); - } - return 0.0; - } - - public int getInt(final String path) { - if (this.configuration.get(path) != null) { - return this.configuration.getInt(path); - } - return 0; - } - - public Object get(final String path) { - return this.configuration.get(path); - } - - public void set(final String path, final Object object) { - configuration.set(path, object); - } - - public boolean getBoolean(final String path) { - return this.configuration.get(path) != null && this.configuration.getBoolean(path); - } - - public String getString(final String path) { - if (this.configuration.get(path) != null) { - return StringUtils.translateAlternateColorCodes('&', this.configuration.getString(path)); - } - return "String at path: " + path + " not found!"; - } - - public List getStringList(final String path) { - if (this.configuration.get(path) != null) { - final ArrayList strings = new ArrayList(); - for (final String string : this.configuration.getStringList(path)) { - strings.add(StringUtils.translateAlternateColorCodes('&', string)); - } - return strings; - } - return Arrays.asList("String List at path: " + path + " not found!"); - } -} diff --git a/Velocity/src/main/java/dev/brighten/antivpn/velocity/util/ConfigDefault.java b/Velocity/src/main/java/dev/brighten/antivpn/velocity/util/ConfigDefault.java deleted file mode 100644 index 16c6006..0000000 --- a/Velocity/src/main/java/dev/brighten/antivpn/velocity/util/ConfigDefault.java +++ /dev/null @@ -1,28 +0,0 @@ -package dev.brighten.antivpn.velocity.util; - -import dev.brighten.antivpn.velocity.VelocityPlugin; -import lombok.AllArgsConstructor; - -@AllArgsConstructor -public class ConfigDefault { - - private final A defaultValue; - private final String path; - private final VelocityPlugin plugin; - - public A get() { - if(plugin.getConfig().get(path) != null) - return (A) plugin.getConfig().get(path); - else { - plugin.getConfig().set(path, defaultValue); - plugin.getConfig().save(); - return defaultValue; - } - } - - public A set(A value) { - plugin.getConfig().set(path, value); - - return value; - } -}