chore: update to 1.20.5
ci/woodpecker/push/jfmod Pipeline was successful Details
ci/woodpecker/tag/jfmod Pipeline was successful Details

This commit is contained in:
Johannes Frohnmeyer 2024-04-25 23:17:20 +02:00
parent 27301f6207
commit c38c8ecaba
Signed by: Johannes
GPG Key ID: E76429612C2929F4
10 changed files with 171 additions and 60 deletions

View File

@ -1,17 +1,17 @@
plugins { plugins {
id("jfmod") version "1.5-SNAPSHOT" id("jfmod") version "1.6-SNAPSHOT"
} }
allprojects { group = "io.gitlab.jfronny" } allprojects { group = "io.gitlab.jfronny" }
base.archivesName = "better-whitelist" base.archivesName = "better-whitelist"
val fabricVersion = "0.91.1+1.20.4" val muscriptVersion = "1.7-SNAPSHOT"
val muscriptVersion = "1.5-SNAPSHOT"
jfMod { jfMod {
minecraftVersion = "1.20.4" minecraftVersion = "1.20.5"
yarn("build.1") yarn("build.1")
loaderVersion = "0.15.0" loaderVersion = "0.15.10"
libJfVersion = "3.14.1" libJfVersion = "3.15.5"
fabricApiVersion = "0.97.6+1.20.5"
modrinth { modrinth {
projectId = "better-whitelist" projectId = "better-whitelist"
@ -20,12 +20,16 @@ jfMod {
} }
dependencies { dependencies {
modImplementation(fabricApi.module("fabric-networking-api-v1", fabricVersion)) modImplementation("net.fabricmc.fabric-api:fabric-networking-api-v1")
modImplementation(fabricApi.module("fabric-command-api-v2", fabricVersion)) modImplementation("net.fabricmc.fabric-api:fabric-command-api-v2")
include(modImplementation("io.gitlab.jfronny:muscript:$muscriptVersion")!!) include(modImplementation("io.gitlab.jfronny:muscript-all:$muscriptVersion")!!)
modImplementation("io.gitlab.jfronny.libjf:libjf-base:${jfMod.libJfVersion.get()}") modImplementation("io.gitlab.jfronny.libjf:libjf-base")
// Dev env // Dev env
modLocalRuntime("io.gitlab.jfronny.libjf:libjf-devutil:${jfMod.libJfVersion.get()}") modLocalRuntime("io.gitlab.jfronny.libjf:libjf-devutil")
modLocalRuntime("com.terraformersmc:modmenu:9.0.0-pre.1") modLocalRuntime("com.terraformersmc:modmenu:10.0.0-beta.1")
// for modmenu
modLocalRuntime("net.fabricmc.fabric-api:fabric-resource-loader-v0")
modLocalRuntime("net.fabricmc.fabric-api:fabric-screen-api-v1")
modLocalRuntime("net.fabricmc.fabric-api:fabric-key-binding-api-v1")
} }

View File

@ -1,12 +1,16 @@
package io.gitlab.jfronny.betterwhitelist.client; package io.gitlab.jfronny.betterwhitelist.client;
import io.gitlab.jfronny.betterwhitelist.BetterWhitelist; import io.gitlab.jfronny.betterwhitelist.BetterWhitelist;
import io.gitlab.jfronny.muscript.compiler.MuScriptVersion; import io.gitlab.jfronny.betterwhitelist.DSerializer;
import io.gitlab.jfronny.muscript.compiler.Parser; import io.gitlab.jfronny.betterwhitelist.packet.ChallengePacket;
import io.gitlab.jfronny.muscript.data.Scope; import io.gitlab.jfronny.betterwhitelist.packet.HandshakePacket;
import io.gitlab.jfronny.muscript.core.MuScriptVersion;
import io.gitlab.jfronny.muscript.data.additional.DFinal;
import io.gitlab.jfronny.muscript.data.additional.context.Scope;
import io.gitlab.jfronny.muscript.data.dynamic.DCallable; import io.gitlab.jfronny.muscript.data.dynamic.DCallable;
import io.gitlab.jfronny.muscript.data.dynamic.Dynamic; import io.gitlab.jfronny.muscript.data.dynamic.Dynamic;
import io.gitlab.jfronny.muscript.data.dynamic.additional.DFinal; import io.gitlab.jfronny.muscript.parser.Parser;
import io.gitlab.jfronny.muscript.runtime.Runtime;
import net.fabricmc.api.*; import net.fabricmc.api.*;
import net.fabricmc.fabric.api.client.networking.v1.ClientLoginNetworking; import net.fabricmc.fabric.api.client.networking.v1.ClientLoginNetworking;
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
@ -17,38 +21,41 @@ import net.minecraft.text.TextContent;
import java.util.*; import java.util.*;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import static io.gitlab.jfronny.muscript.ast.context.ExprUtils.asDynamic;
@Environment(EnvType.CLIENT) @Environment(EnvType.CLIENT)
public class BetterWhitelistClient implements ClientModInitializer { public class BetterWhitelistClient implements ClientModInitializer {
@Override @Override
public void onInitializeClient() { public void onInitializeClient() {
BetterWhitelist.initialize();
ClientLoginNetworking.registerGlobalReceiver(BetterWhitelist.HANDSHAKE_CHANNEL, (client, handler, buf, listenerAdder) -> { ClientLoginNetworking.registerGlobalReceiver(BetterWhitelist.HANDSHAKE_CHANNEL, (client, handler, buf, listenerAdder) -> {
// buf also contains the server version // buf also contains the server version
PacketByteBuf resultBuf = PacketByteBufs.create(); PacketByteBuf resultBuf = PacketByteBufs.create();
resultBuf.writeInt(BetterWhitelist.PROTOCOL_VERSION); HandshakePacket.CODEC.encode(resultBuf, new HandshakePacket(BetterWhitelist.PROTOCOL_VERSION));
return CompletableFuture.completedFuture(resultBuf); return CompletableFuture.completedFuture(resultBuf);
}); });
ClientLoginNetworking.registerGlobalReceiver(BetterWhitelist.CHALLENGE_CHANNEL, (client, handler, buf, listenerAdder) -> { ClientLoginNetworking.registerGlobalReceiver(BetterWhitelist.CHALLENGE_CHANNEL, (client, handler, buf, listenerAdder) -> {
ChallengePacket packet = ChallengePacket.CODEC.decode(buf);
Scope fork = BetterWhitelist.SCOPE.fork(); Scope fork = BetterWhitelist.SCOPE.fork();
fork.set("resourcePacks", MinecraftClient.getInstance() fork.set("resourcePacks", MinecraftClient.getInstance()
.getResourcePackManager() .getResourcePackManager()
.getEnabledProfiles() .getEnabledProfiles()
.stream() .stream()
.map(s -> DFinal.of(Map.of( .map(s -> DFinal.of(Map.of(
"name", DFinal.of(s.getName()), "name", DFinal.of(s.getId()),
"displayName", DFinal.of(toString(s.getDisplayName().getContent())), "displayName", DFinal.of(toString(s.getDisplayName().getContent())),
"description", DFinal.of(toString(s.getDescription().getContent())) "description", DFinal.of(toString(s.getDescription().getContent()))
))) )))
.toList()); .toList());
String scriptSource = buf.readString(); BetterWhitelist.LOG.info("Received challenge: " + packet.challenge());
BetterWhitelist.LOG.info("Received challenge: " + scriptSource); DCallable script = Runtime.evaluate(asDynamic(Parser.parse(MuScriptVersion.DEFAULT, packet.challenge())), fork).asCallable();
DCallable script = Parser.parse(MuScriptVersion.DEFAULT, scriptSource).asDynamicExpr().get(fork).asCallable();
int paramSize = buf.readInt();
List<Dynamic> params = new LinkedList<>(); List<Dynamic> params = new LinkedList<>();
for (int i = 0; i < paramSize; i++) { for (String param : packet.params()) {
params.add(Parser.parse(MuScriptVersion.DEFAULT, buf.readString()).asDynamicExpr().get(fork)); params.add(Runtime.evaluate(asDynamic(Parser.parse(MuScriptVersion.DEFAULT, param)), fork));
} }
String resultString = Dynamic.serialize(script.call(DFinal.of(params))); String resultString = DSerializer.serialize(script.call(DFinal.of(params)));
BetterWhitelist.LOG.info("Sending result: " + resultString); BetterWhitelist.LOG.info("Sending result: " + resultString);
PacketByteBuf resultBuf = PacketByteBufs.create(); PacketByteBuf resultBuf = PacketByteBufs.create();
resultBuf.writeString(resultString); resultBuf.writeString(resultString);

View File

@ -1,11 +1,15 @@
package io.gitlab.jfronny.betterwhitelist; package io.gitlab.jfronny.betterwhitelist;
import io.gitlab.jfronny.commons.logging.Logger; import io.gitlab.jfronny.betterwhitelist.packet.ChallengePacket;
import io.gitlab.jfronny.muscript.compiler.MuScriptVersion; import io.gitlab.jfronny.betterwhitelist.packet.ChallengeResponsePacket;
import io.gitlab.jfronny.muscript.libs.StandardLib; import io.gitlab.jfronny.betterwhitelist.packet.HandshakePacket;
import io.gitlab.jfronny.muscript.data.Scope; import io.gitlab.jfronny.commons.logger.SystemLoggerPlus;
import io.gitlab.jfronny.muscript.core.MuScriptVersion;
import io.gitlab.jfronny.muscript.data.additional.DFinal;
import io.gitlab.jfronny.muscript.data.additional.context.Scope;
import io.gitlab.jfronny.muscript.data.additional.libs.StandardLib;
import io.gitlab.jfronny.muscript.data.dynamic.*; import io.gitlab.jfronny.muscript.data.dynamic.*;
import io.gitlab.jfronny.muscript.data.dynamic.additional.DFinal; import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry;
import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.ModContainer; import net.fabricmc.loader.api.ModContainer;
import net.fabricmc.loader.api.metadata.ModDependency; import net.fabricmc.loader.api.metadata.ModDependency;
@ -15,11 +19,11 @@ import net.minecraft.util.Identifier;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static io.gitlab.jfronny.muscript.data.dynamic.additional.DFinal.of; import static io.gitlab.jfronny.muscript.data.additional.DFinal.of;
public class BetterWhitelist { public class BetterWhitelist {
public static final String MOD_ID = "better-whitelist"; public static final String MOD_ID = "better-whitelist";
public static final Logger LOG = Logger.forName(MOD_ID); public static final SystemLoggerPlus LOG = SystemLoggerPlus.forName(MOD_ID);
public static final Identifier HANDSHAKE_CHANNEL = new Identifier(MOD_ID, "handshake"); public static final Identifier HANDSHAKE_CHANNEL = new Identifier(MOD_ID, "handshake");
public static final Identifier CHALLENGE_CHANNEL = new Identifier(MOD_ID, "challenge"); public static final Identifier CHALLENGE_CHANNEL = new Identifier(MOD_ID, "challenge");
public static final int PROTOCOL_VERSION = 1; public static final int PROTOCOL_VERSION = 1;
@ -41,12 +45,16 @@ public class BetterWhitelist {
.<Dynamic>map(BetterWhitelist::wrap) .<Dynamic>map(BetterWhitelist::wrap)
.orElse(new DNull()); .orElse(new DNull());
}).set("println", args -> { }).set("println", args -> {
String s = args.size() == 0 ? "" : args.size() == 1 ? args.get(0).asString().getValue() : args.toString(); String s = args.isEmpty() ? "" : args.size() == 1 ? args.get(0).asString().getValue() : args.toString();
System.out.println(s); System.out.println(s);
return of(s); return of(s);
}); });
} }
public static void initialize() {
// Initialization for things like registering packet types would go here
}
private static DObject wrap(ModContainer mod) { private static DObject wrap(ModContainer mod) {
return of(Map.of( return of(Map.of(
"id", of(mod.getMetadata().getId()), "id", of(mod.getMetadata().getId()),

View File

@ -0,0 +1,25 @@
package io.gitlab.jfronny.betterwhitelist;
import io.gitlab.jfronny.muscript.ast.DynamicExpr;
import io.gitlab.jfronny.muscript.ast.context.ExprUtils;
import io.gitlab.jfronny.muscript.core.MuScriptVersion;
import io.gitlab.jfronny.muscript.data.additional.DataExprMapper;
import io.gitlab.jfronny.muscript.data.additional.libs.StandardLib;
import io.gitlab.jfronny.muscript.data.dynamic.Dynamic;
import io.gitlab.jfronny.muscript.parser.Parser;
import io.gitlab.jfronny.muscript.runtime.Runtime;
import io.gitlab.jfronny.muscript.serialize.Decompiler;
import static io.gitlab.jfronny.muscript.ast.context.ExprUtils.asDynamic;
public class DSerializer {
public static String serialize(Dynamic d) {
return Decompiler.decompile(DataExprMapper.map(d));
}
public static Dynamic deserialize(String s) {
DynamicExpr dynamicExpr = asDynamic(Parser.parse(MuScriptVersion.DEFAULT, s));
if (!ExprUtils.isDirect(dynamicExpr)) throw new RuntimeException("Invalid dynamic");
return Runtime.evaluate(dynamicExpr, StandardLib.createScope(MuScriptVersion.DEFAULT));
}
}

View File

@ -0,0 +1,23 @@
package io.gitlab.jfronny.betterwhitelist.packet;
import io.gitlab.jfronny.betterwhitelist.BetterWhitelist;
import io.netty.buffer.ByteBuf;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.network.codec.PacketCodec;
import net.minecraft.network.codec.PacketCodecs;
import net.minecraft.network.packet.CustomPayload;
import java.util.List;
public record ChallengePacket(String challenge, List<String> params) implements CustomPayload {
public static final Id<ChallengePacket> ID = new CustomPayload.Id<>(BetterWhitelist.CHALLENGE_CHANNEL);
public static final PacketCodec<PacketByteBuf, ChallengePacket> CODEC = PacketCodec.tuple(
PacketCodecs.STRING, ChallengePacket::challenge,
PacketCodecs.<ByteBuf, String>toList().apply(PacketCodecs.STRING), ChallengePacket::params,
ChallengePacket::new);
@Override
public Id<? extends CustomPayload> getId() {
return ID;
}
}

View File

@ -0,0 +1,17 @@
package io.gitlab.jfronny.betterwhitelist.packet;
import io.gitlab.jfronny.betterwhitelist.BetterWhitelist;
import io.netty.buffer.ByteBuf;
import net.minecraft.network.codec.PacketCodec;
import net.minecraft.network.codec.PacketCodecs;
import net.minecraft.network.packet.CustomPayload;
public record ChallengeResponsePacket(String message) implements CustomPayload {
public static final CustomPayload.Id<ChallengeResponsePacket> ID = new CustomPayload.Id<>(BetterWhitelist.CHALLENGE_CHANNEL);
public static final PacketCodec<ByteBuf, ChallengeResponsePacket> CODEC = PacketCodecs.STRING.xmap(ChallengeResponsePacket::new, ChallengeResponsePacket::message);
@Override
public Id<? extends CustomPayload> getId() {
return ID;
}
}

View File

@ -0,0 +1,17 @@
package io.gitlab.jfronny.betterwhitelist.packet;
import io.gitlab.jfronny.betterwhitelist.BetterWhitelist;
import io.netty.buffer.ByteBuf;
import net.minecraft.network.codec.PacketCodec;
import net.minecraft.network.codec.PacketCodecs;
import net.minecraft.network.packet.CustomPayload;
public record HandshakePacket(int version) implements CustomPayload {
public static final CustomPayload.Id<HandshakePacket> ID = new CustomPayload.Id<>(BetterWhitelist.HANDSHAKE_CHANNEL);
public static final PacketCodec<ByteBuf, HandshakePacket> CODEC = PacketCodecs.INTEGER.xmap(HandshakePacket::new, HandshakePacket::version);
@Override
public Id<? extends CustomPayload> getId() {
return ID;
}
}

View File

@ -3,18 +3,21 @@ package io.gitlab.jfronny.betterwhitelist.server;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.context.CommandContext;
import io.gitlab.jfronny.betterwhitelist.BetterWhitelist; import io.gitlab.jfronny.betterwhitelist.BetterWhitelist;
import io.gitlab.jfronny.betterwhitelist.DSerializer;
import io.gitlab.jfronny.betterwhitelist.packet.ChallengeResponsePacket;
import io.gitlab.jfronny.betterwhitelist.packet.HandshakePacket;
import io.gitlab.jfronny.betterwhitelist.server.mixin.ServerLoginNetworkHandlerAccessor; import io.gitlab.jfronny.betterwhitelist.server.mixin.ServerLoginNetworkHandlerAccessor;
import io.gitlab.jfronny.commons.StringFormatter; import io.gitlab.jfronny.commons.StringFormatter;
import io.gitlab.jfronny.muscript.compiler.MuScriptVersion; import io.gitlab.jfronny.muscript.ast.context.Script;
import io.gitlab.jfronny.muscript.compiler.Parser; import io.gitlab.jfronny.muscript.core.LocationalException;
import io.gitlab.jfronny.muscript.data.Script; import io.gitlab.jfronny.muscript.core.MuScriptVersion;
import io.gitlab.jfronny.muscript.data.dynamic.Dynamic; import io.gitlab.jfronny.muscript.parser.Parser;
import io.gitlab.jfronny.muscript.error.LocationalException;
import net.fabricmc.api.DedicatedServerModInitializer; import net.fabricmc.api.DedicatedServerModInitializer;
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
import net.fabricmc.fabric.api.networking.v1.*; import net.fabricmc.fabric.api.networking.v1.*;
import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.network.PacketByteBuf; import net.minecraft.network.PacketByteBuf;
import net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket;
import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.command.ServerCommandSource;
import net.minecraft.server.network.ServerLoginNetworkHandler; import net.minecraft.server.network.ServerLoginNetworkHandler;
import net.minecraft.text.Text; import net.minecraft.text.Text;
@ -35,6 +38,8 @@ public class BetterWhitelistServer implements DedicatedServerModInitializer {
@Override @Override
public void onInitializeServer() { public void onInitializeServer() {
BetterWhitelist.initialize();
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> {
dispatcher.register( dispatcher.register(
literal(BetterWhitelist.MOD_ID) literal(BetterWhitelist.MOD_ID)
@ -48,9 +53,9 @@ public class BetterWhitelistServer implements DedicatedServerModInitializer {
GameProfile gp = profile(handler); GameProfile gp = profile(handler);
Challenge challenge = new Challenge(gp, sender); Challenge challenge = new Challenge(gp, sender);
challenges.put(gp, challenge); challenges.put(gp, challenge);
PacketByteBuf handshake = PacketByteBufs.create(); PacketByteBuf buf = PacketByteBufs.create();
handshake.writeInt(BetterWhitelist.PROTOCOL_VERSION); HandshakePacket.CODEC.encode(buf, new HandshakePacket(BetterWhitelist.PROTOCOL_VERSION));
challenge.sender.sendPacket(BetterWhitelist.HANDSHAKE_CHANNEL, handshake); challenge.sender.sendPacket(BetterWhitelist.HANDSHAKE_CHANNEL, buf);
synchronizer.waitFor(challenge.challengeCompleted); synchronizer.waitFor(challenge.challengeCompleted);
}); });
@ -59,13 +64,15 @@ public class BetterWhitelistServer implements DedicatedServerModInitializer {
handler.disconnect(Text.literal("This server requires better-whitelist to be installed")); handler.disconnect(Text.literal("This server requires better-whitelist to be installed"));
return; return;
} }
LoginPacketSender rns = (LoginPacketSender) responseSender;
HandshakePacket packet = HandshakePacket.CODEC.decode(buf);
try { try {
if (buf.readInt() != BetterWhitelist.PROTOCOL_VERSION) { if (packet.version() != BetterWhitelist.PROTOCOL_VERSION) {
handler.disconnect(Text.literal("This server requires a version of better-whitelist supporting the protocol version " + BetterWhitelist.PROTOCOL_VERSION)); handler.disconnect(Text.literal("This server requires a version of better-whitelist supporting the protocol version " + BetterWhitelist.PROTOCOL_VERSION));
return; return;
} }
Challenge challenge = challenges.get(profile(handler)); Challenge challenge = challenges.get(profile(handler));
challenge.sender = responseSender; challenge.sender = rns;
Util.getMainWorkerExecutor().execute(new FutureTask<>(() -> { Util.getMainWorkerExecutor().execute(new FutureTask<>(() -> {
try { try {
ServerScope.run(script, challenge); ServerScope.run(script, challenge);
@ -98,12 +105,13 @@ public class BetterWhitelistServer implements DedicatedServerModInitializer {
handler.disconnect(Text.literal("This server requires better-whitelist to be installed")); handler.disconnect(Text.literal("This server requires better-whitelist to be installed"));
return; return;
} }
LoginPacketSender rns = (LoginPacketSender) responseSender;
ChallengeResponsePacket packet = ChallengeResponsePacket.CODEC.decode(buf);
try { try {
Challenge ch = challenges.get(profile(handler)); Challenge ch = challenges.get(profile(handler));
ch.sender = responseSender; ch.sender = rns;
String response = buf.readString(); BetterWhitelist.LOG.info("Got response from " + ch.profile.getName() + ": " + packet.message());
BetterWhitelist.LOG.info("Got response from " + ch.profile.getName() + ": " + response); ch.response.complete(DSerializer.deserialize(packet.message()));
ch.response.complete(Dynamic.deserialize(response));
} catch (Throwable t) { } catch (Throwable t) {
BetterWhitelist.LOG.error("Failed login", t); BetterWhitelist.LOG.error("Failed login", t);
handler.disconnect(Text.literal("Invalid dynamic")); handler.disconnect(Text.literal("Invalid dynamic"));

View File

@ -2,15 +2,16 @@ package io.gitlab.jfronny.betterwhitelist.server;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import io.gitlab.jfronny.muscript.data.dynamic.Dynamic; import io.gitlab.jfronny.muscript.data.dynamic.Dynamic;
import net.fabricmc.fabric.api.networking.v1.LoginPacketSender;
import net.fabricmc.fabric.api.networking.v1.PacketSender; import net.fabricmc.fabric.api.networking.v1.PacketSender;
class Challenge { class Challenge {
public final ManualFuture<?> challengeCompleted = new ManualFuture<>(); public final ManualFuture<?> challengeCompleted = new ManualFuture<>();
public final ManualFuture<Dynamic> response = new ManualFuture<>(); public final ManualFuture<Dynamic> response = new ManualFuture<>();
public final GameProfile profile; public final GameProfile profile;
public PacketSender sender; public LoginPacketSender sender;
public Challenge(GameProfile profile, PacketSender sender) { public Challenge(GameProfile profile, LoginPacketSender sender) {
this.profile = profile; this.profile = profile;
this.sender = sender; this.sender = sender;
} }

View File

@ -1,12 +1,15 @@
package io.gitlab.jfronny.betterwhitelist.server; package io.gitlab.jfronny.betterwhitelist.server;
import io.gitlab.jfronny.betterwhitelist.BetterWhitelist; import io.gitlab.jfronny.betterwhitelist.BetterWhitelist;
import io.gitlab.jfronny.muscript.data.Scope; import io.gitlab.jfronny.betterwhitelist.DSerializer;
import io.gitlab.jfronny.muscript.data.Script; import io.gitlab.jfronny.betterwhitelist.packet.ChallengePacket;
import io.gitlab.jfronny.muscript.ast.context.Script;
import io.gitlab.jfronny.muscript.core.LocationalException;
import io.gitlab.jfronny.muscript.data.additional.DFinal;
import io.gitlab.jfronny.muscript.data.additional.context.Scope;
import io.gitlab.jfronny.muscript.data.dynamic.DNull; import io.gitlab.jfronny.muscript.data.dynamic.DNull;
import io.gitlab.jfronny.muscript.data.dynamic.Dynamic; import io.gitlab.jfronny.muscript.data.dynamic.Dynamic;
import io.gitlab.jfronny.muscript.data.dynamic.additional.DFinal; import io.gitlab.jfronny.muscript.runtime.Runtime;
import io.gitlab.jfronny.muscript.error.LocationalException;
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
import net.minecraft.network.PacketByteBuf; import net.minecraft.network.PacketByteBuf;
@ -18,7 +21,7 @@ import java.util.concurrent.TimeoutException;
public class ServerScope { public class ServerScope {
public static Dynamic run(Script script, Challenge challenge) { public static Dynamic run(Script script, Challenge challenge) {
try { try {
return script.run(fork(challenge)); return Runtime.run(script, fork(challenge));
} catch (LocationalException le) { } catch (LocationalException le) {
for (Throwable t = le; t != null; t = t.getCause()) { for (Throwable t = le; t != null; t = t.getCause()) {
if (t instanceof ServerScope.AssertFail af) throw af; if (t instanceof ServerScope.AssertFail af) throw af;
@ -34,14 +37,12 @@ public class ServerScope {
return new DNull(); return new DNull();
}).set("challenge", args -> { }).set("challenge", args -> {
if (args.isEmpty()) throw new IllegalArgumentException("Invalid number of arguments for challenge: expected 1 or more but got 0"); if (args.isEmpty()) throw new IllegalArgumentException("Invalid number of arguments for challenge: expected 1 or more but got 0");
PacketByteBuf buf = PacketByteBufs.create(); String challengeString = DSerializer.serialize(args.get(0).asCallable());
String challengeString = Dynamic.serialize(args.get(0).asCallable());
BetterWhitelist.LOG.info("Sending challenge to " + challenge.profile.getName() + ": " + challengeString); BetterWhitelist.LOG.info("Sending challenge to " + challenge.profile.getName() + ": " + challengeString);
buf.writeString(challengeString); List<String> params = args.getValue().subList(1, args.size()).stream().map(DSerializer::serialize).toList();
List<? extends Dynamic> params = args.getValue().subList(1, args.size());
buf.writeInt(params.size());
params.forEach(p -> buf.writeString(Dynamic.serialize(p)));
challenge.response.reset(); challenge.response.reset();
PacketByteBuf buf = PacketByteBufs.create();
ChallengePacket.CODEC.encode(buf, new ChallengePacket(challengeString, params));
challenge.sender.sendPacket(BetterWhitelist.CHALLENGE_CHANNEL, buf); challenge.sender.sendPacket(BetterWhitelist.CHALLENGE_CHANNEL, buf);
try { try {
return challenge.response.get(1, TimeUnit.SECONDS); return challenge.response.get(1, TimeUnit.SECONDS);