From 3b4e9f9561ce07b643b93487ec3deca613ba572a Mon Sep 17 00:00:00 2001 From: samo_lego <34912839+samolego@users.noreply.github.com> Date: Tue, 13 Oct 2020 20:37:14 +0200 Subject: [PATCH] Alpha mongodb support --- .../org/samo_lego/simpleauth/SimpleAuth.java | 2 +- .../simpleauth/commands/AuthCommand.java | 6 +- .../simpleauth/event/AuthEventHandler.java | 1 - .../simpleauth/storage/DBHelper.java | 6 +- .../simpleauth/storage/PlayerCache.java | 112 ++++++++---------- .../simpleauth/storage/database/MongoDB.java | 38 ++---- 6 files changed, 68 insertions(+), 97 deletions(-) diff --git a/src/main/java/org/samo_lego/simpleauth/SimpleAuth.java b/src/main/java/org/samo_lego/simpleauth/SimpleAuth.java index 537bbdd..a6f2032 100644 --- a/src/main/java/org/samo_lego/simpleauth/SimpleAuth.java +++ b/src/main/java/org/samo_lego/simpleauth/SimpleAuth.java @@ -220,7 +220,7 @@ public class SimpleAuth implements DedicatedServerModInitializer { // Marking player as not authenticated String uuid = convertUuid(player); - playerCacheMap.put(uuid, new PlayerCache(uuid, player)); + playerCacheMap.put(uuid, PlayerCache.fromJson(player, DB.getUserData(uuid))); playerCacheMap.get(uuid).isAuthenticated = false; // Teleporting player to spawn to hide its position diff --git a/src/main/java/org/samo_lego/simpleauth/commands/AuthCommand.java b/src/main/java/org/samo_lego/simpleauth/commands/AuthCommand.java index 7667984..047163e 100644 --- a/src/main/java/org/samo_lego/simpleauth/commands/AuthCommand.java +++ b/src/main/java/org/samo_lego/simpleauth/commands/AuthCommand.java @@ -177,7 +177,7 @@ public class AuthCommand { Entity sender = source.getEntity(); THREADPOOL.submit(() -> { DB.deleteUserData(uuid); - SimpleAuth.playerCacheMap.put(uuid, new PlayerCache(uuid, null)); + SimpleAuth.playerCacheMap.put(uuid, new PlayerCache(null)); }); if(sender != null) @@ -205,7 +205,7 @@ public class AuthCommand { playerCache = playerCacheMap.get(uuid); } else { - playerCache = new PlayerCache(uuid, null); + playerCache = new PlayerCache(null); } playerCacheMap.put(uuid, playerCache); @@ -238,7 +238,7 @@ public class AuthCommand { playerCache = playerCacheMap.get(uuid); } else { - playerCache = new PlayerCache(uuid, null); + playerCache = new PlayerCache(null); } playerCacheMap.put(uuid, playerCache); diff --git a/src/main/java/org/samo_lego/simpleauth/event/AuthEventHandler.java b/src/main/java/org/samo_lego/simpleauth/event/AuthEventHandler.java index f8f21db..8c01114 100644 --- a/src/main/java/org/samo_lego/simpleauth/event/AuthEventHandler.java +++ b/src/main/java/org/samo_lego/simpleauth/event/AuthEventHandler.java @@ -176,7 +176,6 @@ public class AuthEventHandler { // Punching a block public static ActionResult onAttackBlock(PlayerEntity player) { - DB.saveAll(playerCacheMap); //todo debug only if(!isAuthenticated((ServerPlayerEntity) player) && !config.experimental.allowBlockPunch) { player.sendMessage(notAuthenticated(player), false); return ActionResult.FAIL; diff --git a/src/main/java/org/samo_lego/simpleauth/storage/DBHelper.java b/src/main/java/org/samo_lego/simpleauth/storage/DBHelper.java index 2ec26cf..85de30a 100644 --- a/src/main/java/org/samo_lego/simpleauth/storage/DBHelper.java +++ b/src/main/java/org/samo_lego/simpleauth/storage/DBHelper.java @@ -47,7 +47,8 @@ public class DBHelper { */ public boolean registerUser(String uuid, String data) { if(config.main.useMongoDB) - return MongoDB.registerUser(uuid, data); + //return MongoDB.registerUser(uuid, data); + System.out.println("Not implemented yet."); return LevelDB.registerUser(uuid, data); } @@ -81,7 +82,8 @@ public class DBHelper { */ public void updateUserData(String uuid, String data) { if(config.main.useMongoDB) - MongoDB.updateUserData(uuid, data); + //MongoDB.updateUserData(uuid, data); + System.out.println("Not implemented yet."); else LevelDB.updateUserData(uuid, data); } diff --git a/src/main/java/org/samo_lego/simpleauth/storage/PlayerCache.java b/src/main/java/org/samo_lego/simpleauth/storage/PlayerCache.java index 86d9b20..b370744 100644 --- a/src/main/java/org/samo_lego/simpleauth/storage/PlayerCache.java +++ b/src/main/java/org/samo_lego/simpleauth/storage/PlayerCache.java @@ -1,11 +1,12 @@ package org.samo_lego.simpleauth.storage; -import com.google.gson.*; +import com.google.gson.Gson; +import com.google.gson.JsonObject; import net.minecraft.block.Blocks; import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.text.LiteralText; -import static org.samo_lego.simpleauth.SimpleAuth.DB; +import java.util.Objects; + import static org.samo_lego.simpleauth.SimpleAuth.config; import static org.samo_lego.simpleauth.utils.SimpleLogger.logInfo; @@ -57,21 +58,21 @@ public class PlayerCache { private static final Gson gson = new Gson(); - public PlayerCache(String uuid, ServerPlayerEntity player) { - if(DB.isClosed()) - return; + public PlayerCache(ServerPlayerEntity player) { + if(config.experimental.debugMode) + logInfo("Creating cache for " + Objects.requireNonNull(player).getName()); + this.isAuthenticated = false; + this.loginTries = 0; if(player != null) { - if(config.experimental.debugMode) - logInfo("Creating cache for " + player.getName()); this.lastIp = player.getIp(); - this.lastAir = player.getAir(); this.wasOnFire = player.isOnFire(); + this.wasInPortal = player.getBlockState().getBlock().equals(Blocks.NETHER_PORTAL); + this.lastAir = player.getAir(); // Setting position cache this.lastDim = String.valueOf(player.getEntityWorld().getRegistryKey().getValue()); - this.wasInPortal = player.getBlockState().getBlock().equals(Blocks.NETHER_PORTAL); this.lastX = player.getX(); this.lastY = player.getY(); this.lastZ = player.getZ(); @@ -82,61 +83,52 @@ public class PlayerCache { this.lastAir = 300; } - String data = DB.getUserData(uuid); - if(!data.isEmpty()) { - // Getting (hashed) password - JsonObject json = gson.fromJson(data, JsonObject.class); - JsonElement passwordElement = json.get("password"); - if(passwordElement instanceof JsonNull) { - if(player != null) { - player.sendMessage(new LiteralText(config.lang.corruptedPlayerData), false); - } + this.isRegistered = false; + this.password = ""; - if(config.experimental.debugMode) - logInfo("Password for " + uuid + " is null! Marking as not registered."); - this.password = ""; - this.isRegistered = false; - } - else { - this.password = passwordElement.getAsString(); - this.isRegistered = true; - } - - - // We should check the DB for saved coords - if(config.main.spawnOnJoin) { - try { - JsonElement lastLoc = json.get("lastLocation"); - if (lastLoc != null) { - // Getting DB coords - JsonObject lastLocation = gson.fromJson(lastLoc.getAsString(), JsonObject.class); - this.lastDim = lastLocation.get("dim").isJsonNull() ? config.worldSpawn.dimension : lastLocation.get("dim").getAsString(); - this.lastX = lastLocation.get("x").isJsonNull() ? config.worldSpawn.x : lastLocation.get("x").getAsDouble(); - this.lastY = lastLocation.get("y").isJsonNull() ? config.worldSpawn.y : lastLocation.get("y").getAsDouble(); - this.lastZ = lastLocation.get("z").isJsonNull() ? config.worldSpawn.z : lastLocation.get("z").getAsDouble(); - - // Removing location data from DB - json.remove("lastLocation"); - DB.updateUserData(uuid, json.toString()); - } - } catch (JsonSyntaxException ignored) { - // Player didn't have any coords in db to tp to - } - } - } - else { - this.isRegistered = false; - this.password = ""; - } - this.isAuthenticated = false; - this.loginTries = 0; if(config.experimental.debugMode) - logInfo("Cache created. Registered: " + this.isRegistered + ", hashed password: " + this.password); + logInfo("New player cache created."); } - public static PlayerCache fromJson(String json) { + public static PlayerCache fromJson(ServerPlayerEntity player, String json) { + if(json.isEmpty()) { + // Player doesn't have data yet + return new PlayerCache(player); + } + if(config.experimental.debugMode) + logInfo("Creating cache for " + Objects.requireNonNull(player).getName()); + + // Parsing data from DB PlayerCache playerCache = gson.fromJson(json, PlayerCache.class); - System.out.println(playerCache); + + playerCache.loginTries = 0; + if(playerCache.password != null && !playerCache.password.isEmpty()) { + playerCache.isRegistered = true; + } + else { + // Not registered + playerCache.isRegistered = false; + playerCache.password = ""; + } + if(player != null) { + playerCache.lastIp = player.getIp(); + + playerCache.wasInPortal = player.getBlockState().getBlock().equals(Blocks.NETHER_PORTAL); + playerCache.lastAir = player.getAir(); + playerCache.wasOnFire = player.isOnFire(); + + // Setting position cache + playerCache.lastDim = String.valueOf(player.getEntityWorld().getRegistryKey().getValue()); + playerCache.lastX = player.getX(); + playerCache.lastY = player.getY(); + playerCache.lastZ = player.getZ(); + } + else { + playerCache.wasInPortal = false; + playerCache.lastAir = 300; + playerCache.wasOnFire = false; + } + return playerCache; } diff --git a/src/main/java/org/samo_lego/simpleauth/storage/database/MongoDB.java b/src/main/java/org/samo_lego/simpleauth/storage/database/MongoDB.java index 478b641..c53af10 100644 --- a/src/main/java/org/samo_lego/simpleauth/storage/database/MongoDB.java +++ b/src/main/java/org/samo_lego/simpleauth/storage/database/MongoDB.java @@ -1,17 +1,13 @@ package org.samo_lego.simpleauth.storage.database; -import com.google.gson.JsonObject; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.InsertOneModel; import com.mongodb.client.model.ReplaceOneModel; -import com.mongodb.client.model.UpdateOneModel; import org.bson.Document; -import org.bson.conversions.Bson; -import org.iq80.leveldb.DBException; import org.samo_lego.simpleauth.storage.PlayerCache; import java.util.ArrayList; @@ -20,7 +16,6 @@ import java.util.List; import static com.mongodb.client.model.Filters.eq; import static org.samo_lego.simpleauth.SimpleAuth.config; -import static org.samo_lego.simpleauth.utils.SimpleLogger.logError; public class MongoDB { private static MongoCollection collection; @@ -44,39 +39,24 @@ public class MongoDB { } public static boolean isUserRegistered(String uuid) { - try { - return collection.find(eq("UUID", uuid)).iterator().hasNext(); - } catch (DBException e) { - logError(e.getMessage()); - } - return false; - } - - public static boolean registerUser(String uuid, String data) { - if(!isUserRegistered(uuid)) { - collection.insertOne( - new Document(uuid, data) - ); - return true; - } - return false; + return collection.find(eq("UUID", uuid)).iterator().hasNext(); } public static void deleteUserData(String uuid) { collection.deleteOne(eq("UUID", uuid)); } - public static void updateUserData(String uuid, String data) { - collection.updateOne(eq("UUID", uuid), new Document(uuid, data)); - } - public static String getUserData(String uuid){ - return isUserRegistered(uuid) ? collection.find(eq("UUID", uuid)).iterator().next().getString(uuid) : ""; + if(isUserRegistered(uuid)) { + Document data = collection.find(eq("UUID", uuid)).iterator().next(); + return data.toJson(); + } + return ""; } public static void saveFromCache(HashMap playerCacheMap) { List> writeList = new ArrayList<>(); - List> updateList = new ArrayList<>(); + List> updateList = new ArrayList<>(); playerCacheMap.forEach((uuid, playerCache) -> { // Save as BSON not JSON stringified Document lastLocation = new Document("x", playerCache.lastX) @@ -93,7 +73,7 @@ public class MongoDB { ); } else { - updateList.add(new UpdateOneModel<>(eq("UUID", uuid), + updateList.add(new ReplaceOneModel<>(eq("UUID", uuid), new Document("UUID", uuid) .append("password", playerCache.password) .append("lastLocation", lastLocation) @@ -101,8 +81,6 @@ public class MongoDB { ); } }); - System.out.println(writeList); - System.out.println(updateList); if(!writeList.isEmpty()) collection.bulkWrite(writeList); if(!updateList.isEmpty())