RealmsWorldUpload.java

com.mojang.realmsclient.client.worldupload.RealmsWorldUpload

信息

  • 全限定名:com.mojang.realmsclient.client.worldupload.RealmsWorldUpload
  • 类型:public class
  • 包:com.mojang.realmsclient.client.worldupload
  • 源码路径:src/main/java/com/mojang/realmsclient/client/worldupload/RealmsWorldUpload.java
  • 起始行号:L26
  • 职责:

    TODO

字段/常量

  • LOGGER

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

      TODO

  • UPLOAD_RETRIES

    • 类型: int
    • 修饰符: public static final
    • 源码定位: L28
    • 说明:

      TODO

  • client

    • 类型: RealmsClient
    • 修饰符: private final
    • 源码定位: L29
    • 说明:

      TODO

  • worldFolder

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

      TODO

  • realmsSlot

    • 类型: RealmsSlot
    • 修饰符: private final
    • 源码定位: L31
    • 说明:

      TODO

  • user

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

      TODO

  • realmId

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

      TODO

  • statusCallback

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

      TODO

  • cancelled

    • 类型: boolean
    • 修饰符: private volatile
    • 源码定位: L35
    • 说明:

      TODO

  • uploadTask

    • 类型: CompletableFuture<?>
    • 修饰符: private volatile
    • 源码定位: L36
    • 说明:

      TODO

内部类/嵌套类型

构造器

public RealmsWorldUpload(Path worldFolder, RealmsSlot realmsSlot, User user, long realmId, RealmsWorldUploadStatusTracker statusCallback) @ L38

  • 构造器名:RealmsWorldUpload
  • 源码定位:L38
  • 修饰符:public

参数:

  • worldFolder: Path
  • realmsSlot: RealmsSlot
  • user: User
  • realmId: long
  • statusCallback: RealmsWorldUploadStatusTracker

说明:

TODO

方法

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

public CompletableFuture<?> packAndUpload() @ L46

  • 方法名:packAndUpload
  • 源码定位:L46
  • 返回类型:CompletableFuture<?>
  • 修饰符:public

参数:

说明:

TODO

public void cancel() @ L111

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

参数:

说明:

TODO

private UploadInfo requestUploadInfoWithRetries() @ L119

  • 方法名:requestUploadInfoWithRetries
  • 源码定位:L119
  • 返回类型:UploadInfo
  • 修饰符:private

参数:

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class RealmsWorldUpload {
    private static final Logger LOGGER = LogUtils.getLogger();
    public static final int UPLOAD_RETRIES = 20;
    private final RealmsClient client = RealmsClient.getOrCreate();
    private final Path worldFolder;
    private final RealmsSlot realmsSlot;
    private final User user;
    private final long realmId;
    private final RealmsWorldUploadStatusTracker statusCallback;
    private volatile boolean cancelled;
    private volatile @Nullable CompletableFuture<?> uploadTask;
 
    public RealmsWorldUpload(Path worldFolder, RealmsSlot realmsSlot, User user, long realmId, RealmsWorldUploadStatusTracker statusCallback) {
        this.worldFolder = worldFolder;
        this.realmsSlot = realmsSlot;
        this.user = user;
        this.realmId = realmId;
        this.statusCallback = statusCallback;
    }
 
    public CompletableFuture<?> packAndUpload() {
        return CompletableFuture.runAsync(
            () -> {
                File archive = null;
 
                try {
                    UploadInfo uploadInfo = this.requestUploadInfoWithRetries();
                    archive = RealmsUploadWorldPacker.pack(this.worldFolder, () -> this.cancelled);
                    this.statusCallback.setUploading();
 
                    try (FileUpload fileUpload = new FileUpload(
                            archive,
                            this.realmId,
                            this.realmsSlot.slotId,
                            uploadInfo,
                            this.user,
                            SharedConstants.getCurrentVersion().name(),
                            this.realmsSlot.options.version,
                            this.statusCallback.getUploadStatus()
                        )) {
                        CompletableFuture<UploadResult> uploadTask = fileUpload.startUpload();
                        this.uploadTask = uploadTask;
                        if (!this.cancelled) {
                            UploadResult join;
                            try {
                                join = uploadTask.join();
                            } catch (CompletionException var17) {
                                throw var17.getCause();
                            }
 
                            String errorMessage = join.getSimplifiedErrorMessage();
                            if (errorMessage != null) {
                                throw new RealmsUploadFailedException(errorMessage);
                            }
 
                            UploadTokenCache.invalidate(this.realmId);
                            this.client.updateSlot(this.realmId, this.realmsSlot.slotId, this.realmsSlot.options, this.realmsSlot.settings);
                            return;
                        }
 
                        uploadTask.cancel(true);
                    }
                } catch (RealmsServiceException var19) {
                    throw new RealmsUploadFailedException(var19.realmsError.errorMessage());
                } catch (CancellationException | InterruptedException var20) {
                    throw new RealmsUploadCanceledException();
                } catch (RealmsUploadException var21) {
                    throw var21;
                } catch (Throwable var22) {
                    if (var22 instanceof Error error) {
                        throw error;
                    }
 
                    throw new RealmsUploadFailedException(var22.getMessage());
                } finally {
                    if (archive != null) {
                        LOGGER.debug("Deleting file {}", archive.getAbsolutePath());
                        archive.delete();
                    }
                }
            },
            Util.backgroundExecutor()
        );
    }
 
    public void cancel() {
        this.cancelled = true;
        CompletableFuture<?> uploadTask = this.uploadTask;
        if (uploadTask != null) {
            uploadTask.cancel(true);
        }
    }
 
    private UploadInfo requestUploadInfoWithRetries() throws RealmsServiceException, InterruptedException {
        for (int i = 0; i < 20; i++) {
            try {
                UploadInfo uploadInfo = this.client.requestUploadInfo(this.realmId);
                if (this.cancelled) {
                    throw new RealmsUploadCanceledException();
                }
 
                if (uploadInfo != null) {
                    if (!uploadInfo.worldClosed()) {
                        throw new RealmsUploadWorldNotClosedException();
                    }
 
                    return uploadInfo;
                }
            } catch (RetryCallException var3) {
                Thread.sleep(var3.delaySeconds * 1000L);
            }
        }
 
        throw new RealmsUploadWorldNotClosedException();
    }
}

引用的其他类