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.LOGIN_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> 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(); } }