IpBanlistService.java

net.minecraft.server.jsonrpc.methods.IpBanlistService

信息

  • 全限定名:net.minecraft.server.jsonrpc.methods.IpBanlistService
  • 类型:public class
  • 包:net.minecraft.server.jsonrpc.methods
  • 源码路径:src/main/java/net/minecraft/server/jsonrpc/methods/IpBanlistService.java
  • 起始行号:L23
  • 职责:

    TODO

字段/常量

  • BAN_SOURCE
    • 类型: String
    • 修饰符: private static final
    • 源码定位: L24
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.server.jsonrpc.methods.IpBanlistService.IncomingIpBanDto

    • 类型: record
    • 修饰符: public
    • 源码定位: L88
    • 说明:

      TODO

  • net.minecraft.server.jsonrpc.methods.IpBanlistService.IpBan

    • 类型: record
    • 修饰符: private
    • 源码定位: L111
    • 说明:

      TODO

  • net.minecraft.server.jsonrpc.methods.IpBanlistService.IpBanDto

    • 类型: record
    • 修饰符: public
    • 源码定位: L123
    • 说明:

      TODO

构造器

方法

下面的方法块按源码顺序生成。

public static List<IpBanlistService.IpBanDto> get(MinecraftApi minecraftApi) @ L26

  • 方法名:get
  • 源码定位:L26
  • 返回类型:List<IpBanlistService.IpBanDto>
  • 修饰符:public static

参数:

  • minecraftApi: MinecraftApi

说明:

TODO

public static List<IpBanlistService.IpBanDto> add(MinecraftApi minecraftApi, List<IpBanlistService.IncomingIpBanDto> bans, ClientInfo clientInfo) @ L30

  • 方法名:add
  • 源码定位:L30
  • 返回类型:List<IpBanlistService.IpBanDto>
  • 修饰符:public static

参数:

  • minecraftApi: MinecraftApi
  • bans: List<IpBanlistService.IncomingIpBanDto>
  • clientInfo: ClientInfo

说明:

TODO

private static List<ServerPlayer> banIp(MinecraftApi minecraftApi, IpBanlistService.IncomingIpBanDto ban, ClientInfo clientInfo) @ L38

  • 方法名:banIp
  • 源码定位:L38
  • 返回类型:List
  • 修饰符:private static

参数:

  • minecraftApi: MinecraftApi
  • ban: IpBanlistService.IncomingIpBanDto
  • clientInfo: ClientInfo

说明:

TODO

private static List<ServerPlayer> banIp(MinecraftApi minecraftApi, IpBanlistService.IpBan ban, ClientInfo clientInfo) @ L54

  • 方法名:banIp
  • 源码定位:L54
  • 返回类型:List
  • 修饰符:private static

参数:

  • minecraftApi: MinecraftApi
  • ban: IpBanlistService.IpBan
  • clientInfo: ClientInfo

说明:

TODO

public static List<IpBanlistService.IpBanDto> clear(MinecraftApi minecraftApi, ClientInfo clientInfo) @ L59

  • 方法名:clear
  • 源码定位:L59
  • 返回类型:List<IpBanlistService.IpBanDto>
  • 修饰符:public static

参数:

  • minecraftApi: MinecraftApi
  • clientInfo: ClientInfo

说明:

TODO

public static List<IpBanlistService.IpBanDto> remove(MinecraftApi minecraftApi, List<String> ban, ClientInfo clientInfo) @ L64

  • 方法名:remove
  • 源码定位:L64
  • 返回类型:List<IpBanlistService.IpBanDto>
  • 修饰符:public static

参数:

  • minecraftApi: MinecraftApi
  • ban: List
  • clientInfo: ClientInfo

说明:

TODO

public static List<IpBanlistService.IpBanDto> set(MinecraftApi minecraftApi, List<IpBanlistService.IpBanDto> ips, ClientInfo clientInfo) @ L69

  • 方法名:set
  • 源码定位:L69
  • 返回类型:List<IpBanlistService.IpBanDto>
  • 修饰符:public static

参数:

  • minecraftApi: MinecraftApi
  • ips: List<IpBanlistService.IpBanDto>
  • clientInfo: ClientInfo

说明:

TODO

代码

public class IpBanlistService {
    private static final String BAN_SOURCE = "Management server";
 
    public static List<IpBanlistService.IpBanDto> get(MinecraftApi minecraftApi) {
        return minecraftApi.banListService().getIpBanEntries().stream().map(IpBanlistService.IpBan::from).map(IpBanlistService.IpBanDto::from).toList();
    }
 
    public static List<IpBanlistService.IpBanDto> add(MinecraftApi minecraftApi, List<IpBanlistService.IncomingIpBanDto> bans, ClientInfo clientInfo) {
        bans.stream()
            .map(ban -> banIp(minecraftApi, ban, clientInfo))
            .flatMap(Collection::stream)
            .forEach(player -> player.connection.disconnect(Component.translatable("multiplayer.disconnect.ip_banned")));
        return get(minecraftApi);
    }
 
    private static List<ServerPlayer> banIp(MinecraftApi minecraftApi, IpBanlistService.IncomingIpBanDto ban, ClientInfo clientInfo) {
        IpBanlistService.IpBan ipBan = ban.toIpBan();
        if (ipBan != null) {
            return banIp(minecraftApi, ipBan, clientInfo);
        } else {
            if (ban.player().isPresent()) {
                Optional<ServerPlayer> player = minecraftApi.playerListService().getPlayer(ban.player().get().id(), ban.player().get().name());
                if (player.isPresent()) {
                    return banIp(minecraftApi, ban.toIpBan(player.get()), clientInfo);
                }
            }
 
            return List.of();
        }
    }
 
    private static List<ServerPlayer> banIp(MinecraftApi minecraftApi, IpBanlistService.IpBan ban, ClientInfo clientInfo) {
        minecraftApi.banListService().addIpBan(ban.toIpBanEntry(), clientInfo);
        return minecraftApi.playerListService().getPlayersWithAddress(ban.ip());
    }
 
    public static List<IpBanlistService.IpBanDto> clear(MinecraftApi minecraftApi, ClientInfo clientInfo) {
        minecraftApi.banListService().clearIpBans(clientInfo);
        return get(minecraftApi);
    }
 
    public static List<IpBanlistService.IpBanDto> remove(MinecraftApi minecraftApi, List<String> ban, ClientInfo clientInfo) {
        ban.forEach(ip -> minecraftApi.banListService().removeIpBan(ip, clientInfo));
        return get(minecraftApi);
    }
 
    public static List<IpBanlistService.IpBanDto> set(MinecraftApi minecraftApi, List<IpBanlistService.IpBanDto> ips, ClientInfo clientInfo) {
        Set<IpBanlistService.IpBan> finalBanlist = ips.stream()
            .filter(ban -> InetAddresses.isInetAddress(ban.ip()))
            .map(IpBanlistService.IpBanDto::toIpBan)
            .collect(Collectors.toSet());
        Set<IpBanlistService.IpBan> currentBans = minecraftApi.banListService()
            .getIpBanEntries()
            .stream()
            .map(IpBanlistService.IpBan::from)
            .collect(Collectors.toSet());
        currentBans.stream().filter(ban -> !finalBanlist.contains(ban)).forEach(ban -> minecraftApi.banListService().removeIpBan(ban.ip(), clientInfo));
        finalBanlist.stream().filter(ban -> !currentBans.contains(ban)).forEach(ban -> minecraftApi.banListService().addIpBan(ban.toIpBanEntry(), clientInfo));
        finalBanlist.stream()
            .filter(ban -> !currentBans.contains(ban))
            .flatMap(ban -> minecraftApi.playerListService().getPlayersWithAddress(ban.ip()).stream())
            .forEach(player -> player.connection.disconnect(Component.translatable("multiplayer.disconnect.ip_banned")));
        return get(minecraftApi);
    }
 
    public record IncomingIpBanDto(Optional<PlayerDto> player, Optional<String> ip, Optional<String> reason, Optional<String> source, Optional<Instant> expires) {
        public static final MapCodec<IpBanlistService.IncomingIpBanDto> CODEC = RecordCodecBuilder.mapCodec(
            i -> i.group(
                    PlayerDto.CODEC.codec().optionalFieldOf("player").forGetter(IpBanlistService.IncomingIpBanDto::player),
                    Codec.STRING.optionalFieldOf("ip").forGetter(IpBanlistService.IncomingIpBanDto::ip),
                    Codec.STRING.optionalFieldOf("reason").forGetter(IpBanlistService.IncomingIpBanDto::reason),
                    Codec.STRING.optionalFieldOf("source").forGetter(IpBanlistService.IncomingIpBanDto::source),
                    ExtraCodecs.INSTANT_ISO8601.optionalFieldOf("expires").forGetter(IpBanlistService.IncomingIpBanDto::expires)
                )
                .apply(i, IpBanlistService.IncomingIpBanDto::new)
        );
 
        private IpBanlistService.IpBan toIpBan(ServerPlayer player) {
            return new IpBanlistService.IpBan(player.getIpAddress(), this.reason().orElse(null), this.source().orElse("Management server"), this.expires());
        }
 
        private IpBanlistService.@Nullable IpBan toIpBan() {
            return !this.ip().isEmpty() && InetAddresses.isInetAddress(this.ip().get())
                ? new IpBanlistService.IpBan(this.ip().get(), this.reason().orElse(null), this.source().orElse("Management server"), this.expires())
                : null;
        }
    }
 
    private record IpBan(String ip, @Nullable String reason, String source, Optional<Instant> expires) {
        private static IpBanlistService.IpBan from(IpBanListEntry entry) {
            return new IpBanlistService.IpBan(
                Objects.requireNonNull(entry.getUser()), entry.getReason(), entry.getSource(), Optional.ofNullable(entry.getExpires()).map(Date::toInstant)
            );
        }
 
        private IpBanListEntry toIpBanEntry() {
            return new IpBanListEntry(this.ip(), null, this.source(), this.expires().map(Date::from).orElse(null), this.reason());
        }
    }
 
    public record IpBanDto(String ip, Optional<String> reason, Optional<String> source, Optional<Instant> expires) {
        public static final MapCodec<IpBanlistService.IpBanDto> CODEC = RecordCodecBuilder.mapCodec(
            i -> i.group(
                    Codec.STRING.fieldOf("ip").forGetter(IpBanlistService.IpBanDto::ip),
                    Codec.STRING.optionalFieldOf("reason").forGetter(IpBanlistService.IpBanDto::reason),
                    Codec.STRING.optionalFieldOf("source").forGetter(IpBanlistService.IpBanDto::source),
                    ExtraCodecs.INSTANT_ISO8601.optionalFieldOf("expires").forGetter(IpBanlistService.IpBanDto::expires)
                )
                .apply(i, IpBanlistService.IpBanDto::new)
        );
 
        private static IpBanlistService.IpBanDto from(IpBanlistService.IpBan ban) {
            return new IpBanlistService.IpBanDto(ban.ip(), Optional.ofNullable(ban.reason()), Optional.of(ban.source()), ban.expires());
        }
 
        public static IpBanlistService.IpBanDto from(IpBanListEntry ban) {
            return from(IpBanlistService.IpBan.from(ban));
        }
 
        private IpBanlistService.IpBan toIpBan() {
            return new IpBanlistService.IpBan(this.ip(), this.reason().orElse(null), this.source().orElse("Management server"), this.expires());
        }
    }
}

引用的其他类