This commit is contained in:
modmuss
2023-08-31 12:50:38 +01:00
committed by GitHub
parent 017b9d93e2
commit fce67b32cf
36 changed files with 366 additions and 504 deletions

View File

@@ -17,10 +17,6 @@
package net.fabricmc.fabric.api.message.v1;
import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionException;
import org.jetbrains.annotations.Nullable;
import net.minecraft.network.message.MessageDecorator;
import net.minecraft.text.Text;
@@ -79,27 +75,17 @@ public final class ServerMessageDecoratorEvent {
public static final Identifier STYLING_PHASE = new Identifier("fabric", "styling");
public static final Event<MessageDecorator> EVENT = EventFactory.createWithPhases(MessageDecorator.class, decorators -> (sender, message) -> {
CompletableFuture<Text> future = null;
Text decorated = message;
for (MessageDecorator decorator : decorators) {
if (future == null) {
future = decorator.decorate(sender, message).handle((decorated, throwable) -> handle(decorated, throwable, decorator));
} else {
future = future.thenCompose((decorated) -> decorator.decorate(sender, decorated).handle((newlyDecorated, throwable) -> handle(newlyDecorated, throwable, decorator)));
}
decorated = handle(decorator.decorate(sender, decorated), decorator);
}
return future == null ? CompletableFuture.completedFuture(message) : future;
return decorated;
}, CONTENT_PHASE, Event.DEFAULT_PHASE, STYLING_PHASE);
private static <T extends Text> T handle(T decorated, @Nullable Throwable throwable, MessageDecorator decorator) {
private static <T extends Text> T handle(T decorated, MessageDecorator decorator) {
String decoratorName = decorator.getClass().getName();
if (throwable != null) {
if (throwable instanceof CompletionException) throwable = throwable.getCause();
throw new CompletionException("message decorator %s failed".formatted(decoratorName), throwable);
}
return Objects.requireNonNull(decorated, "message decorator %s returned null".formatted(decoratorName));
}
}

View File

@@ -30,7 +30,6 @@ import net.fabricmc.fabric.api.message.v1.ServerMessageDecoratorEvent;
public class MinecraftServerMixin {
@Inject(method = "getMessageDecorator", at = @At("RETURN"), cancellable = true)
private void onGetChatDecorator(CallbackInfoReturnable<MessageDecorator> cir) {
MessageDecorator originalDecorator = cir.getReturnValue();
cir.setReturnValue((sender, message) -> originalDecorator.decorate(sender, message).thenCompose((decorated) -> ServerMessageDecoratorEvent.EVENT.invoker().decorate(sender, decorated)));
cir.setReturnValue((sender, message) -> ServerMessageDecoratorEvent.EVENT.invoker().decorate(sender, message));
}
}

View File

@@ -16,7 +16,6 @@
package net.fabricmc.fabric.test.message;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import org.slf4j.Logger;
@@ -41,45 +40,28 @@ public class ChatTest implements ModInitializer {
// Basic content phase testing
ServerMessageDecoratorEvent.EVENT.register(ServerMessageDecoratorEvent.CONTENT_PHASE, (sender, message) -> {
if (message.getString().contains("tater")) {
return CompletableFuture.completedFuture(message.copy().append(" :tiny_potato:"));
return message.copy().append(" :tiny_potato:");
}
return CompletableFuture.completedFuture(message);
return message;
});
// Content phase testing, with variable info
ServerMessageDecoratorEvent.EVENT.register(ServerMessageDecoratorEvent.CONTENT_PHASE, (sender, message) -> {
if (message.getString().contains("random")) {
return CompletableFuture.completedFuture(Text.of(String.valueOf(Random.create().nextBetween(0, 100))));
return Text.of(String.valueOf(Random.create().nextBetween(0, 100)));
}
return CompletableFuture.completedFuture(message);
return message;
});
// Basic styling phase testing
ServerMessageDecoratorEvent.EVENT.register(ServerMessageDecoratorEvent.STYLING_PHASE, (sender, message) -> {
if (sender != null && sender.getAbilities().creativeMode) {
return CompletableFuture.completedFuture(message.copy().styled(style -> style.withColor(0xFFA500)));
return message.copy().styled(style -> style.withColor(0xFFA500));
}
return CompletableFuture.completedFuture(message);
});
// Async testing
ServerMessageDecoratorEvent.EVENT.register(ServerMessageDecoratorEvent.CONTENT_PHASE, (sender, message) -> {
if (message.getString().contains("wait")) {
return CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(Random.create().nextBetween(500, 2000));
} catch (InterruptedException ignored) {
// Ignore interruption
}
return message;
}, ioWorkerExecutor);
}
return CompletableFuture.completedFuture(message);
return message;
});
// ServerMessageEvents