OperatorService.java

net.minecraft.server.jsonrpc.methods.OperatorService

信息

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

    TODO

字段/常量

内部类/嵌套类型

  • net.minecraft.server.jsonrpc.methods.OperatorService.Op

    • 类型: record
    • 修饰符: package-private
    • 源码定位: L83
    • 说明:

      TODO

  • net.minecraft.server.jsonrpc.methods.OperatorService.OperatorDto

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

      TODO

构造器

方法

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

public static List<OperatorService.OperatorDto> get(MinecraftApi minecraftApi) @ L20

  • 方法名:get
  • 源码定位:L20
  • 返回类型:List<OperatorService.OperatorDto>
  • 修饰符:public static

参数:

  • minecraftApi: MinecraftApi

说明:

TODO

public static List<OperatorService.OperatorDto> clear(MinecraftApi minecraftApi, ClientInfo clientInfo) @ L24

  • 方法名:clear
  • 源码定位:L24
  • 返回类型:List<OperatorService.OperatorDto>
  • 修饰符:public static

参数:

  • minecraftApi: MinecraftApi
  • clientInfo: ClientInfo

说明:

TODO

public static List<OperatorService.OperatorDto> remove(MinecraftApi minecraftApi, List<PlayerDto> playerDtos, ClientInfo clientInfo) @ L29

  • 方法名:remove
  • 源码定位:L29
  • 返回类型:List<OperatorService.OperatorDto>
  • 修饰符:public static

参数:

  • minecraftApi: MinecraftApi
  • playerDtos: List
  • clientInfo: ClientInfo

说明:

TODO

public static List<OperatorService.OperatorDto> add(MinecraftApi minecraftApi, List<OperatorService.OperatorDto> operators, ClientInfo clientInfo) @ L41

  • 方法名:add
  • 源码定位:L41
  • 返回类型:List<OperatorService.OperatorDto>
  • 修饰符:public static

参数:

  • minecraftApi: MinecraftApi
  • operators: List<OperatorService.OperatorDto>
  • clientInfo: ClientInfo

说明:

TODO

public static List<OperatorService.OperatorDto> set(MinecraftApi minecraftApi, List<OperatorService.OperatorDto> operators, ClientInfo clientInfo) @ L59

  • 方法名:set
  • 源码定位:L59
  • 返回类型:List<OperatorService.OperatorDto>
  • 修饰符:public static

参数:

  • minecraftApi: MinecraftApi
  • operators: List<OperatorService.OperatorDto>
  • clientInfo: ClientInfo

说明:

TODO

代码

public class OperatorService {
    public static List<OperatorService.OperatorDto> get(MinecraftApi minecraftApi) {
        return minecraftApi.operatorListService().getEntries().stream().filter(u -> u.getUser() != null).map(OperatorService.OperatorDto::from).toList();
    }
 
    public static List<OperatorService.OperatorDto> clear(MinecraftApi minecraftApi, ClientInfo clientInfo) {
        minecraftApi.operatorListService().clear(clientInfo);
        return get(minecraftApi);
    }
 
    public static List<OperatorService.OperatorDto> remove(MinecraftApi minecraftApi, List<PlayerDto> playerDtos, ClientInfo clientInfo) {
        List<CompletableFuture<Optional<NameAndId>>> fetch = playerDtos.stream()
            .map(playerDto -> minecraftApi.playerListService().getUser(playerDto.id(), playerDto.name()))
            .toList();
 
        for (Optional<NameAndId> user : Util.sequence(fetch).join()) {
            user.ifPresent(nameAndId -> minecraftApi.operatorListService().deop(nameAndId, clientInfo));
        }
 
        return get(minecraftApi);
    }
 
    public static List<OperatorService.OperatorDto> add(MinecraftApi minecraftApi, List<OperatorService.OperatorDto> operators, ClientInfo clientInfo) {
        List<CompletableFuture<Optional<OperatorService.Op>>> fetch = operators.stream()
            .map(
                operator -> minecraftApi.playerListService()
                    .getUser(operator.player().id(), operator.player().name())
                    .thenApply(user -> user.map(nameAndId -> new OperatorService.Op(nameAndId, operator.permissionLevel(), operator.bypassesPlayerLimit())))
            )
            .toList();
 
        for (Optional<OperatorService.Op> op : Util.sequence(fetch).join()) {
            op.ifPresent(
                operator -> minecraftApi.operatorListService().op(operator.user(), operator.permissionLevel(), operator.bypassesPlayerLimit(), clientInfo)
            );
        }
 
        return get(minecraftApi);
    }
 
    public static List<OperatorService.OperatorDto> set(MinecraftApi minecraftApi, List<OperatorService.OperatorDto> operators, ClientInfo clientInfo) {
        List<CompletableFuture<Optional<OperatorService.Op>>> fetch = operators.stream()
            .map(
                operator -> minecraftApi.playerListService()
                    .getUser(operator.player().id(), operator.player().name())
                    .thenApply(user -> user.map(nameAndId -> new OperatorService.Op(nameAndId, operator.permissionLevel(), operator.bypassesPlayerLimit())))
            )
            .toList();
        Set<OperatorService.Op> finalOperators = Util.sequence(fetch).join().stream().flatMap(Optional::stream).collect(Collectors.toSet());
        Set<OperatorService.Op> currentOperators = minecraftApi.operatorListService()
            .getEntries()
            .stream()
            .filter(entry -> entry.getUser() != null)
            .map(entry -> new OperatorService.Op(entry.getUser(), Optional.of(entry.permissions().level()), Optional.of(entry.getBypassesPlayerLimit())))
            .collect(Collectors.toSet());
        currentOperators.stream()
            .filter(operator -> !finalOperators.contains(operator))
            .forEach(operator -> minecraftApi.operatorListService().deop(operator.user(), clientInfo));
        finalOperators.stream()
            .filter(operator -> !currentOperators.contains(operator))
            .forEach(operator -> minecraftApi.operatorListService().op(operator.user(), operator.permissionLevel(), operator.bypassesPlayerLimit(), clientInfo));
        return get(minecraftApi);
    }
 
    record Op(NameAndId user, Optional<PermissionLevel> permissionLevel, Optional<Boolean> bypassesPlayerLimit) {
    }
 
    public record OperatorDto(PlayerDto player, Optional<PermissionLevel> permissionLevel, Optional<Boolean> bypassesPlayerLimit) {
        public static final MapCodec<OperatorService.OperatorDto> CODEC = RecordCodecBuilder.mapCodec(
            i -> i.group(
                    PlayerDto.CODEC.codec().fieldOf("player").forGetter(OperatorService.OperatorDto::player),
                    PermissionLevel.INT_CODEC.optionalFieldOf("permissionLevel").forGetter(OperatorService.OperatorDto::permissionLevel),
                    Codec.BOOL.optionalFieldOf("bypassesPlayerLimit").forGetter(OperatorService.OperatorDto::bypassesPlayerLimit)
                )
                .apply(i, OperatorService.OperatorDto::new)
        );
 
        public static OperatorService.OperatorDto from(ServerOpListEntry serverOpListEntry) {
            return new OperatorService.OperatorDto(
                PlayerDto.from(Objects.requireNonNull(serverOpListEntry.getUser())),
                Optional.of(serverOpListEntry.permissions().level()),
                Optional.of(serverOpListEntry.getBypassesPlayerLimit())
            );
        }
    }
}

引用的其他类

  • PlayerDto

    • 引用位置: 参数/方法调用
    • 关联成员: PlayerDto.from()
  • MinecraftApi

    • 引用位置: 参数
  • ClientInfo

    • 引用位置: 参数
  • Util

    • 引用位置: 方法调用
    • 关联成员: Util.sequence()