package net.minecraft.server.commands; import com.google.common.net.InetAddresses; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; import java.util.List; import javax.annotation.Nullable; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.commands.arguments.MessageArgument; import net.minecraft.commands.arguments.selector.EntitySelector; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.players.IpBanList; import net.minecraft.server.players.IpBanListEntry; public class BanIpCommands { private static final SimpleCommandExceptionType ERROR_INVALID_IP = new SimpleCommandExceptionType(Component.translatable("commands.banip.invalid")); private static final SimpleCommandExceptionType ERROR_ALREADY_BANNED = new SimpleCommandExceptionType(Component.translatable("commands.banip.failed")); public static void register(CommandDispatcher p_136528_) { p_136528_.register( Commands.literal("ban-ip") .requires(p_136532_ -> p_136532_.hasPermission(3)) .then( Commands.argument("target", StringArgumentType.word()) .executes(p_136538_ -> banIpOrName(p_136538_.getSource(), StringArgumentType.getString(p_136538_, "target"), null)) .then( Commands.argument("reason", MessageArgument.message()) .executes( p_136530_ -> banIpOrName( p_136530_.getSource(), StringArgumentType.getString(p_136530_, "target"), MessageArgument.getMessage(p_136530_, "reason") ) ) ) ) ); } private static int banIpOrName(CommandSourceStack p_136534_, String p_136535_, @Nullable Component p_136536_) throws CommandSyntaxException { if (InetAddresses.isInetAddress(p_136535_)) { return banIp(p_136534_, p_136535_, p_136536_); } else { ServerPlayer serverplayer = p_136534_.getServer().getPlayerList().getPlayerByName(p_136535_); if (serverplayer != null) { return banIp(p_136534_, serverplayer.getIpAddress(), p_136536_); } else { throw ERROR_INVALID_IP.create(); } } } private static int banIp(CommandSourceStack p_136540_, String p_136541_, @Nullable Component p_136542_) throws CommandSyntaxException { IpBanList ipbanlist = p_136540_.getServer().getPlayerList().getIpBans(); if (ipbanlist.isBanned(p_136541_)) { throw ERROR_ALREADY_BANNED.create(); } else { List list = p_136540_.getServer().getPlayerList().getPlayersWithAddress(p_136541_); IpBanListEntry ipbanlistentry = new IpBanListEntry(p_136541_, null, p_136540_.getTextName(), null, p_136542_ == null ? null : p_136542_.getString()); ipbanlist.add(ipbanlistentry); p_136540_.sendSuccess(() -> Component.translatable("commands.banip.success", p_136541_, ipbanlistentry.getReason()), true); if (!list.isEmpty()) { p_136540_.sendSuccess(() -> Component.translatable("commands.banip.info", list.size(), EntitySelector.joinNames(list)), true); } for (ServerPlayer serverplayer : list) { serverplayer.connection.disconnect(Component.translatable("multiplayer.disconnect.ip_banned")); } return list.size(); } } }