diff --git a/README.md b/README.md index 070a8c5..f4a845e 100644 --- a/README.md +++ b/README.md @@ -35,8 +35,8 @@
- - Logo + + Logo

Reconnect [Velocity]

diff --git a/build.gradle.kts b/build.gradle.kts index fea4f81..b4424c4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -16,6 +16,12 @@ dependencies { compileOnly(libs.litebans.api) compileOnly(libs.luckperms.api) + + implementation(libs.storage.yaml) + implementation(libs.storage.mysql) + implementation(libs.storage.maria) + implementation(libs.storage.sqlite) + implementation(libs.storage.hikari) } sourceSets["main"].resources.srcDir("src/resources/") diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 852f241..0b4528d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,12 +7,24 @@ runPaper = "2.2.4" litebans = "0.5.0" luckperms = "5.4" +yaml = "1.7.2" +mysql = "8.0.29" +maria = "3.3.3" +sqlite = "3.41.2.2" +hikari = "5.1.0" + [libraries] velocity-api = { module = "com.velocitypowered:velocity-api", version.ref = "velocity" } litebans-api = { module = "com.gitlab.ruany:LiteBansAPI", version.ref = "litebans" } luckperms-api = { module = "net.luckperms:api", version.ref = "luckperms" } +storage-yaml = { module = "me.carleslc.Simple-YAML:Simple-Yaml", version.ref = "yaml" } +storage-mysql = { module = "mysql:mysql-connector-java", version.ref = "mysql" } +storage-maria = { module = "org.mariadb.jdbc:mariadb-java-client", version.ref = "maria" } +storage-sqlite = { module = "org.xerial:sqlite-jdbc", version.ref = "sqlite" } +storage-hikari = { module = "com.zaxxer:HikariCP", version.ref = "hikari" } + [plugins] updateDeps = { id = "com.github.ben-manes.versions", version.ref = "updateVersions" } diff --git a/rc_banner.png b/img/rc_banner.png similarity index 100% rename from rc_banner.png rename to img/rc_banner.png diff --git a/rc_logo.png b/img/rc_logo.png similarity index 100% rename from rc_logo.png rename to img/rc_logo.png diff --git a/src/main/java/com/mattmx/reconnect/ReconnectCommand.java b/src/main/java/com/mattmx/reconnect/ReconnectCommand.java index 1ef78f5..5912fcd 100644 --- a/src/main/java/com/mattmx/reconnect/ReconnectCommand.java +++ b/src/main/java/com/mattmx/reconnect/ReconnectCommand.java @@ -1,4 +1,45 @@ package com.mattmx.reconnect; +import com.mattmx.reconnect.util.MessageHelper; +import com.mattmx.reconnect.util.VelocityChat; +import com.mojang.brigadier.Command; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.tree.LiteralCommandNode; +import com.velocitypowered.api.command.BrigadierCommand; +import com.velocitypowered.api.command.CommandMeta; +import com.velocitypowered.api.command.CommandSource; +import com.velocitypowered.api.proxy.ProxyServer; +import org.jetbrains.annotations.NotNull; + public class ReconnectCommand { + + public static void register(@NotNull ReconnectVelocity plugin) { + + // TODO add debug commands + LiteralCommandNode node = BrigadierCommand.literalArgumentBuilder("vreconnect") + .then(BrigadierCommand.literalArgumentBuilder("reload") + .requires((source) -> source.hasPermission("velocity.reconnect.reload")) + .executes((context) -> { + + context.getSource().sendMessage(VelocityChat.color("Reloading plugin")); + plugin.saveDefaultConfig(); + plugin.loadStorage(); + context.getSource().sendMessage(VelocityChat.color("Reloaded!")); + + return Command.SINGLE_SUCCESS; + }) + ).build(); + + CommandMeta meta = plugin.getProxy() + .getCommandManager() + .metaBuilder(node.getName()) + .plugin(plugin) + .build(); + + plugin.getProxy() + .getCommandManager() + .register(meta, new BrigadierCommand(node)); + + } + } diff --git a/src/main/java/com/mattmx/reconnect/ReconnectConfig.java b/src/main/java/com/mattmx/reconnect/ReconnectConfig.java index 8f9a664..117ec87 100644 --- a/src/main/java/com/mattmx/reconnect/ReconnectConfig.java +++ b/src/main/java/com/mattmx/reconnect/ReconnectConfig.java @@ -47,14 +47,14 @@ public class ReconnectConfig { """) public StorageOptions storage = new StorageOptions(); - static class StorageOptions { + public static class StorageOptions { public String method = "yaml"; public StorageOptionsData data = new StorageOptionsData(); } - static class StorageOptionsData { - public String address = "localhost"; + public static class StorageOptionsData { + public String address = "localhost:3306"; @Comment("For sqlite or yaml storage types this will be the file location.") public String database = "reconnect.db"; public String username = "root"; @@ -67,14 +67,14 @@ static class StorageOptionsData { public AdvancedConnectionOptions connectionOptions = new AdvancedConnectionOptions(); } - static class AdvancedConnectionOptions { + public static class AdvancedConnectionOptions { public boolean useJdbcString = false; public String jdbcString = "jdbc:mysql://host:3306/db"; public long connectionTimeout = 30000; public long idleTimeout = 600000; public long keepAliveTime = 0; public long maxLifetime = 1800000; - public long minimumIdle = 10; - public long maximumPoolSize = 10; + public int minimumIdle = 10; + public int maximumPoolSize = 10; } } diff --git a/src/main/java/com/mattmx/reconnect/ReconnectVelocity.java b/src/main/java/com/mattmx/reconnect/ReconnectVelocity.java index be0a0b9..3a43df1 100644 --- a/src/main/java/com/mattmx/reconnect/ReconnectVelocity.java +++ b/src/main/java/com/mattmx/reconnect/ReconnectVelocity.java @@ -2,7 +2,6 @@ import com.google.inject.Inject; import com.mattmx.reconnect.storage.*; -import com.mattmx.reconnect.util.Config; import com.mattmx.reconnect.util.updater.UpdateChecker; import com.moandjiezana.toml.Toml; import com.moandjiezana.toml.TomlWriter; @@ -47,7 +46,7 @@ public class ReconnectVelocity { private UpdateChecker checker; @Inject - public ReconnectVelocity(ProxyServer server, Logger logger, @DataDirectory Path dataDirectory) { + public ReconnectVelocity(@Nullable ProxyServer server, @Nullable Logger logger, @DataDirectory @Nullable Path dataDirectory) { this.proxy = server; this.logger = logger; this.dataDirectory = dataDirectory; @@ -56,11 +55,13 @@ public ReconnectVelocity(ProxyServer server, Logger logger, @DataDirectory Path saveDefaultConfig(); - Config.init(); - StorageManager.registerStorageMethod(new MySqlStorage()); StorageManager.registerStorageMethod(new MariaDbStorage()); StorageManager.registerStorageMethod(new SQLiteStorage()); + StorageManager.registerStorageMethod(new YamlStorage()); + StorageManager.registerStorageMethod(new LuckPermsStorage()); + + ReconnectCommand.register(this); loadStorage(); @@ -68,10 +69,10 @@ public ReconnectVelocity(ProxyServer server, Logger logger, @DataDirectory Path if (checker.get("https://api.github.com/repos/Matt-MX/ReconnectVelocity/releases/latest") .isLatest(this.getClass().getAnnotation(Plugin.class).version())) { - logger.info("Running the latest version! ReconnectVelocity " + checker.getLatest()); + getLogger().info("Running the latest version! ReconnectVelocity " + checker.getLatest()); } else { - logger.info("Newer version available! ReconnectVelocity " + checker.getLatest()); - logger.info("Get it here: " + checker.getLink()); + getLogger().info("Newer version available! ReconnectVelocity " + checker.getLatest()); + getLogger().info("Get it here: " + checker.getLink()); } } @@ -80,6 +81,9 @@ public void loadStorage() { Objects.requireNonNull(method, "That storage method is invalid!"); + // Shutdown current manager + getStorageManager().end(); + storage = StorageManager.createStorageManager(method); } diff --git a/src/main/java/com/mattmx/reconnect/storage/LuckPermsStorage.java b/src/main/java/com/mattmx/reconnect/storage/LuckPermsStorage.java new file mode 100644 index 0000000..73ca486 --- /dev/null +++ b/src/main/java/com/mattmx/reconnect/storage/LuckPermsStorage.java @@ -0,0 +1,60 @@ +package com.mattmx.reconnect.storage; + +import com.mattmx.reconnect.ReconnectVelocity; +import net.luckperms.api.LuckPermsProvider; +import net.luckperms.api.model.user.User; +import net.luckperms.api.node.NodeType; +import net.luckperms.api.node.types.MetaNode; +import org.jetbrains.annotations.NotNull; + +public class LuckPermsStorage extends StorageMethod { + private static final @NotNull String NODE_NAME = "velocity.reconnect"; + + @Override + public void init() { + try { + Class.forName("net.luckperms.api.LuckPermsProvider"); + } catch (ClassNotFoundException exception) { + ReconnectVelocity.get().getLogger().warn("LuckPerms is not installed!"); + exception.printStackTrace(); + } + } + + @Override + public void setLastServer(String uuid, String servername) { + User user = LuckPermsProvider.get() + .getUserManager() + .getUser(uuid); + + if (user == null) return; + + MetaNode node = MetaNode.builder(NODE_NAME, servername) + .build(); + + user.data().clear(NodeType.META.predicate((mn) -> mn.getMetaKey().equals(NODE_NAME))); + user.data().add(node); + + LuckPermsProvider.get() + .getUserManager() + .saveUser(user); + } + + @Override + public String getLastServer(String uuid) { + + User user = LuckPermsProvider.get() + .getUserManager() + .getUser(uuid); + + if (user == null) return null; + + return user.getCachedData() + .getMetaData() + .getMetaValue(NODE_NAME); + } + + @Override + public String getMethod() { + return null; + } +} diff --git a/src/main/java/com/mattmx/reconnect/storage/MariaDbStorage.java b/src/main/java/com/mattmx/reconnect/storage/MariaDbStorage.java index 7825704..3c21b7a 100644 --- a/src/main/java/com/mattmx/reconnect/storage/MariaDbStorage.java +++ b/src/main/java/com/mattmx/reconnect/storage/MariaDbStorage.java @@ -1,38 +1,41 @@ package com.mattmx.reconnect.storage; +import com.mattmx.reconnect.ReconnectConfig; import com.mattmx.reconnect.ReconnectVelocity; -import com.mattmx.reconnect.util.Config; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; -import org.simpleyaml.configuration.file.FileConfiguration; - -import java.sql.*; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; public class MariaDbStorage extends StorageMethod { private HikariDataSource ds; @Override public void init() { - FileConfiguration config = Config.DEFAULT; + ReconnectConfig config = ReconnectVelocity.get().getConfig(); + HikariConfig hikariConfig = new HikariConfig(); hikariConfig.setDriverClassName(org.mariadb.jdbc.Driver.class.getName()); - if (config.getBoolean("storage.data.connection-parameters.useJdbcString", false)) { - hikariConfig.setJdbcUrl(config.getString("storage.data.connection-parameters.jdbcString", "")); + if (config.storage.data.connectionOptions.useJdbcString) { + hikariConfig.setJdbcUrl(config.storage.data.connectionOptions.jdbcString); } else { - hikariConfig.setJdbcUrl("jdbc:mariadb://" + config.getString("storage.data.address", "localhost:3306") + "/" - + config.getString("storage.data.database", "reconnect")); + hikariConfig.setJdbcUrl("jdbc:mariadb://" + config.storage.data.address + "/" + config.storage.data.database); } - hikariConfig.setUsername(config.getString("storage.data.username")); - hikariConfig.setPassword(config.getString("storage.data.password")); - hikariConfig.setConnectionTimeout(config.getLong("storage.data.connection-parameters.connectionTimeout", 30000)); - hikariConfig.setIdleTimeout(config.getLong("storage.data.connection-parameters.idleTimeout", 600000)); - hikariConfig.setKeepaliveTime(config.getLong("storage.data.connection-parameters.keepaliveTime", 0)); - hikariConfig.setMaxLifetime(config.getLong("storage.data.connection-parameters.maxLifetime", 1800000)); - hikariConfig.setMinimumIdle(config.getInt("storage.data.connection-parameters.minimumIdle", 10)); - hikariConfig.setMaximumPoolSize(config.getInt("storage.data.connection-parameters.maximumPoolSize", 10)); - hikariConfig.setPoolName(ReconnectVelocity.get().getName()); + hikariConfig.setUsername(config.storage.data.username); + hikariConfig.setPassword(config.storage.data.password); + hikariConfig.setConnectionTimeout(config.storage.data.connectionOptions.connectionTimeout); + hikariConfig.setIdleTimeout(config.storage.data.connectionOptions.idleTimeout); + hikariConfig.setKeepaliveTime(config.storage.data.connectionOptions.keepAliveTime); + hikariConfig.setMaxLifetime(config.storage.data.connectionOptions.maxLifetime); + hikariConfig.setMinimumIdle(config.storage.data.connectionOptions.minimumIdle); + hikariConfig.setMaximumPoolSize(config.storage.data.connectionOptions.maximumPoolSize); + hikariConfig.setPoolName("reconnect"); + ds = new HikariDataSource(hikariConfig); + try (Connection con = ds.getConnection()) { Statement statement = con.createStatement(); statement.executeUpdate("CREATE TABLE IF NOT EXISTS reconnect_data(" + diff --git a/src/main/java/com/mattmx/reconnect/storage/MySqlStorage.java b/src/main/java/com/mattmx/reconnect/storage/MySqlStorage.java index 87bb30d..dad7285 100644 --- a/src/main/java/com/mattmx/reconnect/storage/MySqlStorage.java +++ b/src/main/java/com/mattmx/reconnect/storage/MySqlStorage.java @@ -1,37 +1,39 @@ package com.mattmx.reconnect.storage; +import com.mattmx.reconnect.ReconnectConfig; import com.mattmx.reconnect.ReconnectVelocity; -import com.mattmx.reconnect.util.Config; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; -import org.simpleyaml.configuration.file.FileConfiguration; - -import java.sql.*; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; public class MySqlStorage extends StorageMethod { private HikariDataSource ds; @Override public void init() { - FileConfiguration config = Config.DEFAULT; + ReconnectConfig config = ReconnectVelocity.get().getConfig(); + HikariConfig hikariConfig = new HikariConfig(); - hikariConfig.setDriverClassName(com.mysql.cj.jdbc.Driver.class.getName()); - if (config.getBoolean("storage.data.connection-parameters.useJdbcString", false)) { - hikariConfig.setJdbcUrl(config.getString("storage.data.connection-parameters.jdbcString", "")); + hikariConfig.setDriverClassName(org.mariadb.jdbc.Driver.class.getName()); + if (config.storage.data.connectionOptions.useJdbcString) { + hikariConfig.setJdbcUrl(config.storage.data.connectionOptions.jdbcString); } else { - hikariConfig.setJdbcUrl("jdbc:mysql://" + config.getString("storage.data.address", "localhost:3306") + "/" - + config.getString("storage.data.database", "reconnect")); + hikariConfig.setJdbcUrl("jdbc:mariadb://" + config.storage.data.address + "/" + config.storage.data.database); } - hikariConfig.setUsername(config.getString("storage.data.username")); - hikariConfig.setPassword(config.getString("storage.data.password")); - hikariConfig.setConnectionTimeout(config.getLong("storage.data.connection-parameters.connectionTimeout", 30000)); - hikariConfig.setIdleTimeout(config.getLong("storage.data.connection-parameters.idleTimeout", 600000)); - hikariConfig.setKeepaliveTime(config.getLong("storage.data.connection-parameters.keepaliveTime", 0)); - hikariConfig.setMaxLifetime(config.getLong("storage.data.connection-parameters.maxLifetime", 1800000)); - hikariConfig.setMinimumIdle(config.getInt("storage.data.connection-parameters.minimumIdle", 10)); - hikariConfig.setMaximumPoolSize(config.getInt("storage.data.connection-parameters.maximumPoolSize", 10)); - hikariConfig.setPoolName(ReconnectVelocity.get().getName()); + hikariConfig.setUsername(config.storage.data.username); + hikariConfig.setPassword(config.storage.data.password); + hikariConfig.setConnectionTimeout(config.storage.data.connectionOptions.connectionTimeout); + hikariConfig.setIdleTimeout(config.storage.data.connectionOptions.idleTimeout); + hikariConfig.setKeepaliveTime(config.storage.data.connectionOptions.keepAliveTime); + hikariConfig.setMaxLifetime(config.storage.data.connectionOptions.maxLifetime); + hikariConfig.setMinimumIdle(config.storage.data.connectionOptions.minimumIdle); + hikariConfig.setMaximumPoolSize(config.storage.data.connectionOptions.maximumPoolSize); + hikariConfig.setPoolName("reconnect"); + ds = new HikariDataSource(hikariConfig); try (Connection con = ds.getConnection()) { Statement statement = con.createStatement(); diff --git a/src/main/java/com/mattmx/reconnect/storage/SQLiteStorage.java b/src/main/java/com/mattmx/reconnect/storage/SQLiteStorage.java index 1a5b807..01ab43e 100644 --- a/src/main/java/com/mattmx/reconnect/storage/SQLiteStorage.java +++ b/src/main/java/com/mattmx/reconnect/storage/SQLiteStorage.java @@ -1,25 +1,27 @@ package com.mattmx.reconnect.storage; +import com.mattmx.reconnect.ReconnectConfig; import com.mattmx.reconnect.ReconnectVelocity; -import com.mattmx.reconnect.util.Config; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; -import org.simpleyaml.configuration.file.FileConfiguration; - -import java.sql.*; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; public class SQLiteStorage extends StorageMethod { private HikariDataSource ds; @Override public void init() { - FileConfiguration config = Config.DEFAULT; + ReconnectConfig config = ReconnectVelocity.get().getConfig(); + HikariConfig hikariConfig = new HikariConfig(); hikariConfig.setDriverClassName(org.sqlite.JDBC.class.getName()); - hikariConfig.setJdbcUrl("jdbc:sqlite:" + ReconnectVelocity.get().getDataFolder() + "/" - + config.getString("storage.data.database", "reconnect.db")); - hikariConfig.setPoolName(ReconnectVelocity.get().getName()); + hikariConfig.setJdbcUrl("jdbc:sqlite:" + ReconnectVelocity.get().getDataDirectory() + "/" + config.storage.data.database); + hikariConfig.setPoolName("reconnect"); + ds = new HikariDataSource(hikariConfig); try (Connection con = ds.getConnection()) { Statement statement = con.createStatement(); diff --git a/src/main/java/com/mattmx/reconnect/storage/YamlStorage.java b/src/main/java/com/mattmx/reconnect/storage/YamlStorage.java index 797bc9e..700f22f 100644 --- a/src/main/java/com/mattmx/reconnect/storage/YamlStorage.java +++ b/src/main/java/com/mattmx/reconnect/storage/YamlStorage.java @@ -1,19 +1,30 @@ package com.mattmx.reconnect.storage; import com.mattmx.reconnect.ReconnectVelocity; -import com.mattmx.reconnect.util.Config; import org.simpleyaml.configuration.file.YamlConfiguration; +import java.io.File; import java.io.IOException; public class YamlStorage extends StorageMethod { public YamlConfiguration data; - public String dataPath = ReconnectVelocity.get().getDataFolder() + "/data.yml"; + public File dataPath = ReconnectVelocity.get() + .getDataDirectory() + .resolve("data.yml") + .toFile(); @Override public void init() { - data = Config.get(dataPath); + if (!dataPath.exists()) { + try { + dataPath.createNewFile(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + data = YamlConfiguration.loadConfiguration(dataPath); } @Override diff --git a/src/main/java/com/mattmx/reconnect/util/updater/UpdateChecker.java b/src/main/java/com/mattmx/reconnect/util/updater/UpdateChecker.java index 6ac2828..3df5bfb 100644 --- a/src/main/java/com/mattmx/reconnect/util/updater/UpdateChecker.java +++ b/src/main/java/com/mattmx/reconnect/util/updater/UpdateChecker.java @@ -1,10 +1,8 @@ package com.mattmx.reconnect.util.updater; -import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; -import org.json.JSONObject; import java.io.BufferedReader; import java.io.IOException;