70 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.client.multiplayer.chat;
 | |
| 
 | |
| import com.mojang.serialization.Codec;
 | |
| import java.time.Instant;
 | |
| import java.util.Optional;
 | |
| import net.fabricmc.api.EnvType;
 | |
| import net.fabricmc.api.Environment;
 | |
| import net.minecraft.client.GuiMessageTag;
 | |
| import net.minecraft.network.chat.Component;
 | |
| import net.minecraft.network.chat.PlayerChatMessage;
 | |
| import net.minecraft.network.chat.Style;
 | |
| import net.minecraft.util.StringRepresentable;
 | |
| import org.jetbrains.annotations.Nullable;
 | |
| 
 | |
| @Environment(EnvType.CLIENT)
 | |
| public enum ChatTrustLevel implements StringRepresentable {
 | |
| 	SECURE("secure"),
 | |
| 	MODIFIED("modified"),
 | |
| 	NOT_SECURE("not_secure");
 | |
| 
 | |
| 	public static final Codec<ChatTrustLevel> CODEC = StringRepresentable.fromEnum(ChatTrustLevel::values);
 | |
| 	private final String serializedName;
 | |
| 
 | |
| 	private ChatTrustLevel(final String serializedName) {
 | |
| 		this.serializedName = serializedName;
 | |
| 	}
 | |
| 
 | |
| 	public static ChatTrustLevel evaluate(PlayerChatMessage chatMessage, Component decoratedServerContent, Instant timestamp) {
 | |
| 		if (!chatMessage.hasSignature() || chatMessage.hasExpiredClient(timestamp)) {
 | |
| 			return NOT_SECURE;
 | |
| 		} else {
 | |
| 			return isModified(chatMessage, decoratedServerContent) ? MODIFIED : SECURE;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	private static boolean isModified(PlayerChatMessage chatMessage, Component decoratedServerContent) {
 | |
| 		if (!decoratedServerContent.getString().contains(chatMessage.signedContent())) {
 | |
| 			return true;
 | |
| 		} else {
 | |
| 			Component component = chatMessage.unsignedContent();
 | |
| 			return component == null ? false : containsModifiedStyle(component);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	private static boolean containsModifiedStyle(Component chatMessage) {
 | |
| 		return (Boolean)chatMessage.visit((style, string) -> isModifiedStyle(style) ? Optional.of(true) : Optional.empty(), Style.EMPTY).orElse(false);
 | |
| 	}
 | |
| 
 | |
| 	private static boolean isModifiedStyle(Style style) {
 | |
| 		return !style.getFont().equals(Style.DEFAULT_FONT);
 | |
| 	}
 | |
| 
 | |
| 	public boolean isNotSecure() {
 | |
| 		return this == NOT_SECURE;
 | |
| 	}
 | |
| 
 | |
| 	@Nullable
 | |
| 	public GuiMessageTag createTag(PlayerChatMessage chatMessage) {
 | |
| 		return switch (this) {
 | |
| 			case MODIFIED -> GuiMessageTag.chatModified(chatMessage.signedContent());
 | |
| 			case NOT_SECURE -> GuiMessageTag.chatNotSecure();
 | |
| 			default -> null;
 | |
| 		};
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public String getSerializedName() {
 | |
| 		return this.serializedName;
 | |
| 	}
 | |
| }
 |