Skip to content

Commit

Permalink
feat: Reworked the entire database
Browse files Browse the repository at this point in the history
Added support for local storage (JSON)
  • Loading branch information
GeorgeV220 committed Feb 13, 2023
1 parent 0ae2cf5 commit f10ec9a
Show file tree
Hide file tree
Showing 11 changed files with 186 additions and 780 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ public void updateSkin(@NotNull PlayerObject playerObject, @NotNull String skinN
if (dataWatcher != null) {
Object dataWatcherObject;
try {
dataWatcherObject = invokeConstructor(BukkitMinecraftUtils.MinecraftReflection.getNMSClass("DataWatcherObject"), 16, fetchField(getNMSClass("DataWatcherRegistry"), null, "a"));
dataWatcherObject = invokeConstructor(BukkitMinecraftUtils.MinecraftReflection.getNMSClass("DataWatcherObject"), 16, fetchField(getNMSClass("DataWatcherRegistry"), null, "propertyFromLinkedTreeMap"));
} catch (ClassNotFoundException e) {
callback.onFailure(e);
return;
Expand Down
111 changes: 30 additions & 81 deletions core/src/main/java/com/georgev22/skinoverlay/SkinOverlay.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.georgev22.library.maps.HashObjectMap;
import com.georgev22.library.maps.ObjectMap;
import com.georgev22.library.scheduler.SchedulerManager;
import com.georgev22.library.utilities.UserManager;
import com.georgev22.library.utilities.Utils;
import com.georgev22.library.yaml.file.FileConfiguration;
import com.georgev22.skinoverlay.commands.SkinOverlayCommand;
Expand All @@ -14,15 +15,12 @@
import com.georgev22.skinoverlay.utilities.MessagesUtil;
import com.georgev22.skinoverlay.utilities.OptionsUtil;
import com.georgev22.skinoverlay.utilities.Updater;
import com.georgev22.skinoverlay.utilities.interfaces.IDatabaseType;
import com.georgev22.skinoverlay.utilities.interfaces.SkinOverlayImpl;
import com.georgev22.skinoverlay.utilities.player.PlayerObject;
import com.georgev22.skinoverlay.utilities.player.UserData;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoDatabase;
import lombok.Getter;
import lombok.Setter;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;

import java.io.File;
Expand Down Expand Up @@ -50,30 +48,8 @@ public class SkinOverlay {
@Getter
private DatabaseWrapper databaseWrapper = null;

/**
* Return Database Type
*
* @return Database Type
*/
@Getter
private IDatabaseType iDatabaseType = null;

/**
* Get Database open connection
*
* @return connection
*/
@Getter
private Connection connection = null;

/**
* Return MongoDB instance when MongoDB is in use.
* <p>
* Returns null if MongoDB is not in use
*
* @return {@link com.georgev22.library.database.mongo.MongoDB} instance
*/
@Getter
private MongoClient mongoClient = null;

@Getter
Expand All @@ -86,6 +62,9 @@ public class SkinOverlay {
@Setter
private CommandManager<?, ?, ?, ?, ?, ?> commandManager;

@Getter
private UserManager userManager;

public static SkinOverlay getInstance() {
return instance == null ? (instance = new SkinOverlay()) : instance;
}
Expand Down Expand Up @@ -130,26 +109,16 @@ public void onEnable() {
}

public void onDisable() {
UserData.getLoadedUsers().forEach((userData, user) -> {
userData.save(false, new Utils.Callback<>() {
@Override
public Boolean onSuccess() {
return true;
}

@Contract(pure = true)
@Override
public @NotNull Boolean onFailure() {
return false;
}

@Override
public @NotNull Boolean onFailure(@NotNull Throwable throwable) {
throwable.printStackTrace();
return onFailure();
}
});
});
userManager.getLoadedUsers().forEach((uuid, loadedUser) -> userManager.getUser(uuid).handle((user, throwable) -> {
if (throwable != null) {
getLogger().log(Level.SEVERE, "Error: ", throwable);
return null;
}
return user;
}).thenAccept(user -> {
if (user != null)
userManager.save(user);
}));
if (connection != null) {
try {
connection.close();
Expand Down Expand Up @@ -232,11 +201,8 @@ public List<String> getOverlayList() {
*/
private void setupDatabase() throws Exception {
ObjectMap<String, ObjectMap.Pair<String, String>> map = new HashObjectMap<String, ObjectMap.Pair<String, String>>()
.append("uuid", ObjectMap.Pair.create("VARCHAR(38)", "NULL"))
.append("skinName", ObjectMap.Pair.create("VARCHAR(18)", "NULL"))
.append("property-name", ObjectMap.Pair.create("LONGTEXT", "NULL"))
.append("property-value", ObjectMap.Pair.create("LONGTEXT", "NULL"))
.append("property-signature", ObjectMap.Pair.create("LONGTEXT", "NULL"));
.append("user_id", ObjectMap.Pair.create("VARCHAR(38)", "NULL"))
.append("user_json", ObjectMap.Pair.create("LONGTEXT", "NULL"));
switch (OptionsUtil.DATABASE_TYPE.getStringValue()) {
case "MySQL" -> {
if (connection == null || connection.isClosed()) {
Expand All @@ -248,7 +214,7 @@ private void setupDatabase() throws Exception {
OptionsUtil.DATABASE_DATABASE.getStringValue());
connection = databaseWrapper.connect().getSQLConnection();
databaseWrapper.getSQLDatabase().createTable(OptionsUtil.DATABASE_TABLE_NAME.getStringValue(), map);
iDatabaseType = new UserData.SQLUserUtils();
this.userManager = new UserManager(UserManager.Type.SQL, connection, OptionsUtil.DATABASE_TABLE_NAME.getStringValue());
getLogger().log(Level.INFO, "[" + getDescription().name() + "] [" + getDescription().version() + "] Database: MySQL");
}
}
Expand All @@ -262,7 +228,7 @@ private void setupDatabase() throws Exception {
OptionsUtil.DATABASE_DATABASE.getStringValue());
connection = databaseWrapper.connect().getSQLConnection();
databaseWrapper.getSQLDatabase().createTable(OptionsUtil.DATABASE_TABLE_NAME.getStringValue(), map);
iDatabaseType = new UserData.SQLUserUtils();
this.userManager = new UserManager(UserManager.Type.SQL, connection, OptionsUtil.DATABASE_TABLE_NAME.getStringValue());
getLogger().log(Level.INFO, "[" + getDescription().name() + "] [" + getDescription().version() + "] Database: PostgreSQL");
}
}
Expand All @@ -271,7 +237,7 @@ private void setupDatabase() throws Exception {
databaseWrapper = new DatabaseWrapper(DatabaseType.SQLITE, getDataFolder().getAbsolutePath(), OptionsUtil.DATABASE_SQLITE.getStringValue());
connection = databaseWrapper.connect().getSQLConnection();
databaseWrapper.getSQLDatabase().createTable(OptionsUtil.DATABASE_TABLE_NAME.getStringValue(), map);
iDatabaseType = new UserData.SQLUserUtils();
this.userManager = new UserManager(UserManager.Type.SQL, connection, OptionsUtil.DATABASE_TABLE_NAME.getStringValue());
getLogger().log(Level.INFO, "[" + getDescription().name() + "] [" + getDescription().version() + "] Database: SQLite");
}
}
Expand All @@ -283,47 +249,30 @@ private void setupDatabase() throws Exception {
OptionsUtil.DATABASE_MONGO_PASSWORD.getStringValue(),
OptionsUtil.DATABASE_MONGO_DATABASE.getStringValue())
.connect();
iDatabaseType = new UserData.MongoDBUtils();
mongoClient = databaseWrapper.getMongoClient();
mongoDatabase = databaseWrapper.getMongoDatabase();
this.userManager = new UserManager(UserManager.Type.SQL, databaseWrapper.getMongoDB(), OptionsUtil.DATABASE_MONGO_COLLECTION.getStringValue());
getLogger().log(Level.INFO, "[" + getDescription().name() + "] [" + getDescription().version() + "] Database: MongoDB");
}
default -> {
databaseWrapper = null;
mongoClient = null;
mongoDatabase = null;
iDatabaseType = new UserData.Cache();
getLogger().log(Level.INFO, "[" + getDescription().name() + "] [" + getDescription().version() + "] Database: Cache");
this.userManager = new UserManager(UserManager.Type.JSON, new File(this.getDataFolder(), "userdata"), null);
getLogger().log(Level.INFO, "[" + getDescription().name() + "] [" + getDescription().version() + "] Database: File");
}
}

UserData.loadAllUsers();
//userManager.loadAll();

onlinePlayers().forEach(player -> {
UserData userData = UserData.getUser(player.playerUUID());
try {
userData.load(new Utils.Callback<>() {
@Override
public Boolean onSuccess() {
UserData.getAllUsersMap().append(userData.user().getUniqueId(), userData.user());
return true;
}

@Contract(pure = true)
@Override
public @NotNull Boolean onFailure() {
return false;
}

@Override
public @NotNull Boolean onFailure(@NotNull Throwable throwable) {
throwable.printStackTrace();
return onFailure();
}
});
} catch (Exception e) {
e.printStackTrace();
}
userManager.getUser(player.playerUUID()).handle((user, throwable) -> {
if (throwable != null) {
getLogger().log(Level.SEVERE, "Error retrieving user: ", throwable);
return null;
}
return user;
});
});

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,18 @@
import co.aikar.commands.annotation.*;
import com.georgev22.library.maps.HashObjectMap;
import com.georgev22.library.maps.ObjectMap;
import com.georgev22.library.utilities.Utils;
import com.georgev22.skinoverlay.SkinOverlay;
import com.georgev22.skinoverlay.config.FileManager;
import com.georgev22.skinoverlay.utilities.MessagesUtil;
import com.georgev22.skinoverlay.utilities.Utilities;
import com.georgev22.skinoverlay.utilities.player.PlayerObject;
import com.georgev22.skinoverlay.utilities.player.UserData;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import org.jetbrains.annotations.NotNull;

import javax.imageio.ImageIO;
import java.io.File;
import java.util.Arrays;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.logging.Level;

@CommandAlias("skinoverlay|soverlay|skino")
Expand Down Expand Up @@ -50,49 +47,24 @@ public void onHelp(final @NotNull CommandIssuer issuer) {
@CommandAlias("skinoverlayreload|soverlayreload|skinoreload|sreload")
@CommandPermission("skinoverlay.reload")
public void reload(final @NotNull CommandIssuer issuer) {
UserData.getLoadedUsers().forEach((userData, user) -> {
userData.save(false, new Utils.Callback<>() {
@Override
public Boolean onSuccess() {
final AtomicBoolean atomicBoolean = new AtomicBoolean(false);
try {
UserData.getLoadedUsers().remove(userData);
userData.load(new Utils.Callback<>() {
@Override
public Boolean onSuccess() {
atomicBoolean.set(true);
Utilities.updateSkin(user.getPlayer().orElseThrow(), true);
UserData.getLoadedUsers().append(userData, userData.user());
return atomicBoolean.get();
}

@Override
public Boolean onFailure() {
atomicBoolean.set(false);
return atomicBoolean.get();
}

@Override
public Boolean onFailure(Throwable throwable) {
atomicBoolean.set(false);
return super.onFailure(throwable);
}
});
} catch (Exception e) {
atomicBoolean.set(false);
skinOverlay.getLogger().log(Level.SEVERE, "Error: ", e);
}
return atomicBoolean.get();
skinOverlay.getUserManager().getLoadedUsers().forEach((uuid, loadedUser) -> {
skinOverlay.getUserManager().getUser(uuid).handle((user, throwable) -> {
if (throwable != null) {
skinOverlay.getLogger().log(Level.SEVERE, "Error: ", throwable);
return null;
}

@Override
public Boolean onFailure() {
return false;
return user;
}).thenApply(user -> {
if (user == null) {
return null;
}

@Override
public Boolean onFailure(Throwable throwable) {
return super.onFailure(throwable);
skinOverlay.getUserManager().save(user);
return user;
}).thenAccept(user -> {
if (user != null) {
Optional<PlayerObject> optionalPlayerObject = skinOverlay.getPlayer(user.getId());
if (optionalPlayerObject.isPresent() && optionalPlayerObject.get().isOnline())
Utilities.updateSkin(optionalPlayerObject.get(), true);
}
});
});
Expand Down

0 comments on commit f10ec9a

Please sign in to comment.