9
0
mirror of https://github.com/WiIIiam278/HuskSync.git synced 2026-01-04 15:31:37 +00:00

Merge branch 'master' into hotfix/death-sync-event

This commit is contained in:
William
2022-07-13 12:21:42 +01:00
7 changed files with 139 additions and 70 deletions

View File

@@ -72,7 +72,7 @@ public abstract class BaseHuskSyncAPI {
public final CompletableFuture<Optional<UserData>> getUserData(@NotNull User user) {
return CompletableFuture.supplyAsync(() -> {
if (user instanceof OnlineUser) {
return Optional.of(((OnlineUser) user).getUserData().join());
return ((OnlineUser) user).getUserData(plugin.getLoggingAdapter()).join();
} else {
return plugin.getDatabase().getCurrentUserData(user).join().map(UserDataSnapshot::userData);
}
@@ -103,8 +103,8 @@ public abstract class BaseHuskSyncAPI {
* @since 2.0
*/
public final CompletableFuture<Void> saveUserData(@NotNull OnlineUser user) {
return CompletableFuture.runAsync(() -> user.getUserData().thenAccept(userData ->
plugin.getDatabase().setUserData(user, userData, DataSaveCause.API).join()));
return CompletableFuture.runAsync(() -> user.getUserData(plugin.getLoggingAdapter()).thenAccept(optionalUserData -> optionalUserData.ifPresent(
userData -> plugin.getDatabase().setUserData(user, userData, DataSaveCause.API).join())));
}
/**

View File

@@ -76,8 +76,8 @@ public abstract class EventListener {
}
if (disabling || currentMilliseconds.get() > TIME_OUT_MILLISECONDS) {
executor.shutdown();
setUserFromDatabase(user)
.thenAccept(succeeded -> handleSynchronisationCompletion(user, succeeded));
setUserFromDatabase(user).thenAccept(
succeeded -> handleSynchronisationCompletion(user, succeeded));
return;
}
plugin.getRedisManager().getUserData(user).thenAccept(redisUserData ->
@@ -145,9 +145,10 @@ public abstract class EventListener {
if (usersAwaitingSync.contains(user.uuid)) {
return;
}
plugin.getRedisManager().setUserServerSwitch(user).thenRun(() -> user.getUserData().thenAccept(
userData -> plugin.getRedisManager().setUserData(user, userData).thenRun(
() -> plugin.getDatabase().setUserData(user, userData, DataSaveCause.DISCONNECT).join())));
plugin.getRedisManager().setUserServerSwitch(user).thenRun(() -> user.getUserData(plugin.getLoggingAdapter()).thenAccept(
optionalUserData -> optionalUserData.ifPresent(
userData -> plugin.getRedisManager().setUserData(user, userData).thenRun(
() -> plugin.getDatabase().setUserData(user, userData, DataSaveCause.DISCONNECT).join()))));
usersAwaitingSync.remove(user.uuid);
}
@@ -160,8 +161,8 @@ public abstract class EventListener {
if (disabling || !plugin.getSettings().getBooleanValue(Settings.ConfigOption.SYNCHRONIZATION_SAVE_ON_WORLD_SAVE)) {
return;
}
usersInWorld.forEach(user -> plugin.getDatabase().setUserData(user, user.getUserData().join(),
DataSaveCause.WORLD_SAVE).join());
usersInWorld.forEach(user -> user.getUserData(plugin.getLoggingAdapter()).join().ifPresent(
userData -> plugin.getDatabase().setUserData(user, userData, DataSaveCause.WORLD_SAVE).join()));
}
/**
@@ -204,8 +205,9 @@ public abstract class EventListener {
public final void handlePluginDisable() {
disabling = true;
plugin.getOnlineUsers().stream().filter(user -> !usersAwaitingSync.contains(user.uuid)).forEach(user ->
plugin.getDatabase().setUserData(user, user.getUserData().join(), DataSaveCause.SERVER_SHUTDOWN).join());
plugin.getOnlineUsers().stream().filter(user -> !usersAwaitingSync.contains(user.uuid)).forEach(
user -> user.getUserData(plugin.getLoggingAdapter()).join().ifPresent(
userData -> plugin.getDatabase().setUserData(user, userData, DataSaveCause.SERVER_SHUTDOWN).join()));
plugin.getDatabase().close();
plugin.getRedisManager().close();

View File

@@ -12,6 +12,7 @@ import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.logging.Level;
@@ -251,16 +252,23 @@ public abstract class OnlineUser extends User {
public abstract void showMenu(@NotNull ItemEditorMenu menu);
/**
* Get the player's current {@link UserData}
* Get the player's current {@link UserData} in an {@link Optional}
* </p>
* If the user data could not be returned due to an exception, the optional will return empty
*
* @return the player's current {@link UserData}
* @param logger The logger to use for handling exceptions
* @return the player's current {@link UserData} in an optional; empty if an exception occurs
*/
public final CompletableFuture<UserData> getUserData() {
return CompletableFuture.supplyAsync(
() -> new UserData(getStatus().join(), getInventory().join(),
public final CompletableFuture<Optional<UserData>> getUserData(@NotNull Logger logger) {
return CompletableFuture.supplyAsync(() -> Optional.of(new UserData(getStatus().join(), getInventory().join(),
getEnderChest().join(), getPotionEffects().join(), getAdvancements().join(),
getStatistics().join(), getLocation().join(), getPersistentDataContainer().join(),
getMinecraftVersion().toString()));
getMinecraftVersion().toString())))
.exceptionally(exception -> {
logger.log(Level.SEVERE, "Failed to fetch user data for online player " + username + " (" + exception.getMessage() + ")");
exception.printStackTrace();
return Optional.empty();
});
}
}

View File

@@ -165,13 +165,17 @@ public class RedisManager {
return CompletableFuture.supplyAsync(() -> {
try (Jedis jedis = jedisPool.getResource()) {
final byte[] key = getKey(RedisKeyType.DATA_UPDATE, user.uuid);
plugin.getLoggingAdapter().debug("[" + user.username + "] Read " + RedisKeyType.DATA_UPDATE.name()
+ " key from redis at: " +
new SimpleDateFormat("mm:ss.SSS").format(new Date()));
final byte[] dataByteArray = jedis.get(key);
if (dataByteArray == null) {
plugin.getLoggingAdapter().debug("[" + user.username + "] Could not read " +
RedisKeyType.DATA_UPDATE.name() + " key from redis at: " +
new SimpleDateFormat("mm:ss.SSS").format(new Date()));
return Optional.empty();
}
plugin.getLoggingAdapter().debug("[" + user.username + "] Successfully read "
+ RedisKeyType.DATA_UPDATE.name() + " key from redis at: " +
new SimpleDateFormat("mm:ss.SSS").format(new Date()));
// Consume the key (delete from redis)
jedis.del(key);
@@ -188,13 +192,17 @@ public class RedisManager {
return CompletableFuture.supplyAsync(() -> {
try (Jedis jedis = jedisPool.getResource()) {
final byte[] key = getKey(RedisKeyType.SERVER_SWITCH, user.uuid);
plugin.getLoggingAdapter().debug("[" + user.username + "] Read " + RedisKeyType.SERVER_SWITCH.name()
+ " key from redis at: " +
new SimpleDateFormat("mm:ss.SSS").format(new Date()));
final byte[] readData = jedis.get(key);
if (readData == null) {
plugin.getLoggingAdapter().debug("[" + user.username + "] Could not read " +
RedisKeyType.SERVER_SWITCH.name() + " key from redis at: " +
new SimpleDateFormat("mm:ss.SSS").format(new Date()));
return false;
}
plugin.getLoggingAdapter().debug("[" + user.username + "] Successfully read "
+ RedisKeyType.SERVER_SWITCH.name() + " key from redis at: " +
new SimpleDateFormat("mm:ss.SSS").format(new Date()));
// Consume the key (delete from redis)
jedis.del(key);
return true;