RealmsNotification.java

com.mojang.realmsclient.dto.RealmsNotification

信息

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

    TODO

字段/常量

  • LOGGER

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

      TODO

  • NOTIFICATION_UUID

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

      TODO

  • DISMISSABLE

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

      TODO

  • SEEN

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

      TODO

  • TYPE

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

      TODO

  • VISIT_URL

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

      TODO

  • INFO_POPUP

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

      TODO

  • BUTTON_TEXT_FALLBACK

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

      TODO

  • uuid

    • 类型: UUID
    • 修饰符: private final
    • 源码定位: L36
    • 说明:

      TODO

  • dismissable

    • 类型: boolean
    • 修饰符: private final
    • 源码定位: L37
    • 说明:

      TODO

  • seen

    • 类型: boolean
    • 修饰符: private final
    • 源码定位: L38
    • 说明:

      TODO

  • type

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

      TODO

内部类/嵌套类型

  • com.mojang.realmsclient.dto.RealmsNotification.InfoPopup

    • 类型: class
    • 修饰符: public static
    • 源码定位: L93
    • 说明:

      TODO

  • com.mojang.realmsclient.dto.RealmsNotification.UrlButton

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

      TODO

  • com.mojang.realmsclient.dto.RealmsNotification.VisitUrl

    • 类型: class
    • 修饰符: public static
    • 源码定位: L166
    • 说明:

      TODO

构造器

private RealmsNotification(UUID uuid, boolean dismissable, boolean seen, String type) @ L41

  • 构造器名:RealmsNotification
  • 源码定位:L41
  • 修饰符:private

参数:

  • uuid: UUID
  • dismissable: boolean
  • seen: boolean
  • type: String

说明:

TODO

方法

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

public boolean seen() @ L48

  • 方法名:seen
  • 源码定位:L48
  • 返回类型:boolean
  • 修饰符:public

参数:

说明:

TODO

public boolean dismissable() @ L52

  • 方法名:dismissable
  • 源码定位:L52
  • 返回类型:boolean
  • 修饰符:public

参数:

说明:

TODO

public UUID uuid() @ L56

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

参数:

说明:

TODO

public static List<RealmsNotification> parseList(String json) @ L60

  • 方法名:parseList
  • 源码定位:L60
  • 返回类型:List
  • 修饰符:public static

参数:

  • json: String

说明:

TODO

private static RealmsNotification parse(JsonObject jsonObject) @ L74

  • 方法名:parse
  • 源码定位:L74
  • 返回类型:RealmsNotification
  • 修饰符:private static

参数:

  • jsonObject: JsonObject

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class RealmsNotification {
    private static final Logger LOGGER = LogUtils.getLogger();
    private static final String NOTIFICATION_UUID = "notificationUuid";
    private static final String DISMISSABLE = "dismissable";
    private static final String SEEN = "seen";
    private static final String TYPE = "type";
    private static final String VISIT_URL = "visitUrl";
    private static final String INFO_POPUP = "infoPopup";
    private static final Component BUTTON_TEXT_FALLBACK = Component.translatable("mco.notification.visitUrl.buttonText.default");
    private final UUID uuid;
    private final boolean dismissable;
    private final boolean seen;
    private final String type;
 
    private RealmsNotification(UUID uuid, boolean dismissable, boolean seen, String type) {
        this.uuid = uuid;
        this.dismissable = dismissable;
        this.seen = seen;
        this.type = type;
    }
 
    public boolean seen() {
        return this.seen;
    }
 
    public boolean dismissable() {
        return this.dismissable;
    }
 
    public UUID uuid() {
        return this.uuid;
    }
 
    public static List<RealmsNotification> parseList(String json) {
        List<RealmsNotification> result = new ArrayList<>();
 
        try {
            for (JsonElement element : LenientJsonParser.parse(json).getAsJsonObject().get("notifications").getAsJsonArray()) {
                result.add(parse(element.getAsJsonObject()));
            }
        } catch (Exception var5) {
            LOGGER.error("Could not parse list of RealmsNotifications", (Throwable)var5);
        }
 
        return result;
    }
 
    private static RealmsNotification parse(JsonObject jsonObject) {
        UUID uuid = JsonUtils.getUuidOr("notificationUuid", jsonObject, null);
        if (uuid == null) {
            throw new IllegalStateException("Missing required property notificationUuid");
        } else {
            boolean dismissable = JsonUtils.getBooleanOr("dismissable", jsonObject, true);
            boolean seen = JsonUtils.getBooleanOr("seen", jsonObject, false);
            String type = JsonUtils.getRequiredString("type", jsonObject);
            RealmsNotification base = new RealmsNotification(uuid, dismissable, seen, type);
 
            return (RealmsNotification)(switch (type) {
                case "visitUrl" -> RealmsNotification.VisitUrl.parse(base, jsonObject);
                case "infoPopup" -> RealmsNotification.InfoPopup.parse(base, jsonObject);
                default -> base;
            });
        }
    }
 
    @OnlyIn(Dist.CLIENT)
    public static class InfoPopup extends RealmsNotification {
        private static final String TITLE = "title";
        private static final String MESSAGE = "message";
        private static final String IMAGE = "image";
        private static final String URL_BUTTON = "urlButton";
        private final RealmsText title;
        private final RealmsText message;
        private final Identifier image;
        private final RealmsNotification.@Nullable UrlButton urlButton;
 
        private InfoPopup(RealmsNotification base, RealmsText title, RealmsText message, Identifier image, RealmsNotification.@Nullable UrlButton urlButton) {
            super(base.uuid, base.dismissable, base.seen, base.type);
            this.title = title;
            this.message = message;
            this.image = image;
            this.urlButton = urlButton;
        }
 
        public static RealmsNotification.InfoPopup parse(RealmsNotification base, JsonObject object) {
            RealmsText title = JsonUtils.getRequired("title", object, RealmsText::parse);
            RealmsText message = JsonUtils.getRequired("message", object, RealmsText::parse);
            Identifier image = Identifier.parse(JsonUtils.getRequiredString("image", object));
            RealmsNotification.UrlButton urlButton = JsonUtils.getOptional("urlButton", object, RealmsNotification.UrlButton::parse);
            return new RealmsNotification.InfoPopup(base, title, message, image, urlButton);
        }
 
        public @Nullable PopupScreen buildScreen(Screen parentScreen, Consumer<UUID> dismiss) {
            Component title = this.title.createComponent();
            if (title == null) {
                RealmsNotification.LOGGER.warn("Realms info popup had title with no available translation: {}", this.title);
                return null;
            } else {
                PopupScreen.Builder builder = new PopupScreen.Builder(parentScreen, title)
                    .setImage(this.image)
                    .addMessage(this.message.createComponent(CommonComponents.EMPTY));
                if (this.urlButton != null) {
                    builder.addButton(this.urlButton.urlText.createComponent(RealmsNotification.BUTTON_TEXT_FALLBACK), popup -> {
                        Minecraft minecraft = Minecraft.getInstance();
                        minecraft.setScreen(new ConfirmLinkScreen(result -> {
                            if (result) {
                                Util.getPlatform().openUri(this.urlButton.url);
                                minecraft.setScreen(parentScreen);
                            } else {
                                minecraft.setScreen(popup);
                            }
                        }, this.urlButton.url, true));
                        dismiss.accept(this.uuid());
                    });
                }
 
                builder.addButton(CommonComponents.GUI_OK, popup -> {
                    popup.onClose();
                    dismiss.accept(this.uuid());
                });
                builder.onClose(() -> dismiss.accept(this.uuid()));
                return builder.build();
            }
        }
    }
 
    @OnlyIn(Dist.CLIENT)
    private record UrlButton(String url, RealmsText urlText) {
        private static final String URL = "url";
        private static final String URL_TEXT = "urlText";
 
        public static RealmsNotification.UrlButton parse(JsonObject jsonObject) {
            String url = JsonUtils.getRequiredString("url", jsonObject);
            RealmsText urlText = JsonUtils.getRequired("urlText", jsonObject, RealmsText::parse);
            return new RealmsNotification.UrlButton(url, urlText);
        }
    }
 
    @OnlyIn(Dist.CLIENT)
    public static class VisitUrl extends RealmsNotification {
        private static final String URL = "url";
        private static final String BUTTON_TEXT = "buttonText";
        private static final String MESSAGE = "message";
        private final String url;
        private final RealmsText buttonText;
        private final RealmsText message;
 
        private VisitUrl(RealmsNotification base, String url, RealmsText buttonText, RealmsText message) {
            super(base.uuid, base.dismissable, base.seen, base.type);
            this.url = url;
            this.buttonText = buttonText;
            this.message = message;
        }
 
        public static RealmsNotification.VisitUrl parse(RealmsNotification base, JsonObject jsonObject) {
            String url = JsonUtils.getRequiredString("url", jsonObject);
            RealmsText buttonText = JsonUtils.getRequired("buttonText", jsonObject, RealmsText::parse);
            RealmsText message = JsonUtils.getRequired("message", jsonObject, RealmsText::parse);
            return new RealmsNotification.VisitUrl(base, url, buttonText, message);
        }
 
        public Component getMessage() {
            return this.message.createComponent(Component.translatable("mco.notification.visitUrl.message.default"));
        }
 
        public Button buildOpenLinkButton(Screen parentScreen) {
            Component buttonLabel = this.buttonText.createComponent(RealmsNotification.BUTTON_TEXT_FALLBACK);
            return Button.builder(buttonLabel, ConfirmLinkScreen.confirmLink(parentScreen, this.url)).build();
        }
    }
}

引用的其他类

  • JsonUtils

    • 引用位置: 方法调用
    • 关联成员: JsonUtils.getBooleanOr(), JsonUtils.getOptional(), JsonUtils.getRequired(), JsonUtils.getRequiredString(), JsonUtils.getUuidOr()
  • Minecraft

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

    • 引用位置: 方法调用
    • 关联成员: Button.builder()
  • PopupScreen

    • 引用位置: 方法调用/构造调用
    • 关联成员: Builder(), PopupScreen.Builder()
  • ConfirmLinkScreen

    • 引用位置: 方法调用/构造调用
    • 关联成员: ConfirmLinkScreen(), ConfirmLinkScreen.confirmLink()
  • Component

    • 引用位置: 字段/方法调用
    • 关联成员: Component.translatable()
  • Identifier

    • 引用位置: 方法调用
    • 关联成员: Identifier.parse()
  • LenientJsonParser

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

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