From 8a73753944ef55961fa55e56f18dc20c0e8503fe Mon Sep 17 00:00:00 2001 From: Risto Lahtela <24460436+Rsl1122@users.noreply.github.com> Date: Tue, 5 May 2020 16:13:15 +0300 Subject: [PATCH] Random chat formatter work --- .../plan/commands/subcommands/DevCommand.java | 17 ++- .../plan/utilities/chat/ChatFormatter.java | 76 ++++++++++ .../plan/utilities/chat/DefaultFontInfo.java | 134 ++++++++++++++++++ 3 files changed, 226 insertions(+), 1 deletion(-) create mode 100644 Plan/common/src/main/java/com/djrapitops/plan/utilities/chat/ChatFormatter.java create mode 100644 Plan/common/src/main/java/com/djrapitops/plan/utilities/chat/DefaultFontInfo.java diff --git a/Plan/common/src/main/java/com/djrapitops/plan/commands/subcommands/DevCommand.java b/Plan/common/src/main/java/com/djrapitops/plan/commands/subcommands/DevCommand.java index 5740279c2..751f418c2 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/commands/subcommands/DevCommand.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/commands/subcommands/DevCommand.java @@ -19,12 +19,15 @@ package com.djrapitops.plan.commands.subcommands; import com.djrapitops.plan.settings.locale.Locale; import com.djrapitops.plan.settings.locale.lang.CmdHelpLang; import com.djrapitops.plan.settings.locale.lang.CommandLang; +import com.djrapitops.plan.utilities.chat.ChatFormatter; import com.djrapitops.plugin.command.CommandNode; import com.djrapitops.plugin.command.CommandType; import com.djrapitops.plugin.command.Sender; import com.djrapitops.plugin.utilities.Verify; +import org.apache.commons.text.TextStringBuilder; import javax.inject.Inject; +import java.lang.reflect.Method; import java.util.Arrays; /** @@ -51,6 +54,18 @@ public class DevCommand extends CommandNode { Verify.isTrue(args.length >= 1, () -> new IllegalArgumentException(locale.getString(CommandLang.FAIL_REQ_ONE_ARG, Arrays.toString(this.getArguments())))); - sender.sendMessage("No features currently implemented in the command."); + Object actual = sender.getSender(); + + try { + Method method = actual.getClass().getMethod("sendMessage", String.class); + int indent = 8; + String msg = new TextStringBuilder().appendWithSeparators(args, " ").toString(); + method.invoke(actual, "With indent: " + indent); + method.invoke(actual, ChatFormatter.indent(indent, msg)); + method.invoke(actual, "Centered:"); + method.invoke(actual, ChatFormatter.center(msg)); + } catch (Exception e) { + e.printStackTrace(); + } } } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/utilities/chat/ChatFormatter.java b/Plan/common/src/main/java/com/djrapitops/plan/utilities/chat/ChatFormatter.java new file mode 100644 index 000000000..7bac3c230 --- /dev/null +++ b/Plan/common/src/main/java/com/djrapitops/plan/utilities/chat/ChatFormatter.java @@ -0,0 +1,76 @@ +package com.djrapitops.plan.utilities.chat; + +import org.apache.commons.lang3.StringUtils; + +/** + * Formats chat messages in different ways. + *

+ * Original code: https://hastebin.com/uziyajirag.avrasm + */ +public class ChatFormatter { + private final static int CENTER_PX = 154; + private final static int MAX_PX = 250; + + public static String indent(int spaces, String message) { + StringBuilder returnMessage = new StringBuilder(); + + String padding = StringUtils.leftPad("", spaces); + int paddingWidth = getPxMessageWidth(padding); + String[] parts = StringUtils.split(message, ' '); + + int lineWidth = paddingWidth; + StringBuilder line = new StringBuilder(padding); + + for (String part : parts) { + int width = getPxMessageWidth(part) + DefaultFontInfo.SPACE.getLength() + 1; + line.append(part).append(' '); + lineWidth += width; + if (lineWidth > MAX_PX) { + String finishedLine = StringUtils.chop(line.toString()); + returnMessage.append(finishedLine).append("\n"); + lineWidth = paddingWidth; + line = new StringBuilder(padding); + } + } + returnMessage.append(line.toString().trim()); + return returnMessage.toString(); + } + + public static String center(String message) { + if (message == null) return null; + if (message.isEmpty()) return ""; + + int messagePxWidth = getPxMessageWidth(message); + + int halfOfWidth = messagePxWidth / 2; + int toCompensate = CENTER_PX - halfOfWidth; + int spaceLength = DefaultFontInfo.SPACE.getLength() + 1; + int compensated = 0; + StringBuilder sb = new StringBuilder(); + while (compensated < toCompensate) { + sb.append(" "); + compensated += spaceLength; + } + return sb.toString() + message; + } + + public static int getPxMessageWidth(String message) { + int messagePxSize = 0; + boolean wasColorChar = false; + boolean isBold = false; + + for (char c : message.toCharArray()) { + if (c == '\u00a7') { // ยง + wasColorChar = true; + } else if (wasColorChar) { + wasColorChar = false; + isBold = c == 'l' || c == 'L'; + } else { + DefaultFontInfo dFI = DefaultFontInfo.getDefaultFontInfo(c); + messagePxSize += isBold ? dFI.getBoldLength() : dFI.getLength(); + messagePxSize++; + } + } + return messagePxSize; + } +} diff --git a/Plan/common/src/main/java/com/djrapitops/plan/utilities/chat/DefaultFontInfo.java b/Plan/common/src/main/java/com/djrapitops/plan/utilities/chat/DefaultFontInfo.java new file mode 100644 index 000000000..daf7b32c0 --- /dev/null +++ b/Plan/common/src/main/java/com/djrapitops/plan/utilities/chat/DefaultFontInfo.java @@ -0,0 +1,134 @@ +package com.djrapitops.plan.utilities.chat; + +/** + * Contains width of characters in the chat with default font. + *

+ * Original code form https://www.spigotmc.org/threads/free-code-sending-perfectly-centered-chat-message.95872/page-2 + */ +public enum DefaultFontInfo { + + A('A', 5), + a('a', 5), + B('B', 5), + b('b', 5), + C('C', 5), + c('c', 5), + D('D', 5), + d('d', 5), + E('E', 5), + e('e', 5), + F('F', 5), + f('f', 4), + G('G', 5), + g('g', 5), + H('H', 5), + h('h', 5), + I('I', 3), + i('i', 1), + J('J', 5), + j('j', 5), + K('K', 5), + k('k', 4), + L('L', 5), + l('l', 1), + M('M', 5), + m('m', 5), + N('N', 5), + n('n', 5), + O('O', 5), + o('o', 5), + P('P', 5), + p('p', 5), + Q('Q', 5), + q('q', 5), + R('R', 5), + r('r', 5), + S('S', 5), + s('s', 5), + T('T', 5), + t('t', 4), + U('U', 5), + u('u', 5), + V('V', 5), + v('v', 5), + W('W', 5), + w('w', 5), + X('X', 5), + x('x', 5), + Y('Y', 5), + y('y', 5), + Z('Z', 5), + z('z', 5), + NUM_1('1', 5), + NUM_2('2', 5), + NUM_3('3', 5), + NUM_4('4', 5), + NUM_5('5', 5), + NUM_6('6', 5), + NUM_7('7', 5), + NUM_8('8', 5), + NUM_9('9', 5), + NUM_0('0', 5), + EXCLAMATION_POINT('!', 1), + AT_SYMBOL('@', 6), + NUM_SIGN('#', 5), + DOLLAR_SIGN('$', 5), + PERCENT('%', 5), + UP_ARROW('^', 5), + AMPERSAND('&', 5), + ASTERISK('*', 5), + LEFT_PARENTHESIS('(', 4), + RIGHT_PERENTHESIS(')', 4), + MINUS('-', 5), + UNDERSCORE('_', 5), + PLUS_SIGN('+', 5), + EQUALS_SIGN('=', 5), + LEFT_CURL_BRACE('{', 4), + RIGHT_CURL_BRACE('}', 4), + LEFT_BRACKET('[', 3), + RIGHT_BRACKET(']', 3), + COLON(':', 1), + SEMI_COLON(';', 1), + DOUBLE_QUOTE('"', 3), + SINGLE_QUOTE('\'', 1), + LEFT_ARROW('<', 4), + RIGHT_ARROW('>', 4), + QUESTION_MARK('?', 5), + SLASH('/', 5), + BACK_SLASH('\\', 5), + LINE('|', 1), + TILDE('~', 5), + TICK('`', 2), + PERIOD('.', 1), + COMMA(',', 1), + SPACE(' ', 3), + DEFAULT('a', 4); + + private char character; + private int length; + + DefaultFontInfo(char character, int length) { + this.character = character; + this.length = length; + } + + public static DefaultFontInfo getDefaultFontInfo(char c) { + for (DefaultFontInfo dFI : DefaultFontInfo.values()) { + if (dFI.getCharacter() == c) return dFI; + } + return DefaultFontInfo.DEFAULT; + } + + public char getCharacter() { + return this.character; + } + + public int getLength() { + return this.length; + } + + public int getBoldLength() { + if (this == DefaultFontInfo.SPACE) return this.getLength(); + return this.length + 1; + } +}