API for creating command sender which forwards feedback (#7432)
This commit is contained in:
		
					parent
					
						
							
								3d52daf44d
							
						
					
				
			
			
				commit
				
					
						3cc82403d5
					
				
			
		
					 2 changed files with 233 additions and 0 deletions
				
			
		| 
						 | 
					@ -0,0 +1,54 @@
 | 
				
			||||||
 | 
					From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: Jason Penilla <11360596+jpenilla@users.noreply.github.com>
 | 
				
			||||||
 | 
					Date: Tue, 1 Feb 2022 15:51:44 -0700
 | 
				
			||||||
 | 
					Subject: [PATCH] API for creating command sender which forwards feedback
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
 | 
				
			||||||
 | 
					index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
				
			||||||
 | 
					--- a/src/main/java/org/bukkit/Bukkit.java
 | 
				
			||||||
 | 
					+++ b/src/main/java/org/bukkit/Bukkit.java
 | 
				
			||||||
 | 
					@@ -0,0 +0,0 @@ public final class Bukkit {
 | 
				
			||||||
 | 
					         return server.getConsoleSender();
 | 
				
			||||||
 | 
					     }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+    // Paper start
 | 
				
			||||||
 | 
					+    /**
 | 
				
			||||||
 | 
					+     * Creates a special {@link CommandSender} which redirects command feedback (in the form of chat messages) to the
 | 
				
			||||||
 | 
					+     * specified listener. The returned sender will have the same effective permissions as {@link #getConsoleSender()}.
 | 
				
			||||||
 | 
					+     *
 | 
				
			||||||
 | 
					+     * @param feedback feedback listener
 | 
				
			||||||
 | 
					+     * @return a command sender
 | 
				
			||||||
 | 
					+     */
 | 
				
			||||||
 | 
					+    @NotNull
 | 
				
			||||||
 | 
					+    public static CommandSender createCommandSender(final @NotNull java.util.function.Consumer<? super net.kyori.adventure.text.Component> feedback) {
 | 
				
			||||||
 | 
					+        return server.createCommandSender(feedback);
 | 
				
			||||||
 | 
					+    }
 | 
				
			||||||
 | 
					+    // Paper end
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					     /**
 | 
				
			||||||
 | 
					      * Gets the folder that contains all of the various {@link World}s.
 | 
				
			||||||
 | 
					      *
 | 
				
			||||||
 | 
					diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
 | 
				
			||||||
 | 
					index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
				
			||||||
 | 
					--- a/src/main/java/org/bukkit/Server.java
 | 
				
			||||||
 | 
					+++ b/src/main/java/org/bukkit/Server.java
 | 
				
			||||||
 | 
					@@ -0,0 +0,0 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
 | 
				
			||||||
 | 
					     @NotNull
 | 
				
			||||||
 | 
					     public ConsoleCommandSender getConsoleSender();
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+    // Paper start
 | 
				
			||||||
 | 
					+    /**
 | 
				
			||||||
 | 
					+     * Creates a special {@link CommandSender} which redirects command feedback (in the form of chat messages) to the
 | 
				
			||||||
 | 
					+     * specified listener. The returned sender will have the same effective permissions as {@link #getConsoleSender()}.
 | 
				
			||||||
 | 
					+     *
 | 
				
			||||||
 | 
					+     * @param feedback feedback listener
 | 
				
			||||||
 | 
					+     * @return a command sender
 | 
				
			||||||
 | 
					+     */
 | 
				
			||||||
 | 
					+    @NotNull
 | 
				
			||||||
 | 
					+    public CommandSender createCommandSender(final @NotNull java.util.function.Consumer<? super net.kyori.adventure.text.Component> feedback);
 | 
				
			||||||
 | 
					+    // Paper end
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					     /**
 | 
				
			||||||
 | 
					      * Gets the folder that contains all of the various {@link World}s.
 | 
				
			||||||
 | 
					      *
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,179 @@
 | 
				
			||||||
 | 
					From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: Jason Penilla <11360596+jpenilla@users.noreply.github.com>
 | 
				
			||||||
 | 
					Date: Tue, 1 Feb 2022 15:51:55 -0700
 | 
				
			||||||
 | 
					Subject: [PATCH] API for creating command sender which forwards feedback
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					diff --git a/src/main/java/io/papermc/paper/commands/FeedbackForwardingSender.java b/src/main/java/io/papermc/paper/commands/FeedbackForwardingSender.java
 | 
				
			||||||
 | 
					new file mode 100644
 | 
				
			||||||
 | 
					index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
 | 
				
			||||||
 | 
					--- /dev/null
 | 
				
			||||||
 | 
					+++ b/src/main/java/io/papermc/paper/commands/FeedbackForwardingSender.java
 | 
				
			||||||
 | 
					@@ -0,0 +0,0 @@
 | 
				
			||||||
 | 
					+package io.papermc.paper.commands;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+import io.papermc.paper.adventure.PaperAdventure;
 | 
				
			||||||
 | 
					+import io.papermc.paper.text.PaperComponents;
 | 
				
			||||||
 | 
					+import java.util.UUID;
 | 
				
			||||||
 | 
					+import java.util.function.Consumer;
 | 
				
			||||||
 | 
					+import net.kyori.adventure.audience.MessageType;
 | 
				
			||||||
 | 
					+import net.kyori.adventure.identity.Identity;
 | 
				
			||||||
 | 
					+import net.kyori.adventure.text.Component;
 | 
				
			||||||
 | 
					+import net.minecraft.commands.CommandSource;
 | 
				
			||||||
 | 
					+import net.minecraft.commands.CommandSourceStack;
 | 
				
			||||||
 | 
					+import net.minecraft.network.chat.TextComponent;
 | 
				
			||||||
 | 
					+import net.minecraft.server.level.ServerLevel;
 | 
				
			||||||
 | 
					+import net.minecraft.world.phys.Vec2;
 | 
				
			||||||
 | 
					+import net.minecraft.world.phys.Vec3;
 | 
				
			||||||
 | 
					+import org.bukkit.command.CommandSender;
 | 
				
			||||||
 | 
					+import org.bukkit.craftbukkit.CraftServer;
 | 
				
			||||||
 | 
					+import org.bukkit.craftbukkit.command.ServerCommandSender;
 | 
				
			||||||
 | 
					+import org.checkerframework.checker.nullness.qual.NonNull;
 | 
				
			||||||
 | 
					+import org.checkerframework.checker.nullness.qual.Nullable;
 | 
				
			||||||
 | 
					+import org.checkerframework.framework.qual.DefaultQualifier;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+@DefaultQualifier(NonNull.class)
 | 
				
			||||||
 | 
					+public final class FeedbackForwardingSender extends ServerCommandSender {
 | 
				
			||||||
 | 
					+    private final Consumer<? super Component> feedback;
 | 
				
			||||||
 | 
					+    private final CraftServer server;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+    public FeedbackForwardingSender(final Consumer<? super Component> feedback, final CraftServer server) {
 | 
				
			||||||
 | 
					+        super(((ServerCommandSender) server.getConsoleSender()).perm);
 | 
				
			||||||
 | 
					+        this.server = server;
 | 
				
			||||||
 | 
					+        this.feedback = feedback;
 | 
				
			||||||
 | 
					+    }
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+    @Override
 | 
				
			||||||
 | 
					+    public void sendMessage(final String message) {
 | 
				
			||||||
 | 
					+        this.sendMessage(PaperComponents.legacySectionSerializer().deserialize(message));
 | 
				
			||||||
 | 
					+    }
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+    @Override
 | 
				
			||||||
 | 
					+    public void sendMessage(final String... messages) {
 | 
				
			||||||
 | 
					+        for (final String message : messages) {
 | 
				
			||||||
 | 
					+            this.sendMessage(message);
 | 
				
			||||||
 | 
					+        }
 | 
				
			||||||
 | 
					+    }
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+    @Override
 | 
				
			||||||
 | 
					+    public void sendMessage(final Identity identity, final Component message, final MessageType type) {
 | 
				
			||||||
 | 
					+        this.feedback.accept(message);
 | 
				
			||||||
 | 
					+    }
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+    @Override
 | 
				
			||||||
 | 
					+    public String getName() {
 | 
				
			||||||
 | 
					+        return "FeedbackForwardingSender";
 | 
				
			||||||
 | 
					+    }
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+    @Override
 | 
				
			||||||
 | 
					+    public Component name() {
 | 
				
			||||||
 | 
					+        return Component.text(this.getName());
 | 
				
			||||||
 | 
					+    }
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+    @Override
 | 
				
			||||||
 | 
					+    public boolean isOp() {
 | 
				
			||||||
 | 
					+        return true;
 | 
				
			||||||
 | 
					+    }
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+    @Override
 | 
				
			||||||
 | 
					+    public void setOp(final boolean value) {
 | 
				
			||||||
 | 
					+        throw new UnsupportedOperationException("Cannot change operator status of " + this.getClass().getName());
 | 
				
			||||||
 | 
					+    }
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+    public CommandSourceStack asVanilla() {
 | 
				
			||||||
 | 
					+        final @Nullable ServerLevel overworld = this.server.getServer().overworld();
 | 
				
			||||||
 | 
					+        return new CommandSourceStack(
 | 
				
			||||||
 | 
					+            new Source(this),
 | 
				
			||||||
 | 
					+            overworld == null ? Vec3.ZERO : Vec3.atLowerCornerOf(overworld.getSharedSpawnPos()),
 | 
				
			||||||
 | 
					+            Vec2.ZERO,
 | 
				
			||||||
 | 
					+            overworld,
 | 
				
			||||||
 | 
					+            4,
 | 
				
			||||||
 | 
					+            this.getName(),
 | 
				
			||||||
 | 
					+            new TextComponent(this.getName()),
 | 
				
			||||||
 | 
					+            this.server.getServer(),
 | 
				
			||||||
 | 
					+            null
 | 
				
			||||||
 | 
					+        );
 | 
				
			||||||
 | 
					+    }
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+    private record Source(FeedbackForwardingSender sender) implements CommandSource {
 | 
				
			||||||
 | 
					+        @Override
 | 
				
			||||||
 | 
					+        public void sendMessage(final net.minecraft.network.chat.Component message, final UUID sender) {
 | 
				
			||||||
 | 
					+            this.sender.sendMessage(Identity.identity(sender), PaperAdventure.asAdventure(message));
 | 
				
			||||||
 | 
					+        }
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+        @Override
 | 
				
			||||||
 | 
					+        public boolean acceptsSuccess() {
 | 
				
			||||||
 | 
					+            return true;
 | 
				
			||||||
 | 
					+        }
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+        @Override
 | 
				
			||||||
 | 
					+        public boolean acceptsFailure() {
 | 
				
			||||||
 | 
					+            return true;
 | 
				
			||||||
 | 
					+        }
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+        @Override
 | 
				
			||||||
 | 
					+        public boolean shouldInformAdmins() {
 | 
				
			||||||
 | 
					+            return false;
 | 
				
			||||||
 | 
					+        }
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+        @Override
 | 
				
			||||||
 | 
					+        public CommandSender getBukkitSender(final CommandSourceStack stack) {
 | 
				
			||||||
 | 
					+            return this.sender;
 | 
				
			||||||
 | 
					+        }
 | 
				
			||||||
 | 
					+    }
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
 | 
				
			||||||
 | 
					index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
				
			||||||
 | 
					--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
 | 
				
			||||||
 | 
					+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
 | 
				
			||||||
 | 
					@@ -0,0 +0,0 @@ public final class CraftServer implements Server {
 | 
				
			||||||
 | 
					         return console.console;
 | 
				
			||||||
 | 
					     }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+    // Paper start
 | 
				
			||||||
 | 
					+    @Override
 | 
				
			||||||
 | 
					+    public CommandSender createCommandSender(final java.util.function.Consumer<? super net.kyori.adventure.text.Component> feedback) {
 | 
				
			||||||
 | 
					+        return new io.papermc.paper.commands.FeedbackForwardingSender(feedback, this);
 | 
				
			||||||
 | 
					+    }
 | 
				
			||||||
 | 
					+    // Paper end
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					     public EntityMetadataStore getEntityMetadata() {
 | 
				
			||||||
 | 
					         return this.entityMetadata;
 | 
				
			||||||
 | 
					     }
 | 
				
			||||||
 | 
					diff --git a/src/main/java/org/bukkit/craftbukkit/command/ServerCommandSender.java b/src/main/java/org/bukkit/craftbukkit/command/ServerCommandSender.java
 | 
				
			||||||
 | 
					index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
				
			||||||
 | 
					--- a/src/main/java/org/bukkit/craftbukkit/command/ServerCommandSender.java
 | 
				
			||||||
 | 
					+++ b/src/main/java/org/bukkit/craftbukkit/command/ServerCommandSender.java
 | 
				
			||||||
 | 
					@@ -0,0 +0,0 @@ import org.bukkit.plugin.Plugin;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 public abstract class ServerCommandSender implements CommandSender {
 | 
				
			||||||
 | 
					     private static PermissibleBase blockPermInst;
 | 
				
			||||||
 | 
					-    private final PermissibleBase perm;
 | 
				
			||||||
 | 
					+    public final PermissibleBase perm; // Paper
 | 
				
			||||||
 | 
					     private net.kyori.adventure.pointer.Pointers adventure$pointers; // Paper - implement pointers
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+    // Paper start
 | 
				
			||||||
 | 
					+    public ServerCommandSender(final PermissibleBase permissibleBase) {
 | 
				
			||||||
 | 
					+        this.perm = permissibleBase;
 | 
				
			||||||
 | 
					+    }
 | 
				
			||||||
 | 
					+    // Paper end
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					     public ServerCommandSender() {
 | 
				
			||||||
 | 
					         if (this instanceof CraftBlockCommandSender) {
 | 
				
			||||||
 | 
					             if (ServerCommandSender.blockPermInst == null) {
 | 
				
			||||||
 | 
					diff --git a/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java b/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java
 | 
				
			||||||
 | 
					index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
				
			||||||
 | 
					--- a/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java
 | 
				
			||||||
 | 
					+++ b/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java
 | 
				
			||||||
 | 
					@@ -0,0 +0,0 @@ public final class VanillaCommandWrapper extends BukkitCommand {
 | 
				
			||||||
 | 
					         if (sender instanceof ProxiedCommandSender) {
 | 
				
			||||||
 | 
					             return ((ProxiedNativeCommandSender) sender).getHandle();
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					+        // Paper start
 | 
				
			||||||
 | 
					+        if (sender instanceof io.papermc.paper.commands.FeedbackForwardingSender feedback) {
 | 
				
			||||||
 | 
					+            return feedback.asVanilla();
 | 
				
			||||||
 | 
					+        }
 | 
				
			||||||
 | 
					+        // Paper end
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					         throw new IllegalArgumentException("Cannot make " + sender + " a vanilla command listener");
 | 
				
			||||||
 | 
					     }
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue