ClientTelemetryManager.java

net.minecraft.client.telemetry.ClientTelemetryManager

信息

  • 全限定名:net.minecraft.client.telemetry.ClientTelemetryManager
  • 类型:public class
  • 包:net.minecraft.client.telemetry
  • 源码路径:src/main/java/net/minecraft/client/telemetry/ClientTelemetryManager.java
  • 起始行号:L25
  • 实现:AutoCloseable
  • 职责:

    TODO

字段/常量

  • THREAD_COUNT

    • 类型: AtomicInteger
    • 修饰符: private static final
    • 源码定位: L26
    • 说明:

      TODO

  • EXECUTOR

    • 类型: Executor
    • 修饰符: private static final
    • 源码定位: L27
    • 说明:

      TODO

  • minecraft

    • 类型: Minecraft
    • 修饰符: private final
    • 源码定位: L32
    • 说明:

      TODO

  • userApiService

    • 类型: UserApiService
    • 修饰符: private final
    • 源码定位: L33
    • 说明:

      TODO

  • deviceSessionProperties

    • 类型: TelemetryPropertyMap
    • 修饰符: private final
    • 源码定位: L34
    • 说明:

      TODO

  • logDirectory

    • 类型: Path
    • 修饰符: private final
    • 源码定位: L35
    • 说明:

      TODO

  • logManager

    • 类型: CompletableFuture<Optional<TelemetryLogManager>>
    • 修饰符: private final
    • 源码定位: L36
    • 说明:

      TODO

  • outsideSessionSender

    • 类型: Supplier<TelemetryEventSender>
    • 修饰符: private final
    • 源码定位: L37
    • 说明:

      TODO

内部类/嵌套类型

构造器

public ClientTelemetryManager(Minecraft minecraft, UserApiService userApiService, User user) @ L39

  • 构造器名:ClientTelemetryManager
  • 源码定位:L39
  • 修饰符:public

参数:

  • minecraft: Minecraft
  • userApiService: UserApiService
  • user: User

说明:

TODO

方法

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

public WorldSessionTelemetryManager createWorldSessionManager(boolean newWorld, Duration worldLoadDuration, String minigameName) @ L56

  • 方法名:createWorldSessionManager
  • 源码定位:L56
  • 返回类型:WorldSessionTelemetryManager
  • 修饰符:public

参数:

  • newWorld: boolean
  • worldLoadDuration: Duration
  • minigameName: String

说明:

TODO

public TelemetryEventSender getOutsideSessionSender() @ L60

  • 方法名:getOutsideSessionSender
  • 源码定位:L60
  • 返回类型:TelemetryEventSender
  • 修饰符:public

参数:

说明:

TODO

private TelemetryEventSender createEventSender() @ L64

  • 方法名:createEventSender
  • 源码定位:L64
  • 返回类型:TelemetryEventSender
  • 修饰符:private

参数:

说明:

TODO

public Path getLogDirectory() @ L96

  • 方法名:getLogDirectory
  • 源码定位:L96
  • 返回类型:Path
  • 修饰符:public

参数:

说明:

TODO

public void close() @ L100

  • 方法名:close
  • 源码定位:L100
  • 返回类型:void
  • 修饰符:public

参数:

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class ClientTelemetryManager implements AutoCloseable {
    private static final AtomicInteger THREAD_COUNT = new AtomicInteger(1);
    private static final Executor EXECUTOR = Executors.newSingleThreadExecutor(r -> {
        Thread result = new Thread(r);
        result.setName("Telemetry-Sender-#" + THREAD_COUNT.getAndIncrement());
        return result;
    });
    private final Minecraft minecraft;
    private final UserApiService userApiService;
    private final TelemetryPropertyMap deviceSessionProperties;
    private final Path logDirectory;
    private final CompletableFuture<Optional<TelemetryLogManager>> logManager;
    private final Supplier<TelemetryEventSender> outsideSessionSender = Suppliers.memoize(this::createEventSender);
 
    public ClientTelemetryManager(Minecraft minecraft, UserApiService userApiService, User user) {
        this.minecraft = minecraft;
        this.userApiService = userApiService;
        TelemetryPropertyMap.Builder properties = TelemetryPropertyMap.builder();
        user.getXuid().ifPresent(id -> properties.put(TelemetryProperty.USER_ID, id));
        user.getClientId().ifPresent(id -> properties.put(TelemetryProperty.CLIENT_ID, id));
        properties.put(TelemetryProperty.MINECRAFT_SESSION_ID, UUID.randomUUID());
        properties.put(TelemetryProperty.GAME_VERSION, SharedConstants.getCurrentVersion().id());
        properties.put(TelemetryProperty.OPERATING_SYSTEM, Util.getPlatform().telemetryName());
        properties.put(TelemetryProperty.PLATFORM, System.getProperty("os.name"));
        properties.put(TelemetryProperty.CLIENT_MODDED, Minecraft.checkModStatus().shouldReportAsModified());
        properties.putIfNotNull(TelemetryProperty.LAUNCHER_NAME, Minecraft.getLauncherBrand());
        this.deviceSessionProperties = properties.build();
        this.logDirectory = minecraft.gameDirectory.toPath().resolve("logs/telemetry");
        this.logManager = TelemetryLogManager.open(this.logDirectory);
    }
 
    public WorldSessionTelemetryManager createWorldSessionManager(boolean newWorld, @Nullable Duration worldLoadDuration, @Nullable String minigameName) {
        return new WorldSessionTelemetryManager(this.createEventSender(), newWorld, worldLoadDuration, minigameName);
    }
 
    public TelemetryEventSender getOutsideSessionSender() {
        return this.outsideSessionSender.get();
    }
 
    private TelemetryEventSender createEventSender() {
        if (!this.minecraft.allowsTelemetry()) {
            return TelemetryEventSender.DISABLED;
        } else {
            TelemetrySession telemetrySession = this.userApiService.newTelemetrySession(EXECUTOR);
            if (!telemetrySession.isEnabled()) {
                return TelemetryEventSender.DISABLED;
            } else {
                CompletableFuture<Optional<TelemetryEventLogger>> loggerFuture = this.logManager
                    .thenCompose(manager -> manager.map(TelemetryLogManager::openLogger).orElseGet(() -> CompletableFuture.completedFuture(Optional.empty())));
                return (type, buildFunction) -> {
                    if (!type.isOptIn() || Minecraft.getInstance().telemetryOptInExtra()) {
                        TelemetryPropertyMap.Builder properties = TelemetryPropertyMap.builder();
                        properties.putAll(this.deviceSessionProperties);
                        properties.put(TelemetryProperty.EVENT_TIMESTAMP_UTC, Instant.now());
                        properties.put(TelemetryProperty.OPT_IN, type.isOptIn());
                        buildFunction.accept(properties);
                        TelemetryEventInstance event = new TelemetryEventInstance(type, properties.build());
                        loggerFuture.thenAccept(logger -> {
                            if (!logger.isEmpty()) {
                                logger.get().log(event);
                                if (!SharedConstants.IS_RUNNING_IN_IDE || !SharedConstants.DEBUG_DONT_SEND_TELEMETRY_TO_BACKEND) {
                                    event.export(telemetrySession).send();
                                }
                            }
                        });
                    }
                };
            }
        }
    }
 
    public Path getLogDirectory() {
        return this.logDirectory;
    }
 
    @Override
    public void close() {
        this.logManager.thenAccept(manager -> manager.ifPresent(TelemetryLogManager::close));
    }
}

引用的其他类

  • SharedConstants

    • 引用位置: 方法调用
    • 关联成员: SharedConstants.getCurrentVersion()
  • Minecraft

    • 引用位置: 参数/字段/方法调用
    • 关联成员: Minecraft.checkModStatus(), Minecraft.getInstance(), Minecraft.getLauncherBrand()
  • User

    • 引用位置: 参数
  • LoggedChatMessage

    • 引用位置: 方法调用
    • 关联成员: System.getProperty()
  • TelemetryEventInstance

    • 引用位置: 构造调用
    • 关联成员: TelemetryEventInstance()
  • TelemetryEventSender

    • 引用位置: 字段/返回值
  • TelemetryLogManager

    • 引用位置: 字段/方法调用
    • 关联成员: TelemetryLogManager.open()
  • TelemetryPropertyMap

    • 引用位置: 字段/方法调用
    • 关联成员: TelemetryPropertyMap.builder()
  • WorldSessionTelemetryManager

    • 引用位置: 构造调用/返回值
    • 关联成员: WorldSessionTelemetryManager()
  • Util

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