Skip to content

Commit

Permalink
🔥 Updated storage impl + Added LuckPerms storage option (using meta)
Browse files Browse the repository at this point in the history
  • Loading branch information
Matt-MX committed Sep 18, 2024
1 parent 0ca323d commit 27740df
Show file tree
Hide file tree
Showing 14 changed files with 204 additions and 65 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@
<!-- PROJECT LOGO -->
<br />
<div align="center">
<a href="rc_banner.png">
<img src="rc_banner.png" alt="Logo" width="512">
<a href="img/rc_banner.png">
<img src="img/rc_banner.png" alt="Logo" width="512">
</a>

<h3 align="center">Reconnect [Velocity]</h3>
Expand Down
6 changes: 6 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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/")
Expand Down
12 changes: 12 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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" }
Expand Down
File renamed without changes
File renamed without changes
41 changes: 41 additions & 0 deletions src/main/java/com/mattmx/reconnect/ReconnectCommand.java
Original file line number Diff line number Diff line change
@@ -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<CommandSource> node = BrigadierCommand.literalArgumentBuilder("vreconnect")
.then(BrigadierCommand.literalArgumentBuilder("reload")
.requires((source) -> source.hasPermission("velocity.reconnect.reload"))
.executes((context) -> {

context.getSource().sendMessage(VelocityChat.color("<green>Reloading plugin"));
plugin.saveDefaultConfig();
plugin.loadStorage();
context.getSource().sendMessage(VelocityChat.color("<green>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));

}

}
12 changes: 6 additions & 6 deletions src/main/java/com/mattmx/reconnect/ReconnectConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand All @@ -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;
}
}
18 changes: 11 additions & 7 deletions src/main/java/com/mattmx/reconnect/ReconnectVelocity.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -56,22 +55,24 @@ 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();

checker = new UpdateChecker();

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());
}
}

Expand All @@ -80,6 +81,9 @@ public void loadStorage() {

Objects.requireNonNull(method, "That storage method is invalid!");

// Shutdown current manager
getStorageManager().end();

storage = StorageManager.createStorageManager(method);
}

Expand Down
60 changes: 60 additions & 0 deletions src/main/java/com/mattmx/reconnect/storage/LuckPermsStorage.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
39 changes: 21 additions & 18 deletions src/main/java/com/mattmx/reconnect/storage/MariaDbStorage.java
Original file line number Diff line number Diff line change
@@ -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(" +
Expand Down
40 changes: 21 additions & 19 deletions src/main/java/com/mattmx/reconnect/storage/MySqlStorage.java
Original file line number Diff line number Diff line change
@@ -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();
Expand Down
Loading

0 comments on commit 27740df

Please sign in to comment.