Spaces:
Build error
Build error
File size: 9,247 Bytes
d46f4a3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 |
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 javax.annotation.Nullable;
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 net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import org.slf4j.Logger;
@OnlyIn(Dist.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 p_275316_, boolean p_275303_, boolean p_275497_, String p_275401_) {
this.uuid = p_275316_;
this.dismissable = p_275303_;
this.seen = p_275497_;
this.type = p_275401_;
}
public boolean seen() {
return this.seen;
}
public boolean dismissable() {
return this.dismissable;
}
public UUID uuid() {
return this.uuid;
}
public static List<RealmsNotification> parseList(String p_275464_) {
List<RealmsNotification> list = new ArrayList<>();
try {
for (JsonElement jsonelement : JsonParser.parseString(p_275464_).getAsJsonObject().get("notifications").getAsJsonArray()) {
list.add(parse(jsonelement.getAsJsonObject()));
}
} catch (Exception exception) {
LOGGER.error("Could not parse list of RealmsNotifications", (Throwable)exception);
}
return list;
}
private static RealmsNotification parse(JsonObject p_275549_) {
UUID uuid = JsonUtils.getUuidOr("notificationUuid", p_275549_, null);
if (uuid == null) {
throw new IllegalStateException("Missing required property notificationUuid");
} else {
boolean flag = JsonUtils.getBooleanOr("dismissable", p_275549_, true);
boolean flag1 = JsonUtils.getBooleanOr("seen", p_275549_, false);
String s = JsonUtils.getRequiredString("type", p_275549_);
RealmsNotification realmsnotification = new RealmsNotification(uuid, flag, flag1, s);
return (RealmsNotification)(switch (s) {
case "visitUrl" -> RealmsNotification.VisitUrl.parse(realmsnotification, p_275549_);
case "infoPopup" -> RealmsNotification.InfoPopup.parse(realmsnotification, p_275549_);
default -> realmsnotification;
});
}
}
@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 ResourceLocation image;
@Nullable
private final RealmsNotification.UrlButton urlButton;
private InfoPopup(
RealmsNotification p_311557_,
RealmsText p_310281_,
RealmsText p_312392_,
ResourceLocation p_312062_,
@Nullable RealmsNotification.UrlButton p_309599_
) {
super(p_311557_.uuid, p_311557_.dismissable, p_311557_.seen, p_311557_.type);
this.title = p_310281_;
this.message = p_312392_;
this.image = p_312062_;
this.urlButton = p_309599_;
}
public static RealmsNotification.InfoPopup parse(RealmsNotification p_311623_, JsonObject p_309477_) {
RealmsText realmstext = JsonUtils.getRequired("title", p_309477_, RealmsText::parse);
RealmsText realmstext1 = JsonUtils.getRequired("message", p_309477_, RealmsText::parse);
ResourceLocation resourcelocation = ResourceLocation.parse(JsonUtils.getRequiredString("image", p_309477_));
RealmsNotification.UrlButton realmsnotification$urlbutton = JsonUtils.getOptional("urlButton", p_309477_, RealmsNotification.UrlButton::parse);
return new RealmsNotification.InfoPopup(p_311623_, realmstext, realmstext1, resourcelocation, realmsnotification$urlbutton);
}
@Nullable
public PopupScreen buildScreen(Screen p_312232_, Consumer<UUID> p_310624_) {
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 popupscreen$builder = new PopupScreen.Builder(p_312232_, component)
.setImage(this.image)
.setMessage(this.message.createComponent(CommonComponents.EMPTY));
if (this.urlButton != null) {
popupscreen$builder.addButton(this.urlButton.urlText.createComponent(RealmsNotification.BUTTON_TEXT_FALLBACK), p_310971_ -> {
Minecraft minecraft = Minecraft.getInstance();
minecraft.setScreen(new ConfirmLinkScreen(p_311599_ -> {
if (p_311599_) {
Util.getPlatform().openUri(this.urlButton.url);
minecraft.setScreen(p_312232_);
} else {
minecraft.setScreen(p_310971_);
}
}, this.urlButton.url, true));
p_310624_.accept(this.uuid());
});
}
popupscreen$builder.addButton(CommonComponents.GUI_OK, p_311029_ -> {
p_311029_.onClose();
p_310624_.accept(this.uuid());
});
popupscreen$builder.onClose(() -> p_310624_.accept(this.uuid()));
return popupscreen$builder.build();
}
}
}
@OnlyIn(Dist.CLIENT)
static 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 p_310888_) {
String s = JsonUtils.getRequiredString("url", p_310888_);
RealmsText realmstext = JsonUtils.getRequired("urlText", p_310888_, RealmsText::parse);
return new RealmsNotification.UrlButton(s, realmstext);
}
}
@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 p_275564_, String p_275312_, RealmsText p_275433_, RealmsText p_275541_) {
super(p_275564_.uuid, p_275564_.dismissable, p_275564_.seen, p_275564_.type);
this.url = p_275312_;
this.buttonText = p_275433_;
this.message = p_275541_;
}
public static RealmsNotification.VisitUrl parse(RealmsNotification p_275651_, JsonObject p_275278_) {
String s = JsonUtils.getRequiredString("url", p_275278_);
RealmsText realmstext = JsonUtils.getRequired("buttonText", p_275278_, RealmsText::parse);
RealmsText realmstext1 = JsonUtils.getRequired("message", p_275278_, RealmsText::parse);
return new RealmsNotification.VisitUrl(p_275651_, s, realmstext, realmstext1);
}
public Component getMessage() {
return this.message.createComponent(Component.translatable("mco.notification.visitUrl.message.default"));
}
public Button buildOpenLinkButton(Screen p_275412_) {
Component component = this.buttonText.createComponent(RealmsNotification.BUTTON_TEXT_FALLBACK);
return Button.builder(component, ConfirmLinkScreen.confirmLink(p_275412_, this.url)).build();
}
}
} |