67 lines
3.0 KiB
Java
67 lines
3.0 KiB
Java
package io.gitlab.jfronny.betterwhitelist.client;
|
|
|
|
import io.gitlab.jfronny.betterwhitelist.BetterWhitelist;
|
|
import io.gitlab.jfronny.muscript.compiler.Parser;
|
|
import io.gitlab.jfronny.muscript.data.Scope;
|
|
import io.gitlab.jfronny.muscript.data.dynamic.DCallable;
|
|
import io.gitlab.jfronny.muscript.data.dynamic.Dynamic;
|
|
import io.gitlab.jfronny.muscript.data.dynamic.additional.DFinal;
|
|
import net.fabricmc.api.*;
|
|
import net.fabricmc.fabric.api.client.networking.v1.ClientLoginNetworking;
|
|
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
|
|
import net.minecraft.client.MinecraftClient;
|
|
import net.minecraft.network.PacketByteBuf;
|
|
import net.minecraft.text.TextContent;
|
|
|
|
import java.util.*;
|
|
import java.util.concurrent.CompletableFuture;
|
|
|
|
@Environment(EnvType.CLIENT)
|
|
public class BetterWhitelistClient implements ClientModInitializer {
|
|
@Override
|
|
public void onInitializeClient() {
|
|
ClientLoginNetworking.registerGlobalReceiver(BetterWhitelist.HANDSHAKE_CHANNEL, (client, handler, buf, listenerAdder) -> {
|
|
// buf also contains the server version
|
|
PacketByteBuf resultBuf = PacketByteBufs.create();
|
|
resultBuf.writeInt(BetterWhitelist.PROTOCOL_VERSION);
|
|
return CompletableFuture.completedFuture(resultBuf);
|
|
});
|
|
|
|
ClientLoginNetworking.registerGlobalReceiver(BetterWhitelist.CHALLENGE_CHANNEL, (client, handler, buf, listenerAdder) -> {
|
|
Scope fork = BetterWhitelist.SCOPE.fork();
|
|
fork.set("resourcePacks", MinecraftClient.getInstance()
|
|
.getResourcePackManager()
|
|
.getEnabledProfiles()
|
|
.stream()
|
|
.map(s -> DFinal.of(Map.of(
|
|
"name", DFinal.of(s.getName()),
|
|
"displayName", DFinal.of(toString(s.getDisplayName().getContent())),
|
|
"description", DFinal.of(toString(s.getDescription().getContent()))
|
|
)))
|
|
.toList());
|
|
String scriptSource = buf.readString();
|
|
BetterWhitelist.LOG.info("Received challenge: " + scriptSource);
|
|
DCallable script = Parser.parse(scriptSource).asDynamicExpr().get(fork).asCallable();
|
|
int paramSize = buf.readInt();
|
|
List<Dynamic<?>> params = new LinkedList<>();
|
|
for (int i = 0; i < paramSize; i++) {
|
|
params.add(Parser.parse(buf.readString()).asDynamicExpr().get(fork));
|
|
}
|
|
String resultString = Dynamic.serialize(script.call(DFinal.of(params)));
|
|
BetterWhitelist.LOG.info("Sending result: " + resultString);
|
|
PacketByteBuf resultBuf = PacketByteBufs.create();
|
|
resultBuf.writeString(resultString);
|
|
return CompletableFuture.completedFuture(resultBuf);
|
|
});
|
|
}
|
|
|
|
private String toString(TextContent text) {
|
|
StringBuilder sb = new StringBuilder();
|
|
text.visit(asString -> {
|
|
sb.append(asString);
|
|
return Optional.empty();
|
|
});
|
|
return sb.toString();
|
|
}
|
|
}
|