diff --git a/README.md b/README.md
index 070a8c5..f4a845e 100644
--- a/README.md
+++ b/README.md
@@ -35,8 +35,8 @@
-
-
+
+
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;