mirror of
https://github.com/plan-player-analytics/Plan.git
synced 2024-12-21 05:50:18 +08:00
Random chat formatter work
This commit is contained in:
parent
a4553f5541
commit
8a73753944
@ -19,12 +19,15 @@ package com.djrapitops.plan.commands.subcommands;
|
|||||||
import com.djrapitops.plan.settings.locale.Locale;
|
import com.djrapitops.plan.settings.locale.Locale;
|
||||||
import com.djrapitops.plan.settings.locale.lang.CmdHelpLang;
|
import com.djrapitops.plan.settings.locale.lang.CmdHelpLang;
|
||||||
import com.djrapitops.plan.settings.locale.lang.CommandLang;
|
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.CommandNode;
|
||||||
import com.djrapitops.plugin.command.CommandType;
|
import com.djrapitops.plugin.command.CommandType;
|
||||||
import com.djrapitops.plugin.command.Sender;
|
import com.djrapitops.plugin.command.Sender;
|
||||||
import com.djrapitops.plugin.utilities.Verify;
|
import com.djrapitops.plugin.utilities.Verify;
|
||||||
|
import org.apache.commons.text.TextStringBuilder;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -51,6 +54,18 @@ public class DevCommand extends CommandNode {
|
|||||||
Verify.isTrue(args.length >= 1,
|
Verify.isTrue(args.length >= 1,
|
||||||
() -> new IllegalArgumentException(locale.getString(CommandLang.FAIL_REQ_ONE_ARG, Arrays.toString(this.getArguments()))));
|
() -> 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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user