Random chat formatter work

This commit is contained in:
Risto Lahtela 2020-05-05 16:13:15 +03:00
parent a4553f5541
commit 8a73753944
3 changed files with 226 additions and 1 deletions

View File

@ -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();
}
}
}

View File

@ -0,0 +1,76 @@
package com.djrapitops.plan.utilities.chat;
import org.apache.commons.lang3.StringUtils;
/**
* Formats chat messages in different ways.
* <p>
* 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;
}
}

View File

@ -0,0 +1,134 @@
package com.djrapitops.plan.utilities.chat;
/**
* Contains width of characters in the chat with default font.
* <p>
* 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;
}
}