Fix unsafe joins on inventory and ender chest commands, better exception catching, Close #58

feat/data-edit-commands
William 2 years ago
parent 480796fbee
commit 089ea5b63a

@ -573,45 +573,45 @@ public class BukkitPlayer extends OnlineUser {
// Deserialize the item data to be shown and show it in a triumph GUI // Deserialize the item data to be shown and show it in a triumph GUI
BukkitSerializer.deserializeItemStackArray(itemData.serializedItems).thenAccept(items -> { BukkitSerializer.deserializeItemStackArray(itemData.serializedItems).thenAccept(items -> {
try { // Build the GUI and populate with items
// Build the GUI and populate with items final int itemCount = items.length;
final int itemCount = items.length; final StorageBuilder guiBuilder = Gui.storage()
final StorageBuilder guiBuilder = Gui.storage() .title(title.toComponent())
.title(title.toComponent()) .rows(Math.max(minimumRows, (int) Math.ceil(itemCount / 9.0)))
.rows(Math.max(minimumRows, (int) Math.ceil(itemCount / 9.0))) .disableAllInteractions()
.disableAllInteractions() .enableOtherActions();
.enableOtherActions(); final StorageGui gui = editable ? guiBuilder.enableAllInteractions().create() : guiBuilder.create();
final StorageGui gui = editable ? guiBuilder.enableAllInteractions().create() : guiBuilder.create(); for (int i = 0; i < itemCount; i++) {
for (int i = 0; i < itemCount; i++) { if (items[i] != null) {
if (items[i] != null) { gui.getInventory().setItem(i, items[i]);
gui.getInventory().setItem(i, items[i]); }
} }
// Complete the future with updated data (if editable) when the GUI is closed
gui.setCloseGuiAction(event -> {
if (!editable) {
updatedData.complete(Optional.empty());
return;
} }
// Complete the future with updated data (if editable) when the GUI is closed // Get and save the updated items
gui.setCloseGuiAction(event -> { final ItemStack[] updatedItems = Arrays.copyOf(event.getPlayer().getOpenInventory()
if (!editable) { .getTopInventory().getContents().clone(), itemCount);
BukkitSerializer.serializeItemStackArray(updatedItems).thenAccept(serializedItems -> {
if (serializedItems.equals(itemData.serializedItems)) {
updatedData.complete(Optional.empty()); updatedData.complete(Optional.empty());
return; return;
} }
updatedData.complete(Optional.of(new ItemData(serializedItems)));
// Get and save the updated items
final ItemStack[] updatedItems = Arrays.copyOf(event.getPlayer().getOpenInventory()
.getTopInventory().getContents().clone(), itemCount);
BukkitSerializer.serializeItemStackArray(updatedItems).thenAccept(serializedItems -> {
if (serializedItems.equals(itemData.serializedItems)) {
updatedData.complete(Optional.empty());
return;
}
updatedData.complete(Optional.of(new ItemData(serializedItems)));
});
}); });
});
// Display the GUI (synchronously; on the main server thread) // Display the GUI (synchronously; on the main server thread)
Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), () -> gui.open(player)); Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), () -> gui.open(player));
} catch (Exception e) { }).exceptionally(throwable -> {
e.printStackTrace(); // Handle exceptions
} updatedData.completeExceptionally(throwable);
return null;
}); });
return updatedData; return updatedData;
} }

@ -13,7 +13,7 @@ public class BukkitLogger extends Logger {
} }
@Override @Override
public void log(@NotNull Level level, @NotNull String message, @NotNull Exception e) { public void log(@NotNull Level level, @NotNull String message, @NotNull Throwable e) {
logger.log(level, message, e); logger.log(level, message, e);
} }

@ -12,8 +12,10 @@ import org.jetbrains.annotations.NotNull;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
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.stream.Collectors; import java.util.stream.Collectors;
public class EnderChestCommand extends CommandBase implements TabCompletable { public class EnderChestCommand extends CommandBase implements TabCompletable {
@ -67,28 +69,34 @@ public class EnderChestCommand extends CommandBase implements TabCompletable {
// Show inventory menu // Show inventory menu
player.showMenu(itemData, allowEdit, 3, plugin.getLocales() player.showMenu(itemData, allowEdit, 3, plugin.getLocales()
.getLocale("ender_chest_viewer_menu_title", dataOwner.username) .getLocale("ender_chest_viewer_menu_title", dataOwner.username)
.orElse(new MineDown("Ender Chest Viewer"))).thenAccept(dataOnClose -> { .orElse(new MineDown("Ender Chest Viewer")))
if (dataOnClose.isEmpty() || !allowEdit) { .exceptionally(throwable -> {
return; plugin.getLoggingAdapter().log(Level.WARNING, "Exception displaying inventory menu to " + player.username, throwable);
} return Optional.empty();
})
.thenAccept(dataOnClose -> {
if (dataOnClose.isEmpty() || !allowEdit) {
return;
}
// Create the updated data // Create the updated data
final UserDataBuilder builder = UserData.builder(plugin.getMinecraftVersion()); final UserDataBuilder builder = UserData.builder(plugin.getMinecraftVersion());
data.getStatus().ifPresent(builder::setStatus); data.getStatus().ifPresent(builder::setStatus);
data.getAdvancements().ifPresent(builder::setAdvancements); data.getAdvancements().ifPresent(builder::setAdvancements);
data.getLocation().ifPresent(builder::setLocation); data.getLocation().ifPresent(builder::setLocation);
data.getPersistentDataContainer().ifPresent(builder::setPersistentDataContainer); data.getPersistentDataContainer().ifPresent(builder::setPersistentDataContainer);
data.getStatistics().ifPresent(builder::setStatistics); data.getStatistics().ifPresent(builder::setStatistics);
data.getPotionEffects().ifPresent(builder::setPotionEffects); data.getPotionEffects().ifPresent(builder::setPotionEffects);
data.getInventory().ifPresent(builder::setInventory); data.getInventory().ifPresent(builder::setInventory);
builder.setEnderChest(dataOnClose.get()); builder.setEnderChest(dataOnClose.get());
// Set the updated data // Set the updated data
final UserData updatedUserData = builder.build(); final UserData updatedUserData = builder.build();
plugin.getDatabase().setUserData(dataOwner, updatedUserData, DataSaveCause.INVENTORY_COMMAND).join(); plugin.getDatabase()
plugin.getRedisManager().sendUserDataUpdate(dataOwner, updatedUserData).join(); .setUserData(dataOwner, updatedUserData, DataSaveCause.INVENTORY_COMMAND)
}); .thenRun(() -> plugin.getRedisManager().sendUserDataUpdate(dataOwner, updatedUserData));
});
}); });
}); });
} }

@ -12,8 +12,10 @@ import org.jetbrains.annotations.NotNull;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
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.stream.Collectors; import java.util.stream.Collectors;
public class InventoryCommand extends CommandBase implements TabCompletable { public class InventoryCommand extends CommandBase implements TabCompletable {
@ -69,13 +71,15 @@ public class InventoryCommand extends CommandBase implements TabCompletable {
player.showMenu(itemData, allowEdit, 5, plugin.getLocales() player.showMenu(itemData, allowEdit, 5, plugin.getLocales()
.getLocale("inventory_viewer_menu_title", dataOwner.username) .getLocale("inventory_viewer_menu_title", dataOwner.username)
.orElse(new MineDown("Inventory Viewer"))) .orElse(new MineDown("Inventory Viewer")))
.exceptionally(throwable -> {
plugin.getLoggingAdapter().log(Level.WARNING, "Exception displaying inventory menu to " + player.username, throwable);
return Optional.empty();
})
.thenAccept(dataOnClose -> { .thenAccept(dataOnClose -> {
if (dataOnClose.isEmpty() || !allowEdit) { if (dataOnClose.isEmpty() || !allowEdit) {
return; return;
} }
plugin.getLoggingAdapter().debug("Inventory data changed, updating user, etc!");
// Create the updated data // Create the updated data
final UserDataBuilder builder = UserData.builder(plugin.getMinecraftVersion()); final UserDataBuilder builder = UserData.builder(plugin.getMinecraftVersion());
data.getStatus().ifPresent(builder::setStatus); data.getStatus().ifPresent(builder::setStatus);
@ -89,8 +93,9 @@ public class InventoryCommand extends CommandBase implements TabCompletable {
// Set the updated data // Set the updated data
final UserData updatedUserData = builder.build(); final UserData updatedUserData = builder.build();
plugin.getDatabase().setUserData(dataOwner, updatedUserData, DataSaveCause.INVENTORY_COMMAND).join(); plugin.getDatabase()
plugin.getRedisManager().sendUserDataUpdate(dataOwner, updatedUserData).join(); .setUserData(dataOwner, updatedUserData, DataSaveCause.INVENTORY_COMMAND)
.thenRun(() -> plugin.getRedisManager().sendUserDataUpdate(dataOwner, updatedUserData));
}); });
}); });
}); });

@ -11,7 +11,7 @@ public abstract class Logger {
private boolean debug; private boolean debug;
public abstract void log(@NotNull Level level, @NotNull String message, @NotNull Exception e); public abstract void log(@NotNull Level level, @NotNull String message, @NotNull Throwable e);
public abstract void log(@NotNull Level level, @NotNull String message); public abstract void log(@NotNull Level level, @NotNull String message);

@ -11,7 +11,7 @@ public class DummyLogger extends Logger {
} }
@Override @Override
public void log(@NotNull Level level, @NotNull String message, @NotNull Exception e) { public void log(@NotNull Level level, @NotNull String message, @NotNull Throwable e) {
System.out.println(level.getName() + ": " + message); System.out.println(level.getName() + ": " + message);
e.printStackTrace(); e.printStackTrace();
} }

Loading…
Cancel
Save