diff --git a/README.md b/README.md index 577aaa6..8715d71 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,39 @@ Better-Whitelist provides a basic whitelist system for your server that you can adapt to your use case. + The mod is required both on the server and any clients connecting to the server. + The whitelist is configured using [μScript](https://git.frohnmeyer-wds.de/Johannes/java-commons/src/branch/master/muscript), but you don't have to be good at programming to use this mod. + A config file with some additional details will be created when you first start your server with the mod. + A simple config for Better-Whitelist could look as follows (please note that you'd probably have to add exceptions for client-side mods with optional server-side components when using this): ``` -sharedMods = mods::values()::filter({ v -> v.environment != 'server' })::map({ v -> { id = v.id, version = v.version } }) +// convert a mod to a simpler representation to save bandwidth +simplify = { mod -> { id = mod.id, version = mod.version } } + +// all non-serverside mods present on the server +sharedMods = mods::values() + ::filter({ v -> v.environment != 'server' & v.id != 'java' }) + ::map(simplify) // ensure the client has the correct version of every non-serverside mod on the server -assert(challenge({ arg -> - arg::allMatch({ v -> mods::values()::anyMatch({ m -> v.id == m.id & v.version == m.version }) }) -}, sharedMods)) +clientMissing = challenge({ arg -> + arg::filter({ v -> !mods::values()::anyMatch({ m -> v.id == m.id & v.version == m.version }) }) +}, sharedMods) +assert(clientMissing::isEmpty(), 'You lack required mods: ' || clientMissing) // ensure the client has no additional mods that would be required on the server -assert(challenge({ arg -> - clientSideMods = mods::values()::filter({ v -> v.environment != 'client' }) - clientSideMods::allMatch({ v -> arg::anyMatch({ m -> v.id == m.id & v.version == m.version }) }) -}, sharedMods)) +clientAdditional = challenge({ arg, fn -> + clientSideMods = mods::values()::filter({ v -> v.environment != 'client' & v.id != 'java' }) + clientSideMods::filter({ v -> !arg::anyMatch({ m -> v.id == m.id & v.version == m.version }) })::map(fn) +}, sharedMods, simplify) +assert(clientAdditional::isEmpty(), 'You have unsupported mods: ' || clientAdditional) // filter resource packs for X-Ray packs bannedWords = listOf('xray', 'x-ray', 'cheat') assert(!challenge({ -> resourcePacks::map({ pack -> pack.name || ' ' || pack.displayName || ' ' || pack.description }) -})::anyMatch({ v -> bannedWords::anyMatch({ word -> v::contains(word) }) })) +})::anyMatch({ v -> bannedWords::anyMatch({ word -> v::toLower()::contains(word) }) }), "Please don't cheat, " || user.name) ``` The following things are available to your scripts: diff --git a/src/main/java/io/gitlab/jfronny/betterwhitelist/server/BetterWhitelistServer.java b/src/main/java/io/gitlab/jfronny/betterwhitelist/server/BetterWhitelistServer.java index 40271a2..0d84f46 100644 --- a/src/main/java/io/gitlab/jfronny/betterwhitelist/server/BetterWhitelistServer.java +++ b/src/main/java/io/gitlab/jfronny/betterwhitelist/server/BetterWhitelistServer.java @@ -82,7 +82,7 @@ public class BetterWhitelistServer implements DedicatedServerModInitializer { if (!challenge.responses.isEmpty()) return challenge.responses.remove(); else throw new AssertFail("Took too long to respond"); }).set("user", Map.of( - "id", DFinal.of(gp.getId().toString()), + "id", gp.getId() == null ? new DNull() : DFinal.of(gp.getId().toString()), "name", DFinal.of(gp.getName()) ));