183 lines
		
	
	
	
		
			8.1 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			183 lines
		
	
	
	
		
			8.1 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package com.mojang.realmsclient.gui.screens.configuration;
 | |
| 
 | |
| import com.mojang.logging.LogUtils;
 | |
| import com.mojang.realmsclient.RealmsMainScreen;
 | |
| import com.mojang.realmsclient.client.RealmsClient;
 | |
| import com.mojang.realmsclient.dto.RealmsServer;
 | |
| import com.mojang.realmsclient.dto.Subscription;
 | |
| import com.mojang.realmsclient.exception.RealmsServiceException;
 | |
| import com.mojang.realmsclient.gui.screens.RealmsPopups;
 | |
| import com.mojang.realmsclient.util.RealmsUtil;
 | |
| import java.text.DateFormat;
 | |
| import java.util.Calendar;
 | |
| import java.util.GregorianCalendar;
 | |
| import java.util.TimeZone;
 | |
| import net.fabricmc.api.EnvType;
 | |
| import net.fabricmc.api.Environment;
 | |
| import net.minecraft.ChatFormatting;
 | |
| import net.minecraft.client.Minecraft;
 | |
| import net.minecraft.client.gui.Font;
 | |
| import net.minecraft.client.gui.components.Button;
 | |
| import net.minecraft.client.gui.components.FocusableTextWidget;
 | |
| import net.minecraft.client.gui.components.StringWidget;
 | |
| import net.minecraft.client.gui.components.tabs.GridLayoutTab;
 | |
| import net.minecraft.client.gui.layouts.GridLayout;
 | |
| import net.minecraft.client.gui.layouts.LayoutSettings;
 | |
| import net.minecraft.client.gui.layouts.SpacerElement;
 | |
| import net.minecraft.client.gui.screens.ConfirmLinkScreen;
 | |
| import net.minecraft.network.chat.CommonComponents;
 | |
| import net.minecraft.network.chat.Component;
 | |
| import net.minecraft.util.CommonLinks;
 | |
| import org.jetbrains.annotations.Nullable;
 | |
| import org.slf4j.Logger;
 | |
| 
 | |
| @Environment(EnvType.CLIENT)
 | |
| class RealmsSubscriptionTab extends GridLayoutTab implements RealmsConfigurationTab {
 | |
| 	private static final Logger LOGGER = LogUtils.getLogger();
 | |
| 	private static final int DEFAULT_COMPONENT_WIDTH = 200;
 | |
| 	private static final int EXTRA_SPACING = 2;
 | |
| 	private static final int DEFAULT_SPACING = 6;
 | |
| 	static final Component TITLE = Component.translatable("mco.configure.world.subscription.tab");
 | |
| 	private static final Component SUBSCRIPTION_START_LABEL = Component.translatable("mco.configure.world.subscription.start");
 | |
| 	private static final Component TIME_LEFT_LABEL = Component.translatable("mco.configure.world.subscription.timeleft");
 | |
| 	private static final Component DAYS_LEFT_LABEL = Component.translatable("mco.configure.world.subscription.recurring.daysleft");
 | |
| 	private static final Component SUBSCRIPTION_EXPIRED_TEXT = Component.translatable("mco.configure.world.subscription.expired").withStyle(ChatFormatting.GRAY);
 | |
| 	private static final Component SUBSCRIPTION_LESS_THAN_A_DAY_TEXT = Component.translatable("mco.configure.world.subscription.less_than_a_day")
 | |
| 		.withStyle(ChatFormatting.GRAY);
 | |
| 	private static final Component UNKNOWN = Component.translatable("mco.configure.world.subscription.unknown");
 | |
| 	private static final Component RECURRING_INFO = Component.translatable("mco.configure.world.subscription.recurring.info");
 | |
| 	private final RealmsConfigureWorldScreen configurationScreen;
 | |
| 	private final Minecraft minecraft;
 | |
| 	private final Button deleteButton;
 | |
| 	private final FocusableTextWidget subscriptionInfo;
 | |
| 	private final StringWidget startDateWidget;
 | |
| 	private final StringWidget daysLeftLabelWidget;
 | |
| 	private final StringWidget daysLeftWidget;
 | |
| 	private RealmsServer serverData;
 | |
| 	private Component daysLeft = UNKNOWN;
 | |
| 	private Component startDate = UNKNOWN;
 | |
| 	@Nullable
 | |
| 	private Subscription.SubscriptionType type;
 | |
| 
 | |
| 	RealmsSubscriptionTab(RealmsConfigureWorldScreen configurationScreen, Minecraft minecraft, RealmsServer serverData) {
 | |
| 		super(TITLE);
 | |
| 		this.configurationScreen = configurationScreen;
 | |
| 		this.minecraft = minecraft;
 | |
| 		this.serverData = serverData;
 | |
| 		GridLayout.RowHelper rowHelper = this.layout.rowSpacing(6).createRowHelper(1);
 | |
| 		Font font = configurationScreen.getFont();
 | |
| 		rowHelper.addChild(new StringWidget(200, 9, SUBSCRIPTION_START_LABEL, font).alignLeft());
 | |
| 		this.startDateWidget = rowHelper.addChild(new StringWidget(200, 9, this.startDate, font).alignLeft());
 | |
| 		rowHelper.addChild(SpacerElement.height(2));
 | |
| 		this.daysLeftLabelWidget = rowHelper.addChild(new StringWidget(200, 9, TIME_LEFT_LABEL, font).alignLeft());
 | |
| 		this.daysLeftWidget = rowHelper.addChild(new StringWidget(200, 9, this.daysLeft, font).alignLeft());
 | |
| 		rowHelper.addChild(SpacerElement.height(2));
 | |
| 		rowHelper.addChild(
 | |
| 			Button.builder(
 | |
| 					Component.translatable("mco.configure.world.subscription.extend"),
 | |
| 					button -> ConfirmLinkScreen.confirmLinkNow(
 | |
| 						configurationScreen, CommonLinks.extendRealms(serverData.remoteSubscriptionId, minecraft.getUser().getProfileId())
 | |
| 					)
 | |
| 				)
 | |
| 				.bounds(0, 0, 200, 20)
 | |
| 				.build()
 | |
| 		);
 | |
| 		rowHelper.addChild(SpacerElement.height(2));
 | |
| 		this.deleteButton = rowHelper.addChild(
 | |
| 			Button.builder(
 | |
| 					Component.translatable("mco.configure.world.delete.button"),
 | |
| 					button -> minecraft.setScreen(
 | |
| 						RealmsPopups.warningPopupScreen(
 | |
| 							configurationScreen, Component.translatable("mco.configure.world.delete.question.line1"), popupScreen -> this.deleteRealm()
 | |
| 						)
 | |
| 					)
 | |
| 				)
 | |
| 				.bounds(0, 0, 200, 20)
 | |
| 				.build()
 | |
| 		);
 | |
| 		rowHelper.addChild(SpacerElement.height(2));
 | |
| 		this.subscriptionInfo = rowHelper.addChild(
 | |
| 			new FocusableTextWidget(200, Component.empty(), font, true, true, 4), LayoutSettings.defaults().alignHorizontallyCenter()
 | |
| 		);
 | |
| 		this.subscriptionInfo.setMaxWidth(200);
 | |
| 		this.subscriptionInfo.setCentered(false);
 | |
| 		this.updateData(serverData);
 | |
| 	}
 | |
| 
 | |
| 	private void deleteRealm() {
 | |
| 		RealmsUtil.runAsync(
 | |
| 				realmsClient -> realmsClient.deleteRealm(this.serverData.id),
 | |
| 				RealmsUtil.openScreenAndLogOnFailure(this.configurationScreen::createErrorScreen, "Couldn't delete world")
 | |
| 			)
 | |
| 			.thenRunAsync(() -> this.minecraft.setScreen(this.configurationScreen.getLastScreen()), this.minecraft);
 | |
| 		this.minecraft.setScreen(this.configurationScreen);
 | |
| 	}
 | |
| 
 | |
| 	private void getSubscription(long serverId) {
 | |
| 		RealmsClient realmsClient = RealmsClient.getOrCreate();
 | |
| 
 | |
| 		try {
 | |
| 			Subscription subscription = realmsClient.subscriptionFor(serverId);
 | |
| 			this.daysLeft = this.daysLeftPresentation(subscription.daysLeft);
 | |
| 			this.startDate = localPresentation(subscription.startDate);
 | |
| 			this.type = subscription.type;
 | |
| 		} catch (RealmsServiceException var5) {
 | |
| 			LOGGER.error("Couldn't get subscription", (Throwable)var5);
 | |
| 			this.minecraft.setScreen(this.configurationScreen.createErrorScreen(var5));
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	private static Component localPresentation(long time) {
 | |
| 		Calendar calendar = new GregorianCalendar(TimeZone.getDefault());
 | |
| 		calendar.setTimeInMillis(time);
 | |
| 		return Component.literal(DateFormat.getDateTimeInstance().format(calendar.getTime())).withStyle(ChatFormatting.GRAY);
 | |
| 	}
 | |
| 
 | |
| 	private Component daysLeftPresentation(int daysLeft) {
 | |
| 		if (daysLeft < 0 && this.serverData.expired) {
 | |
| 			return SUBSCRIPTION_EXPIRED_TEXT;
 | |
| 		} else if (daysLeft <= 1) {
 | |
| 			return SUBSCRIPTION_LESS_THAN_A_DAY_TEXT;
 | |
| 		} else {
 | |
| 			int i = daysLeft / 30;
 | |
| 			int j = daysLeft % 30;
 | |
| 			boolean bl = i > 0;
 | |
| 			boolean bl2 = j > 0;
 | |
| 			if (bl && bl2) {
 | |
| 				return Component.translatable("mco.configure.world.subscription.remaining.months.days", i, j).withStyle(ChatFormatting.GRAY);
 | |
| 			} else if (bl) {
 | |
| 				return Component.translatable("mco.configure.world.subscription.remaining.months", i).withStyle(ChatFormatting.GRAY);
 | |
| 			} else {
 | |
| 				return bl2 ? Component.translatable("mco.configure.world.subscription.remaining.days", j).withStyle(ChatFormatting.GRAY) : Component.empty();
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public void updateData(RealmsServer server) {
 | |
| 		this.serverData = server;
 | |
| 		this.getSubscription(server.id);
 | |
| 		this.startDateWidget.setMessage(this.startDate);
 | |
| 		if (this.type == Subscription.SubscriptionType.NORMAL) {
 | |
| 			this.daysLeftLabelWidget.setMessage(TIME_LEFT_LABEL);
 | |
| 		} else if (this.type == Subscription.SubscriptionType.RECURRING) {
 | |
| 			this.daysLeftLabelWidget.setMessage(DAYS_LEFT_LABEL);
 | |
| 		}
 | |
| 
 | |
| 		this.daysLeftWidget.setMessage(this.daysLeft);
 | |
| 		boolean bl = RealmsMainScreen.isSnapshot() && server.parentWorldName != null;
 | |
| 		this.deleteButton.active = server.expired;
 | |
| 		if (bl) {
 | |
| 			this.subscriptionInfo.setMessage(Component.translatable("mco.snapshot.subscription.info", server.parentWorldName));
 | |
| 		} else {
 | |
| 			this.subscriptionInfo.setMessage(RECURRING_INFO);
 | |
| 		}
 | |
| 
 | |
| 		this.layout.arrangeElements();
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public Component getTabExtraNarration() {
 | |
| 		return CommonComponents.joinLines(TITLE, SUBSCRIPTION_START_LABEL, this.startDate, TIME_LEFT_LABEL, this.daysLeft);
 | |
| 	}
 | |
| }
 |