minecraft-src/com/mojang/realmsclient/dto/RealmsNotification.java
2025-07-04 01:41:11 +03:00

201 lines
7.6 KiB
Java

package com.mojang.realmsclient.dto;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.mojang.logging.LogUtils;
import com.mojang.realmsclient.util.JsonUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.function.Consumer;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.Util;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.components.PopupScreen;
import net.minecraft.client.gui.screens.ConfirmLinkScreen;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.CommonComponents;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
@Environment(EnvType.CLIENT)
public class RealmsNotification {
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";
static final Component BUTTON_TEXT_FALLBACK = Component.translatable("mco.notification.visitUrl.buttonText.default");
final UUID uuid;
final boolean dismissable;
final boolean seen;
final String type;
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> list = new ArrayList();
try {
for (JsonElement jsonElement : JsonParser.parseString(json).getAsJsonObject().get("notifications").getAsJsonArray()) {
list.add(parse(jsonElement.getAsJsonObject()));
}
} catch (Exception var5) {
LOGGER.error("Could not parse list of RealmsNotifications", (Throwable)var5);
}
return list;
}
private static RealmsNotification parse(JsonObject json) {
UUID uUID = JsonUtils.getUuidOr("notificationUuid", json, null);
if (uUID == null) {
throw new IllegalStateException("Missing required property notificationUuid");
} else {
boolean bl = JsonUtils.getBooleanOr("dismissable", json, true);
boolean bl2 = JsonUtils.getBooleanOr("seen", json, false);
String string = JsonUtils.getRequiredString("type", json);
RealmsNotification realmsNotification = new RealmsNotification(uUID, bl, bl2, string);
return (RealmsNotification)(switch (string) {
case "visitUrl" -> RealmsNotification.VisitUrl.parse(realmsNotification, json);
case "infoPopup" -> RealmsNotification.InfoPopup.parse(realmsNotification, json);
default -> realmsNotification;
});
}
}
@Environment(EnvType.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 ResourceLocation image;
@Nullable
private final RealmsNotification.UrlButton urlButton;
private InfoPopup(
RealmsNotification notification, RealmsText title, RealmsText message, ResourceLocation image, @Nullable RealmsNotification.UrlButton urlButton
) {
super(notification.uuid, notification.dismissable, notification.seen, notification.type);
this.title = title;
this.message = message;
this.image = image;
this.urlButton = urlButton;
}
public static RealmsNotification.InfoPopup parse(RealmsNotification notification, JsonObject json) {
RealmsText realmsText = JsonUtils.getRequired("title", json, RealmsText::parse);
RealmsText realmsText2 = JsonUtils.getRequired("message", json, RealmsText::parse);
ResourceLocation resourceLocation = ResourceLocation.parse(JsonUtils.getRequiredString("image", json));
RealmsNotification.UrlButton urlButton = JsonUtils.getOptional("urlButton", json, RealmsNotification.UrlButton::parse);
return new RealmsNotification.InfoPopup(notification, realmsText, realmsText2, resourceLocation, urlButton);
}
@Nullable
public PopupScreen buildScreen(Screen backgroundScreen, Consumer<UUID> uuidOutput) {
Component component = this.title.createComponent();
if (component == null) {
RealmsNotification.LOGGER.warn("Realms info popup had title with no available translation: {}", this.title);
return null;
} else {
PopupScreen.Builder builder = new PopupScreen.Builder(backgroundScreen, component)
.setImage(this.image)
.setMessage(this.message.createComponent(CommonComponents.EMPTY));
if (this.urlButton != null) {
builder.addButton(this.urlButton.urlText.createComponent(RealmsNotification.BUTTON_TEXT_FALLBACK), popupScreen -> {
Minecraft minecraft = Minecraft.getInstance();
minecraft.setScreen(new ConfirmLinkScreen(bl -> {
if (bl) {
Util.getPlatform().openUri(this.urlButton.url);
minecraft.setScreen(backgroundScreen);
} else {
minecraft.setScreen(popupScreen);
}
}, this.urlButton.url, true));
uuidOutput.accept(this.uuid());
});
}
builder.addButton(CommonComponents.GUI_OK, popupScreen -> {
popupScreen.onClose();
uuidOutput.accept(this.uuid());
});
builder.onClose(() -> uuidOutput.accept(this.uuid()));
return builder.build();
}
}
}
@Environment(EnvType.CLIENT)
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 json) {
String string = JsonUtils.getRequiredString("url", json);
RealmsText realmsText = JsonUtils.getRequired("urlText", json, RealmsText::parse);
return new RealmsNotification.UrlButton(string, realmsText);
}
}
@Environment(EnvType.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 notification, String url, RealmsText buttonText, RealmsText message) {
super(notification.uuid, notification.dismissable, notification.seen, notification.type);
this.url = url;
this.buttonText = buttonText;
this.message = message;
}
public static RealmsNotification.VisitUrl parse(RealmsNotification notification, JsonObject json) {
String string = JsonUtils.getRequiredString("url", json);
RealmsText realmsText = JsonUtils.getRequired("buttonText", json, RealmsText::parse);
RealmsText realmsText2 = JsonUtils.getRequired("message", json, RealmsText::parse);
return new RealmsNotification.VisitUrl(notification, string, realmsText, realmsText2);
}
public Component getMessage() {
return this.message.createComponent(Component.translatable("mco.notification.visitUrl.message.default"));
}
public Button buildOpenLinkButton(Screen lastScreen) {
Component component = this.buttonText.createComponent(RealmsNotification.BUTTON_TEXT_FALLBACK);
return Button.builder(component, ConfirmLinkScreen.confirmLink(lastScreen, this.url)).build();
}
}
}