This commit is contained in:
itqop 2025-10-18 22:55:47 +03:00
parent 215031ffff
commit 1ebf86f575
2 changed files with 71 additions and 40 deletions

View File

@ -46,4 +46,13 @@ public final class Config {
enableLogging = ENABLE_LOGGING.get();
enableWhitelist = ENABLE_WHITELIST.get();
}
public static void save() {
ENABLE_WHITELIST.set(enableWhitelist);
ENABLE_LOGGING.set(enableLogging);
API_BASE_URL.set(apiBaseUrl);
API_KEY.set(apiKey);
REQUEST_TIMEOUT.set(requestTimeout);
SPEC.save();
}
}

View File

@ -8,13 +8,10 @@ import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands;
import net.minecraft.commands.SharedSuggestionProvider;
import net.minecraft.network.chat.Component;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerPlayer;
import java.nio.charset.StandardCharsets;
import java.time.Instant;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
@ -55,25 +52,36 @@ public class WhitelistCommands {
private static int enableWhitelist(CommandContext<CommandSourceStack> ctx) {
boolean changed = setEnableWhitelistPersisted(ctx, true);
if (!changed) {
ctx.getSource().sendFailure(Component.literal("Whitelist already enabled"));
dispatchBack(ctx, () ->
ctx.getSource().sendFailure(Component.literal("Whitelist already enabled"))
);
return 0;
}
ctx.getSource().sendSuccess(() -> Component.literal("Whitelist enabled"), true);
dispatchBack(ctx, () ->
ctx.getSource().sendSuccess(() -> Component.literal("Whitelist enabled"), true)
);
return 1;
}
private static int disableWhitelist(CommandContext<CommandSourceStack> ctx) {
boolean changed = setEnableWhitelistPersisted(ctx, false);
if (!changed) {
ctx.getSource().sendFailure(Component.literal("Whitelist already disabled"));
dispatchBack(ctx, () ->
ctx.getSource().sendFailure(Component.literal("Whitelist already disabled"))
);
return 0;
}
ctx.getSource().sendSuccess(() -> Component.literal("Whitelist disabled"), true);
dispatchBack(ctx, () ->
ctx.getSource().sendSuccess(() -> Component.literal("Whitelist disabled"), true)
);
return 1;
}
private static int whitelistStatus(CommandContext<CommandSourceStack> ctx) {
ctx.getSource().sendSuccess(() -> Component.literal("Whitelist is " + (Config.enableWhitelist ? "ON" : "OFF")), false);
dispatchBack(ctx, () ->
ctx.getSource().sendSuccess(() ->
Component.literal("Whitelist is " + (Config.enableWhitelist ? "ON" : "OFF")), false)
);
return 1;
}
@ -88,7 +96,10 @@ public class WhitelistCommands {
String addedBy = getSourceName(ctx);
String addedAt = Instant.now().toString();
sendOnServer(ctx, Component.literal("Adding player to whitelist: " + player), false);
dispatchBack(ctx, () ->
ctx.getSource().sendSuccess(() ->
Component.literal("Adding player to whitelist: " + player), false)
);
CompletableFuture<WhitelistApiClient.WhitelistEntry> fut =
API.addPlayer(player, addedBy, Instant.parse(addedAt), null, true, reason);
@ -96,9 +107,11 @@ public class WhitelistCommands {
fut.thenAccept(entry ->
dispatchBack(ctx, () -> {
if (entry != null) {
ctx.getSource().sendSuccess(() -> Component.literal("Player " + player + " added"), false);
ctx.getSource().sendSuccess(() ->
Component.literal("Player " + player + " added"), false);
} else {
ctx.getSource().sendFailure(Component.literal("Failed to add " + player));
ctx.getSource().sendFailure(
Component.literal("Failed to add " + player));
}
})
);
@ -107,17 +120,27 @@ public class WhitelistCommands {
private static int removePlayer(CommandContext<CommandSourceStack> ctx) {
String player = StringArgumentType.getString(ctx, "player");
sendOnServer(ctx, Component.literal("Removing player from whitelist: " + player), false);
dispatchBack(ctx, () ->
ctx.getSource().sendSuccess(() ->
Component.literal("Removing player from whitelist: " + player), false)
);
API.removePlayer(player).thenAccept(success ->
dispatchBack(ctx, () -> {
if (success) {
ctx.getSource().sendSuccess(() -> Component.literal("Player " + player + " removed"), false);
ServerPlayer sp = ctx.getSource().getServer().getPlayerList().getPlayerByName(player);
ctx.getSource().sendSuccess(() ->
Component.literal("Player " + player + " removed"), false);
ServerPlayer sp = ctx.getSource().getServer()
.getPlayerList().getPlayerByName(player);
if (sp != null) {
sp.connection.disconnect(Component.literal("Removed from whitelist"));
sp.connection.disconnect(
Component.literal("Removed from whitelist"));
}
} else {
ctx.getSource().sendFailure(Component.literal("Failed to remove " + player));
ctx.getSource().sendFailure(
Component.literal("Failed to remove " + player));
}
})
);
@ -126,27 +149,23 @@ public class WhitelistCommands {
private static int checkPlayer(CommandContext<CommandSourceStack> ctx) {
String player = StringArgumentType.getString(ctx, "player");
API.checkPlayer(player).thenAccept(resp ->
dispatchBack(ctx, () -> {
if (resp != null && resp.isSuccess()) {
String msg = resp.isWhitelisted() ? "is in whitelist" : "is NOT in whitelist";
ctx.getSource().sendSuccess(() -> Component.literal(player + " " + msg), false);
String msg = resp.isWhitelisted() ?
"is in whitelist" : "is NOT in whitelist";
ctx.getSource().sendSuccess(() ->
Component.literal(player + " " + msg), false);
} else {
ctx.getSource().sendFailure(Component.literal("Check failed for " + player));
ctx.getSource().sendFailure(
Component.literal("Check failed for " + player));
}
})
);
return 1;
}
private static void sendOnServer(CommandContext<CommandSourceStack> ctx, Component msg, boolean broadcast) {
if (broadcast) {
ctx.getSource().getServer().getPlayerList().broadcastSystemMessage(msg, false);
} else {
ctx.getSource().sendSuccess(() -> msg, false);
}
}
private static void dispatchBack(CommandContext<CommandSourceStack> ctx, Runnable task) {
ctx.getSource().getServer().execute(task);
}
@ -161,18 +180,21 @@ public class WhitelistCommands {
private static boolean setEnableWhitelistPersisted(CommandContext<CommandSourceStack> ctx, boolean enabled) {
boolean changed = Config.enableWhitelist != enabled;
if (changed) {
Config.enableWhitelist = enabled;
WhitelistApiClient.refreshConfigFromSpec();
ctx.getSource().getServer().submit(() -> {}).join();
CompletableFuture.runAsync(() -> {
try {
Config.save();
} catch (Exception e) {
dispatchBack(ctx, () ->
ctx.getSource().sendFailure(
Component.literal("Failed to save config: " + e.getMessage()))
);
}
});
}
return changed;
}
private static String resolveUuid(MinecraftServer srv, String player) {
try {
ServerPlayer sp = srv.getPlayerList().getPlayerByName(player);
if (sp != null) return sp.getUUID().toString();
} catch (Exception ignored) {}
UUID offline = UUID.nameUUIDFromBytes(("OfflinePlayer:" + player).getBytes(StandardCharsets.UTF_8));
return offline.toString();
}
}