package com.mrkayjaydee.playhours.events; import com.mrkayjaydee.playhours.PlayHoursMod; import net.minecraft.network.chat.Component; /** * Validates and truncates MOTD to comply with Minecraft protocol limits. * Enforces: 2 lines maximum, ~59 characters per line. */ public final class MOTDValidator { private MOTDValidator() {} private static final int MINECRAFT_LINE_LIMIT = 59; private static final int MINECRAFT_MAX_LINES = 2; /** * Validates and truncates MOTD to comply with Minecraft protocol limits. * Minecraft MOTD: 2 lines max, ~59 characters per line * * @param motd the MOTD component to validate * @return the validated/truncated MOTD component */ public static Component validateAndTruncate(Component motd) { String text = motd.getString(); String[] lines = text.split("\n", -1); // Limit to 2 lines maximum (Minecraft displays 2 lines in server list) if (lines.length > MINECRAFT_MAX_LINES) { PlayHoursMod.LOGGER.warn("MOTD has {} lines but Minecraft only displays {}. Truncating.", lines.length, MINECRAFT_MAX_LINES); lines = new String[]{lines[0], lines[1]}; } // Truncate each line to ~59 characters (Minecraft MOTD line width limit) StringBuilder validatedMotd = new StringBuilder(); for (int i = 0; i < lines.length; i++) { String line = lines[i]; if (line.length() > MINECRAFT_LINE_LIMIT) { PlayHoursMod.LOGGER.warn("MOTD line {} is {} chars but Minecraft limit is ~{}. Truncating.", i + 1, line.length(), MINECRAFT_LINE_LIMIT); line = line.substring(0, Math.min(line.length(), MINECRAFT_LINE_LIMIT)); } validatedMotd.append(line); if (i < lines.length - 1) { validatedMotd.append("\n"); } } return Component.literal(validatedMotd.toString()); } }