Additional error handling

feat/data-edit-commands
William 3 years ago
parent 082b3e6c42
commit 60a3bba165

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

@ -148,9 +148,10 @@ public abstract class EventListener {
if (usersAwaitingSync.contains(user.uuid)) { if (usersAwaitingSync.contains(user.uuid)) {
return; return;
} }
plugin.getRedisManager().setUserServerSwitch(user).thenRun(() -> user.getUserData().thenAccept( plugin.getRedisManager().setUserServerSwitch(user).thenRun(() -> user.getUserData(plugin.getLoggingAdapter()).thenAccept(
userData -> plugin.getRedisManager().setUserData(user, userData).thenRun( optionalUserData -> optionalUserData.ifPresent(
() -> plugin.getDatabase().setUserData(user, userData, DataSaveCause.DISCONNECT).join()))); userData -> plugin.getRedisManager().setUserData(user, userData).thenRun(
() -> plugin.getDatabase().setUserData(user, userData, DataSaveCause.DISCONNECT).join()))));
usersAwaitingSync.remove(user.uuid); usersAwaitingSync.remove(user.uuid);
} }
@ -163,8 +164,8 @@ public abstract class EventListener {
if (disabling || !plugin.getSettings().getBooleanValue(Settings.ConfigOption.SYNCHRONIZATION_SAVE_ON_WORLD_SAVE)) { if (disabling || !plugin.getSettings().getBooleanValue(Settings.ConfigOption.SYNCHRONIZATION_SAVE_ON_WORLD_SAVE)) {
return; return;
} }
usersInWorld.forEach(user -> plugin.getDatabase().setUserData(user, user.getUserData().join(), usersInWorld.forEach(user -> user.getUserData(plugin.getLoggingAdapter()).join().ifPresent(
DataSaveCause.WORLD_SAVE).join()); userData -> plugin.getDatabase().setUserData(user, userData, DataSaveCause.WORLD_SAVE).join()));
} }
/** /**
@ -207,8 +208,9 @@ public abstract class EventListener {
public final void handlePluginDisable() { public final void handlePluginDisable() {
disabling = true; disabling = true;
plugin.getOnlineUsers().stream().filter(user -> !usersAwaitingSync.contains(user.uuid)).forEach(user -> plugin.getOnlineUsers().stream().filter(user -> !usersAwaitingSync.contains(user.uuid)).forEach(
plugin.getDatabase().setUserData(user, user.getUserData().join(), DataSaveCause.SERVER_SHUTDOWN).join()); user -> user.getUserData(plugin.getLoggingAdapter()).join().ifPresent(
userData -> plugin.getDatabase().setUserData(user, userData, DataSaveCause.SERVER_SHUTDOWN).join()));
plugin.getDatabase().close(); plugin.getDatabase().close();
plugin.getRedisManager().close(); plugin.getRedisManager().close();

@ -12,6 +12,7 @@ import org.jetbrains.annotations.NotNull;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.logging.Level; import java.util.logging.Level;
@ -258,16 +259,23 @@ public abstract class OnlineUser extends User {
public abstract void showMenu(@NotNull ItemEditorMenu menu); 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() { public final CompletableFuture<Optional<UserData>> getUserData(@NotNull Logger logger) {
return CompletableFuture.supplyAsync( return CompletableFuture.supplyAsync(() -> Optional.of(new UserData(getStatus().join(), getInventory().join(),
() -> new UserData(getStatus().join(), getInventory().join(),
getEnderChest().join(), getPotionEffects().join(), getAdvancements().join(), getEnderChest().join(), getPotionEffects().join(), getAdvancements().join(),
getStatistics().join(), getLocation().join(), getPersistentDataContainer().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();
});
} }
} }

Loading…
Cancel
Save