diff --git a/gradle.properties b/gradle.properties index 5e6d8b0..a8704be 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,7 @@ yarn_mappings=1.20.1+build.10 loader_version=0.16.3 # Mod Properties -mod_version=1.6.1 +mod_version=1.7.0 maven_group=cc.reconnected archives_base_name=rcc-server diff --git a/src/main/java/cc/reconnected/server/RccServer.java b/src/main/java/cc/reconnected/server/RccServer.java index 3d05265..dbcc731 100644 --- a/src/main/java/cc/reconnected/server/RccServer.java +++ b/src/main/java/cc/reconnected/server/RccServer.java @@ -1,11 +1,13 @@ package cc.reconnected.server; +import cc.reconnected.server.commands.RccCommand; import cc.reconnected.server.database.DatabaseClient; import cc.reconnected.server.database.PlayerData; import cc.reconnected.server.database.PlayerTable; import cc.reconnected.server.events.PlayerWelcome; import cc.reconnected.server.http.ServiceServer; import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; @@ -73,6 +75,8 @@ public class RccServer implements ModInitializer { LOGGER.info("Starting rcc-server"); + CommandRegistrationCallback.EVENT.register(RccCommand::register); + try { // Jumpstart connection database.connection(); diff --git a/src/main/java/cc/reconnected/server/commands/RccCommand.java b/src/main/java/cc/reconnected/server/commands/RccCommand.java new file mode 100644 index 0000000..10ad134 --- /dev/null +++ b/src/main/java/cc/reconnected/server/commands/RccCommand.java @@ -0,0 +1,33 @@ +package cc.reconnected.server.commands; + +import cc.reconnected.server.RccServer; +import com.mojang.brigadier.CommandDispatcher; +import net.minecraft.command.CommandRegistryAccess; +import net.minecraft.server.command.CommandManager; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.text.Text; + +import static com.mojang.brigadier.arguments.StringArgumentType.getString; +import static com.mojang.brigadier.arguments.StringArgumentType.word; +import static net.minecraft.server.command.CommandManager.literal; +import static net.minecraft.server.command.CommandManager.argument; +import static net.minecraft.server.command.CommandManager.*; + +public class RccCommand { + public static void register(CommandDispatcher dispatcher, CommandRegistryAccess registryAccess, CommandManager.RegistrationEnvironment environment) { + dispatcher.register( + literal("rcc") + .requires(source -> source.hasPermissionLevel(2)) + .executes(ctx -> { + return 1; + }) + .then(literal("clearcache") + .executes(context -> { + RccServer.getInstance().playerTable().clearCache(); + context.getSource().sendFeedback(() -> Text.literal("RCC PlayerTable cache cleared!"), false); + return 1; + }) + ) + ); + } +} diff --git a/src/main/java/cc/reconnected/server/database/PlayerTable.java b/src/main/java/cc/reconnected/server/database/PlayerTable.java index 9cedd02..d9d09a8 100644 --- a/src/main/java/cc/reconnected/server/database/PlayerTable.java +++ b/src/main/java/cc/reconnected/server/database/PlayerTable.java @@ -43,6 +43,27 @@ public class PlayerTable { cache.remove(uuid); } + public void clearCache() { + cache.clear(); + } + + public boolean exists(UUID uuid) { + try { + var conn = database().connection(); + + var stmt = conn.prepareStatement("SELECT uuid FROM players WHERE uuid = ?;"); + stmt.setObject(1, uuid); + var set = stmt.executeQuery(); + var exists = set.next(); + stmt.close(); + + return exists; + } catch (SQLException e) { + RccServer.LOGGER.error("Could not get player data from database", e); + return false; + } + } + @Nullable public PlayerData getPlayerData(UUID uuid) { if (cache.containsKey(uuid)) { @@ -79,6 +100,7 @@ public class PlayerTable { } public boolean deletePlayerData(UUID uuid) { + cache.remove(uuid); try { var conn = database().connection(); @@ -87,7 +109,6 @@ public class PlayerTable { stmt.execute(); stmt.close(); - cache.remove(uuid); return true; } catch(SQLException e) { RccServer.LOGGER.error("Could not delete player data from database", e); @@ -95,8 +116,13 @@ public class PlayerTable { } } - public boolean updatePlayerData(PlayerData playerData) { - deletePlayerData(playerData.uuid()); + public boolean createPlayerData(PlayerData playerData) { + if(exists(playerData.uuid())) { + return updatePlayerData(playerData); + } + + cache.put(playerData.uuid(), playerData); + try { var conn = database().connection(); @@ -112,10 +138,37 @@ public class PlayerTable { stmt.execute(); stmt.close(); - cache.put(playerData.uuid(), playerData); + return true; + } catch(SQLException e) { + RccServer.LOGGER.error("Could not create player data from database", e); + return false; + } + } + + public boolean updatePlayerData(PlayerData playerData) { + if(!exists(playerData.uuid())) { + return createPlayerData(playerData); + } + + cache.put(playerData.uuid(), playerData); + + try { + var conn = database().connection(); + + var stmt = conn.prepareStatement("UPDATE players SET lastknownname = ?, discordid = ?, isBot = ?, isAlt = ?, pronouns = ? WHERE uuid = ?"); + //var stmt = conn.prepareStatement("INSERT INTO players(uuid, firstJoined, lastKnownName, discordId, isBot, isAlt, pronouns) VALUES (?,?,?,?,?,?,?);"); + stmt.setString(1, playerData.name()); + stmt.setString(2, playerData.discordId()); + stmt.setBoolean(3, playerData.isBot()); + stmt.setBoolean(4, playerData.isAlt()); + stmt.setString(5, playerData.pronouns()); + stmt.setObject(6, playerData.uuid()); + stmt.execute(); + stmt.close(); + return true; } catch (SQLException e) { - RccServer.LOGGER.error("Could not get player data from database", e); + RccServer.LOGGER.error("Could not update player data on database", e); return false; } }