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 {
id("jfmod") version "1.5-SNAPSHOT"
id("jfmod") version "1.6-SNAPSHOT"
}
allprojects { group = "io.gitlab.jfronny" }
base.archivesName = "better-whitelist"
val fabricVersion = "0.91.1+1.20.4"
val muscriptVersion = "1.5-SNAPSHOT"
val muscriptVersion = "1.7-SNAPSHOT"
jfMod {
minecraftVersion = "1.20.4"
minecraftVersion = "1.20.5"
yarn("build.1")
loaderVersion = "0.15.0"
libJfVersion = "3.14.1"
loaderVersion = "0.15.10"
libJfVersion = "3.15.5"
fabricApiVersion = "0.97.6+1.20.5"
modrinth {
projectId = "better-whitelist"
@ -20,12 +20,16 @@ jfMod {
}
dependencies {
modImplementation(fabricApi.module("fabric-networking-api-v1", fabricVersion))
modImplementation(fabricApi.module("fabric-command-api-v2", fabricVersion))
include(modImplementation("io.gitlab.jfronny:muscript:$muscriptVersion")!!)
modImplementation("io.gitlab.jfronny.libjf:libjf-base:${jfMod.libJfVersion.get()}")
modImplementation("net.fabricmc.fabric-api:fabric-networking-api-v1")
modImplementation("net.fabricmc.fabric-api:fabric-command-api-v2")
include(modImplementation("io.gitlab.jfronny:muscript-all:$muscriptVersion")!!)
modImplementation("io.gitlab.jfronny.libjf:libjf-base")
// Dev env
modLocalRuntime("io.gitlab.jfronny.libjf:libjf-devutil:${jfMod.libJfVersion.get()}")
modLocalRuntime("com.terraformersmc:modmenu:9.0.0-pre.1")
modLocalRuntime("io.gitlab.jfronny.libjf:libjf-devutil")
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;
import io.gitlab.jfronny.betterwhitelist.BetterWhitelist;
import io.gitlab.jfronny.muscript.compiler.MuScriptVersion;
import io.gitlab.jfronny.muscript.compiler.Parser;
import io.gitlab.jfronny.muscript.data.Scope;
import io.gitlab.jfronny.betterwhitelist.DSerializer;
import io.gitlab.jfronny.betterwhitelist.packet.ChallengePacket;
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.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.fabric.api.client.networking.v1.ClientLoginNetworking;
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
@ -17,38 +21,41 @@ import net.minecraft.text.TextContent;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import static io.gitlab.jfronny.muscript.ast.context.ExprUtils.asDynamic;
@Environment(EnvType.CLIENT)
public class BetterWhitelistClient implements ClientModInitializer {
@Override
public void onInitializeClient() {
BetterWhitelist.initialize();
ClientLoginNetworking.registerGlobalReceiver(BetterWhitelist.HANDSHAKE_CHANNEL, (client, handler, buf, listenerAdder) -> {
// buf also contains the server version
PacketByteBuf resultBuf = PacketByteBufs.create();
resultBuf.writeInt(BetterWhitelist.PROTOCOL_VERSION);
HandshakePacket.CODEC.encode(resultBuf, new HandshakePacket(BetterWhitelist.PROTOCOL_VERSION));
return CompletableFuture.completedFuture(resultBuf);
});
ClientLoginNetworking.registerGlobalReceiver(BetterWhitelist.CHALLENGE_CHANNEL, (client, handler, buf, listenerAdder) -> {
ChallengePacket packet = ChallengePacket.CODEC.decode(buf);
Scope fork = BetterWhitelist.SCOPE.fork();
fork.set("resourcePacks", MinecraftClient.getInstance()
.getResourcePackManager()
.getEnabledProfiles()
.stream()
.map(s -> DFinal.of(Map.of(
"name", DFinal.of(s.getName()),
"name", DFinal.of(s.getId()),
"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(MuScriptVersion.DEFAULT, scriptSource).asDynamicExpr().get(fork).asCallable();
int paramSize = buf.readInt();
BetterWhitelist.LOG.info("Received challenge: " + packet.challenge());
DCallable script = Runtime.evaluate(asDynamic(Parser.parse(MuScriptVersion.DEFAULT, packet.challenge())), fork).asCallable();
List<Dynamic> params = new LinkedList<>();
for (int i = 0; i < paramSize; i++) {
params.add(Parser.parse(MuScriptVersion.DEFAULT, buf.readString()).asDynamicExpr().get(fork));
for (String param : packet.params()) {
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);
PacketByteBuf resultBuf = PacketByteBufs.create();
resultBuf.writeString(resultString);

View File

@ -1,11 +1,15 @@
package io.gitlab.jfronny.betterwhitelist;
import io.gitlab.jfronny.commons.logging.Logger;
import io.gitlab.jfronny.muscript.compiler.MuScriptVersion;
import io.gitlab.jfronny.muscript.libs.StandardLib;
import io.gitlab.jfronny.muscript.data.Scope;
import io.gitlab.jfronny.betterwhitelist.packet.ChallengePacket;
import io.gitlab.jfronny.betterwhitelist.packet.ChallengeResponsePacket;
import io.gitlab.jfronny.betterwhitelist.packet.HandshakePacket;
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.additional.DFinal;
import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.ModContainer;
import net.fabricmc.loader.api.metadata.ModDependency;
@ -15,11 +19,11 @@ import net.minecraft.util.Identifier;
import java.util.Map;
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 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 CHALLENGE_CHANNEL = new Identifier(MOD_ID, "challenge");
public static final int PROTOCOL_VERSION = 1;
@ -41,12 +45,16 @@ public class BetterWhitelist {
.<Dynamic>map(BetterWhitelist::wrap)
.orElse(new DNull());
}).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);
return of(s);
});
}
public static void initialize() {
// Initialization for things like registering packet types would go here
}
private static DObject wrap(ModContainer mod) {
return of(Map.of(
"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.brigadier.context.CommandContext;
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.commons.StringFormatter;
import io.gitlab.jfronny.muscript.compiler.MuScriptVersion;
import io.gitlab.jfronny.muscript.compiler.Parser;
import io.gitlab.jfronny.muscript.data.Script;
import io.gitlab.jfronny.muscript.data.dynamic.Dynamic;
import io.gitlab.jfronny.muscript.error.LocationalException;
import io.gitlab.jfronny.muscript.ast.context.Script;
import io.gitlab.jfronny.muscript.core.LocationalException;
import io.gitlab.jfronny.muscript.core.MuScriptVersion;
import io.gitlab.jfronny.muscript.parser.Parser;
import net.fabricmc.api.DedicatedServerModInitializer;
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
import net.fabricmc.fabric.api.networking.v1.*;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket;
import net.minecraft.server.command.ServerCommandSource;
import net.minecraft.server.network.ServerLoginNetworkHandler;
import net.minecraft.text.Text;
@ -35,6 +38,8 @@ public class BetterWhitelistServer implements DedicatedServerModInitializer {
@Override
public void onInitializeServer() {
BetterWhitelist.initialize();
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> {
dispatcher.register(
literal(BetterWhitelist.MOD_ID)
@ -48,9 +53,9 @@ public class BetterWhitelistServer implements DedicatedServerModInitializer {
GameProfile gp = profile(handler);
Challenge challenge = new Challenge(gp, sender);
challenges.put(gp, challenge);
PacketByteBuf handshake = PacketByteBufs.create();
handshake.writeInt(BetterWhitelist.PROTOCOL_VERSION);
challenge.sender.sendPacket(BetterWhitelist.HANDSHAKE_CHANNEL, handshake);
PacketByteBuf buf = PacketByteBufs.create();
HandshakePacket.CODEC.encode(buf, new HandshakePacket(BetterWhitelist.PROTOCOL_VERSION));
challenge.sender.sendPacket(BetterWhitelist.HANDSHAKE_CHANNEL, buf);
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"));
return;
}
LoginPacketSender rns = (LoginPacketSender) responseSender;
HandshakePacket packet = HandshakePacket.CODEC.decode(buf);
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));
return;
}
Challenge challenge = challenges.get(profile(handler));
challenge.sender = responseSender;
challenge.sender = rns;
Util.getMainWorkerExecutor().execute(new FutureTask<>(() -> {
try {
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"));
return;
}
LoginPacketSender rns = (LoginPacketSender) responseSender;
ChallengeResponsePacket packet = ChallengeResponsePacket.CODEC.decode(buf);
try {
Challenge ch = challenges.get(profile(handler));
ch.sender = responseSender;
String response = buf.readString();
BetterWhitelist.LOG.info("Got response from " + ch.profile.getName() + ": " + response);
ch.response.complete(Dynamic.deserialize(response));
ch.sender = rns;
BetterWhitelist.LOG.info("Got response from " + ch.profile.getName() + ": " + packet.message());
ch.response.complete(DSerializer.deserialize(packet.message()));
} catch (Throwable t) {
BetterWhitelist.LOG.error("Failed login", t);
handler.disconnect(Text.literal("Invalid dynamic"));

View File

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

View File

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