Skip to content

Commit

Permalink
Fix: No response to errors in plot user group modifications (#4197)
Browse files Browse the repository at this point in the history
  • Loading branch information
PierreSchwang authored Oct 5, 2023
1 parent d7e5bcd commit 0d2b36b
Show file tree
Hide file tree
Showing 13 changed files with 195 additions and 55 deletions.
28 changes: 19 additions & 9 deletions Core/src/main/java/com/plotsquared/core/command/Add.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package com.plotsquared.core.command;

import com.google.inject.Inject;
import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.database.DBFunc;
Expand Down Expand Up @@ -101,29 +102,38 @@ public CompletableFuture<Boolean> execute(
Permission.PERMISSION_ADMIN_COMMAND_TRUST))) {
player.sendMessage(
TranslatableCaption.of("errors.invalid_player"),
TagResolver.resolver("value", Tag.inserting(
PlayerManager.resolveName(uuid).toComponent(player)
))
PlotSquared
.platform()
.playerManager()
.getUsernameCaption(uuid)
.thenApply(caption -> TagResolver.resolver(
"value",
Tag.inserting(caption.toComponent(player))
))
);
iterator.remove();
continue;
}
if (plot.isOwner(uuid)) {
player.sendMessage(
TranslatableCaption.of("member.already_added"),
TagResolver.resolver("player", Tag.inserting(
PlayerManager.resolveName(uuid).toComponent(player)
))
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
.thenApply(caption -> TagResolver.resolver(
"player",
Tag.inserting(caption.toComponent(player))
))
);
iterator.remove();
continue;
}
if (plot.getMembers().contains(uuid)) {
player.sendMessage(
TranslatableCaption.of("member.already_added"),
TagResolver.resolver("player", Tag.inserting(
PlayerManager.resolveName(uuid).toComponent(player)
))
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
.thenApply(caption -> TagResolver.resolver(
"player",
Tag.inserting(caption.toComponent(player))
))
);
iterator.remove();
continue;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.NotNull;

/**
* CommandCategory.
Expand Down Expand Up @@ -82,7 +83,7 @@ public enum CommandCategory implements Caption {
// TODO this method shouldn't be invoked
@Deprecated
@Override
public String toString() {
public @NotNull String toString() {
return this.caption.getComponent(LocaleHolder.console());
}

Expand All @@ -108,4 +109,5 @@ boolean canAccess(PlotPlayer<?> player) {
return !MainCommand.getInstance().getCommands(this, player).isEmpty();
}


}
7 changes: 4 additions & 3 deletions Core/src/main/java/com/plotsquared/core/command/Deny.java
Original file line number Diff line number Diff line change
Expand Up @@ -117,10 +117,11 @@ public boolean onCommand(PlotPlayer<?> player, String[] args) {
} else if (plot.getDenied().contains(uuid)) {
player.sendMessage(
TranslatableCaption.of("member.already_added"),
TagResolver.resolver(
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
.thenApply(caption -> TagResolver.resolver(
"player",
Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player))
)
Tag.inserting(caption.toComponent(player))
))
);
return;
} else {
Expand Down
15 changes: 8 additions & 7 deletions Core/src/main/java/com/plotsquared/core/command/Owner.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.util.EventDispatcher;
import com.plotsquared.core.util.PlayerManager;
import com.plotsquared.core.util.TabCompletions;
import com.plotsquared.core.util.task.TaskManager;
import net.kyori.adventure.text.Component;
Expand Down Expand Up @@ -136,21 +135,23 @@ public boolean set(final PlotPlayer<?> player, final Plot plot, String value) {
if (plot.isOwner(uuid)) {
player.sendMessage(
TranslatableCaption.of("member.already_owner"),
TagResolver.resolver(
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
.thenApply(caption -> TagResolver.resolver(
"player",
Tag.inserting(PlayerManager.resolveName(uuid, false).toComponent(player))
)
Tag.inserting(caption.toComponent(player))
))
);
return;
}
if (!force && !player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_SET_OWNER)) {
if (other == null) {
player.sendMessage(
TranslatableCaption.of("errors.invalid_player_offline"),
TagResolver.resolver(
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
.thenApply(caption -> TagResolver.resolver(
"player",
Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player))
)
Tag.inserting(caption.toComponent(player))
))
);
return;
}
Expand Down
26 changes: 15 additions & 11 deletions Core/src/main/java/com/plotsquared/core/command/Trust.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package com.plotsquared.core.command;

import com.google.inject.Inject;
import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.database.DBFunc;
Expand Down Expand Up @@ -103,32 +104,35 @@ public CompletableFuture<Boolean> execute(
player.hasPermission(Permission.PERMISSION_TRUST_EVERYONE) || player.hasPermission(Permission.PERMISSION_ADMIN_COMMAND_TRUST))) {
player.sendMessage(
TranslatableCaption.of("errors.invalid_player"),
TagResolver.resolver(
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
.thenApply(caption -> TagResolver.resolver(
"value",
Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player))
)
Tag.inserting(caption.toComponent(player))
))
);
iterator.remove();
continue;
}
if (currentPlot.isOwner(uuid)) {
player.sendMessage(
TranslatableCaption.of("member.already_added"),
TagResolver.resolver(
"value",
Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player))
)
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
.thenApply(caption -> TagResolver.resolver(
"player",
Tag.inserting(caption.toComponent(player))
))
);
iterator.remove();
continue;
}
if (currentPlot.getTrusted().contains(uuid)) {
player.sendMessage(
TranslatableCaption.of("member.already_added"),
TagResolver.resolver(
"value",
Tag.inserting(PlayerManager.resolveName(uuid).toComponent(player))
)
PlotSquared.platform().playerManager().getUsernameCaption(uuid)
.thenApply(caption -> TagResolver.resolver(
"player",
Tag.inserting(caption.toComponent(player))
))
);
iterator.remove();
continue;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,6 @@ public interface Caption {
*/
@NonNull Component toComponent(@NonNull LocaleHolder localeHolder);

@NonNull String toString();

}
Original file line number Diff line number Diff line change
Expand Up @@ -51,4 +51,9 @@ private StaticCaption(final String value) {
return MiniMessage.miniMessage().deserialize(this.value);
}

@Override
public @NonNull String toString() {
return "StaticCaption(" + value + ")";
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.NotNull;

import java.util.Locale;
import java.util.regex.Pattern;
Expand Down Expand Up @@ -132,4 +133,9 @@ public int hashCode() {
return Objects.hashCode(this.getNamespace(), this.getKey());
}

@Override
public @NotNull String toString() {
return "TranslatableCaption(" + getNamespace() + ":" + getKey() + ")";
}

}
32 changes: 18 additions & 14 deletions Core/src/main/java/com/plotsquared/core/listener/PlotListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -55,15 +55,13 @@
import com.plotsquared.core.plot.flag.implementations.WeatherFlag;
import com.plotsquared.core.plot.flag.types.TimedFlag;
import com.plotsquared.core.util.EventDispatcher;
import com.plotsquared.core.util.PlayerManager;
import com.plotsquared.core.util.task.TaskManager;
import com.plotsquared.core.util.task.TaskTime;
import com.sk89q.worldedit.world.gamemode.GameMode;
import com.sk89q.worldedit.world.gamemode.GameModes;
import com.sk89q.worldedit.world.item.ItemType;
import com.sk89q.worldedit.world.item.ItemTypes;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.ComponentLike;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
Expand All @@ -77,6 +75,7 @@
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;

public class PlotListener {

Expand Down Expand Up @@ -321,22 +320,27 @@ public boolean plotEntry(final PlotPlayer<?> player, final Plot plot) {
}
if ((lastPlot != null) && plot.getId().equals(lastPlot.getId()) && plot.hasOwner()) {
final UUID plotOwner = plot.getOwnerAbs();
ComponentLike owner = PlayerManager.resolveName(plotOwner, true).toComponent(player);
Caption header = fromFlag ? StaticCaption.of(title) : TranslatableCaption.of("titles" +
".title_entered_plot");
Caption subHeader = fromFlag ? StaticCaption.of(subtitle) : TranslatableCaption.of("titles" +
".title_entered_plot_sub");
TagResolver resolver = TagResolver.builder()
.tag("plot", Tag.inserting(Component.text(lastPlot.getId().toString())))
.tag("world", Tag.inserting(Component.text(player.getLocation().getWorldName())))
.tag("owner", Tag.inserting(owner))
.tag("alias", Tag.inserting(Component.text(plot.getAlias())))
.build();
if (Settings.Titles.TITLES_AS_ACTIONBAR) {
player.sendActionBar(header, resolver);
} else {
player.sendTitle(header, subHeader, resolver);
}

CompletableFuture<TagResolver> future = PlotSquared.platform().playerManager()
.getUsernameCaption(plotOwner).thenApply(caption -> TagResolver.builder()
.tag("owner", Tag.inserting(caption.toComponent(player)))
.tag("plot", Tag.inserting(Component.text(lastPlot.getId().toString())))
.tag("world", Tag.inserting(Component.text(player.getLocation().getWorldName())))
.tag("alias", Tag.inserting(Component.text(plot.getAlias())))
.build()
);

future.whenComplete((tagResolver, throwable) -> {
if (Settings.Titles.TITLES_AS_ACTIONBAR) {
player.sendActionBar(header, tagResolver);
} else {
player.sendTitle(header, subHeader, tagResolver);
}
});
}
}, TaskTime.seconds(1L));
}
Expand Down
49 changes: 49 additions & 0 deletions Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@
import java.util.Queue;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;

Expand Down Expand Up @@ -953,6 +954,54 @@ public void sendMessage(
}
}

/**
* Sends a message to the command caller, when the future is resolved
*
* @param caption Caption to send
* @param asyncReplacement Async variable replacement
* @return A Future to be resolved, after the message was sent
* @since TODO
*/
public final CompletableFuture<Void> sendMessage(
@NonNull Caption caption,
CompletableFuture<@NonNull TagResolver> asyncReplacement
) {
return sendMessage(caption, new CompletableFuture[]{asyncReplacement});
}

/**
* Sends a message to the command caller, when all futures are resolved
*
* @param caption Caption to send
* @param asyncReplacements Async variable replacements
* @param replacements Sync variable replacements
* @return A Future to be resolved, after the message was sent
* @since TODO
*/
public final CompletableFuture<Void> sendMessage(
@NonNull Caption caption,
CompletableFuture<@NonNull TagResolver>[] asyncReplacements,
@NonNull TagResolver... replacements
) {
return CompletableFuture.allOf(asyncReplacements).whenComplete((unused, throwable) -> {
Set<TagResolver> resolvers = new HashSet<>(Arrays.asList(replacements));
if (throwable != null) {
sendMessage(
TranslatableCaption.of("errors.error"),
TagResolver.resolver("value", Tag.inserting(
Component.text("Failed to resolve asynchronous caption replacements")
))
);
LOGGER.error("Failed to resolve asynchronous tagresolver(s) for " + caption, throwable);
} else {
for (final CompletableFuture<TagResolver> asyncReplacement : asyncReplacements) {
resolvers.add(asyncReplacement.join());
}
}
sendMessage(caption, resolvers.toArray(TagResolver[]::new));
});
}

// Redefine from PermissionHolder as it's required from CommandCaller
@Override
public boolean hasPermission(@NonNull String permission) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.flag.PlotFlag;
import com.plotsquared.core.queue.QueueCoordinator;
import com.plotsquared.core.util.PlayerManager;
import com.plotsquared.core.util.task.TaskManager;
import com.plotsquared.core.util.task.TaskTime;
import com.sk89q.worldedit.function.pattern.Pattern;
Expand All @@ -59,6 +58,7 @@
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
Expand Down Expand Up @@ -383,13 +383,17 @@ public boolean unlinkPlot(final boolean createRoad, final boolean createSign, fi
}
if (createSign) {
queue.setCompleteTask(() -> TaskManager.runTaskAsync(() -> {
for (Plot current : plots) {
current.getPlotModificationManager().setSign(PlayerManager.resolveName(current.getOwnerAbs()).getComponent(
LocaleHolder.console()));
}
if (whenDone != null) {
TaskManager.runTask(whenDone);
}
List<CompletableFuture<Void>> tasks = plots.stream().map(current -> PlotSquared.platform().playerManager()
.getUsernameCaption(current.getOwnerAbs())
.thenAccept(caption -> current
.getPlotModificationManager()
.setSign(caption.getComponent(LocaleHolder.console()))))
.toList();
CompletableFuture.allOf(tasks.toArray(CompletableFuture[]::new)).whenComplete((unused, throwable) -> {
if (whenDone != null) {
TaskManager.runTask(whenDone);
}
});
}));
} else if (whenDone != null) {
queue.setCompleteTask(whenDone);
Expand Down
Loading

0 comments on commit 0d2b36b

Please sign in to comment.