Add command to clear PlayerTable cache.

Add method to create players, made updating use UPDATE instead of recreating.
This commit is contained in:
Alessandro Proto 2024-09-01 14:16:06 +02:00
parent 1b70b8e487
commit 870b495deb
4 changed files with 96 additions and 6 deletions

View file

@ -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

View file

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

View file

@ -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<ServerCommandSource> 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;
})
)
);
}
}

View file

@ -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;
}
}