Archived
0

отказ от старого ChatStyle

This commit is contained in:
2018-06-12 19:50:29 +03:00
parent 5cc4a8d1a4
commit a83e8e7230
8 changed files with 106 additions and 100 deletions

View File

@@ -1,58 +0,0 @@
/*
* DmitriyMX <dimon550@gmail.com>
* 2018-04-30
*/
package mc.core.chat;
import java.util.regex.Pattern;
public enum ChatStyle {
BLACK ('0'),
DARK_BLUE ('1'),
DARK_GREEN('2'),
DARK_CYAN ('3'),
DARK_RED ('4'),
PURPLE ('5'),
GOLD ('6'),
GRAY ('7'),
DARK_GRAY ('8'),
BLUE ('9'),
GREEN ('a'),
CYAN ('b'),
RED ('c'),
PINK ('d'),
YELLOW('e'),
WHITE ('f');
public static final char SPECIAL_CHAR = '\u00a7'; // §
private static final String codes = "0123456789aAbBcCdDeEfF";
private static final Pattern EXCAPE_PATTERN = Pattern.compile(SPECIAL_CHAR + "[0-9a-f]", Pattern.CASE_INSENSITIVE);
public static String format(char colorChar, String message) {
char[] chars = message.toCharArray();
for (int i = 0; i < chars.length; i++) {
if (chars[i] == colorChar && codes.indexOf(chars[i+1]) > -1) {
chars[i] = SPECIAL_CHAR;
chars[i+1] = Character.toLowerCase(chars[i+1]);
i++;
}
}
return String.valueOf(chars);
}
public static String escapeStyle(String message) {
return EXCAPE_PATTERN.matcher(message).replaceAll("");
}
private char[] toString;
ChatStyle(char ch) {
toString = new char[]{SPECIAL_CHAR, ch };
}
@Override
public String toString() {
return String.valueOf(toString);
}
}

View File

@@ -6,6 +6,8 @@ package mc.core.chat;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import mc.core.player.Player; import mc.core.player.Player;
import mc.core.text.Text;
import mc.core.text.TextColor;
import org.slf4j.Marker; import org.slf4j.Marker;
import org.slf4j.helpers.BasicMarkerFactory; import org.slf4j.helpers.BasicMarkerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -20,7 +22,6 @@ import java.util.Map;
@Slf4j @Slf4j
public class CommanderChatProcessor extends SimpleChatProcessor { public class CommanderChatProcessor extends SimpleChatProcessor {
private static final Marker COMMAND_MARKER = new BasicMarkerFactory().getMarker("Command"); private static final Marker COMMAND_MARKER = new BasicMarkerFactory().getMarker("Command");
private static final String UNKNOW_COMMAND_MSG = ChatStyle.RED + "Unknown command \"" + ChatStyle.WHITE + "%s" + ChatStyle.RED + "\"";
@Autowired @Autowired
private ApplicationContext applicationContext; private ApplicationContext applicationContext;
private Map<String, CommandExecutor> commands = new HashMap<>(); private Map<String, CommandExecutor> commands = new HashMap<>();
@@ -72,7 +73,11 @@ public class CommanderChatProcessor extends SimpleChatProcessor {
String[] args = message.substring(idx).split(" "); String[] args = message.substring(idx).split(" ");
commands.get(command).execute(player, args); commands.get(command).execute(player, args);
} else { } else {
player.getChannel().sendChatMessage(String.format(UNKNOW_COMMAND_MSG, command)); Text msg = Text.builder(TextColor.RED, "Unknown command \"")
.append(Text.of(TextColor.WHITE, command))
.append(Text.of("\""))
.build();
player.getChannel().sendChatMessage(msg);
} }
} else { } else {
super.process(player, message); super.process(player, message);

View File

@@ -7,6 +7,8 @@ package mc.core.chat;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import mc.core.player.Player; import mc.core.player.Player;
import mc.core.player.PlayerManager; import mc.core.player.PlayerManager;
import mc.core.text.Text;
import mc.core.text.TextColor;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@Slf4j @Slf4j
@@ -16,11 +18,12 @@ public class SimpleChatProcessor extends ChatProcessor {
@Override @Override
public void process(Player player, String message) { public void process(Player player, String message) {
log.info(CHAT_MARKER, "<{}> {}", player.getName(), ChatStyle.escapeStyle(message)); log.info(CHAT_MARKER, "<{}> {}", player.getName(), message);
playerManager.getBroadcastChannel().sendChatMessage( playerManager.getBroadcastChannel().sendChatMessage(
ChatStyle.GOLD + player.getName() Text.builder(TextColor.GOLD, player.getName())
+ ChatStyle.GRAY + ": " .append(Text.of(TextColor.GRAY, ": "))
+ ChatStyle.WHITE + message .append(Text.of(TextColor.WHITE, message))
.build()
); );
} }
} }

View File

@@ -6,6 +6,7 @@ package mc.core.network;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import mc.core.player.Player; import mc.core.player.Player;
import mc.core.text.Text;
import java.util.stream.Stream; import java.util.stream.Stream;
@@ -24,8 +25,8 @@ public class BroadcastNetChannel implements NetChannel {
} }
@Override @Override
public void sendChatMessage(final String message) { public void sendChatMessage(final Text text) {
playerStream.forEach(player -> player.getChannel().sendChatMessage(message)); playerStream.forEach(player -> player.getChannel().sendChatMessage(text));
} }
@Override @Override

View File

@@ -4,10 +4,12 @@
*/ */
package mc.core.network; package mc.core.network;
import mc.core.text.Text;
public interface NetChannel { public interface NetChannel {
void sendKeepAlive(); void sendKeepAlive();
void sendTimeUpdate(long value); void sendTimeUpdate(long value);
void sendChatMessage(String message); void sendChatMessage(Text text);
void writeAndFlush(SCPacket pkt); void writeAndFlush(SCPacket pkt);
void write(SCPacket pkt); void write(SCPacket pkt);

View File

@@ -5,14 +5,19 @@
package mc.core.text; package mc.core.text;
import lombok.Getter; import lombok.Getter;
import lombok.Setter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.StringJoiner;
@Getter @Getter
public class Text { public class Text {
@Setter
private String string; private String string;
@Setter
private TextColor color; private TextColor color;
@Setter
private TextStyle style; private TextStyle style;
private List<Text> childs; private List<Text> childs;
@@ -26,15 +31,27 @@ public class Text {
return of(string, null, null); return of(string, null, null);
} }
public static Text of(String string, TextColor color) { public static Text of(Object... objects) {
return of(string, color, null); Text text = new Text();
for(Object obj : objects) {
if (obj instanceof String) {
if (text.string == null) {
text.string = (String) obj;
} else {
text.string = text.string.concat((String) obj);
}
} else if (obj instanceof TextStyle) {
if (text.style == null) {
text.style = (TextStyle) obj;
} else {
text.style.concat((TextStyle) obj);
}
} else if (obj instanceof TextColor) {
text.color = (TextColor) obj;
}
} }
public static Text of(String string, TextColor color, TextStyle style) {
Text text = new Text();
text.string = string;
text.color = color;
text.style = style;
return text; return text;
} }
@@ -46,46 +63,73 @@ public class Text {
return new Builder(string); return new Builder(string);
} }
public static Builder builder(Object... objects) {
return new Builder(objects);
}
public static class Builder { public static class Builder {
private Text currentText; private Text text;
private Builder() { private Builder() {
this.currentText = new Text(); this.text = new Text();
} }
private Builder(String string) { private Builder(String string) {
this.currentText = new Text(); this.text = new Text();
this.currentText.string = string; this.text.string = string;
} }
private Builder(Text text) { private Builder(Object... objects) {
this.currentText = text; this.text = Text.of(objects);
} }
public Builder color(TextColor color) { public Builder color(TextColor color) {
this.currentText.color = color; this.text.color = color;
return this; return this;
} }
public Builder style(TextStyle style) { public Builder style(TextStyle style) {
if (this.currentText.style == null) { if (this.text.style == null) {
this.currentText.style = new TextStyle(null,null,null,null,null); this.text.style = new TextStyle(null,null,null,null,null);
} }
this.currentText.style.concat(style); this.text.style.concat(style);
return this; return this;
} }
public Builder append(Text text) { public Builder append(Text text) {
if (this.currentText.childs == null) { if (this.text.childs == null) {
this.currentText.childs = new ArrayList<>(); this.text.childs = new ArrayList<>();
} }
this.currentText.childs.add(text); this.text.childs.add(text);
return this; return this;
} }
public Text build() { public Text build() {
return this.currentText; return this.text;
}
}
public boolean isEmpty() {
boolean result = string.isEmpty();
if (childs != null) {
for(Text child : childs) {
result = child.isEmpty();
}
}
return result;
}
public String toPlainText() {
if (childs != null) {
final StringJoiner sj = new StringJoiner("");
sj.add(string);
childs.forEach(child -> sj.add(child.toPlainText()));
return sj.toString();
} else {
return string;
} }
} }
} }

View File

@@ -5,10 +5,11 @@
package mc.commands; package mc.commands;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import mc.core.chat.ChatStyle;
import mc.core.chat.CommandExecutor; import mc.core.chat.CommandExecutor;
import mc.core.chat.CommanderChatProcessor; import mc.core.chat.CommanderChatProcessor;
import mc.core.player.Player; import mc.core.player.Player;
import mc.core.text.Text;
import mc.core.text.TextColor;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
@@ -46,17 +47,23 @@ public class HelpCommand implements CommandExecutor {
commanderChatProcessor = applicationContext.getBean(CommanderChatProcessor.class); commanderChatProcessor = applicationContext.getBean(CommanderChatProcessor.class);
if (commanderChatProcessor == null) { if (commanderChatProcessor == null) {
log.error("Error get bean of type \"CommanderChatProcessor\". WTF?!"); log.error("Error get bean of type \"CommanderChatProcessor\". WTF?!");
sender.getChannel().sendChatMessage(ChatStyle.RED + "!!-Server error-!!"); sender.getChannel().sendChatMessage(Text.of(TextColor.RED, "!!-Server error-!!"));
return; return;
} }
} }
final String messageFormat = ChatStyle.RED + "%s " + ChatStyle.GRAY + "- " + ChatStyle.WHITE + "%s"; Text commandNameText = Text.of(TextColor.RED);
Text descriptionText = Text.of(TextColor.WHITE);
Text messageText = Text.builder()
.append(commandNameText)
.append(Text.of(TextColor.GRAY, " - "))
.append(descriptionText)
.build();
commanderChatProcessor.getAllCommands().forEach(commandExecutor -> { commanderChatProcessor.getAllCommands().forEach(commandExecutor -> {
sender.getChannel().sendChatMessage(String.format(messageFormat, commandNameText.setString(commandExecutor.getUsage().orElse(commandExecutor.getName()));
commandExecutor.getUsage().orElse(commandExecutor.getName()), descriptionText.setString(commandExecutor.getDescription());
commandExecutor.getDescription() sender.getChannel().sendChatMessage(messageText);
));
}); });
} }
} }

View File

@@ -4,10 +4,11 @@
*/ */
package mc.commands; package mc.commands;
import mc.core.chat.ChatStyle;
import mc.core.chat.CommandExecutor; import mc.core.chat.CommandExecutor;
import mc.core.player.Player; import mc.core.player.Player;
import mc.core.player.PlayerManager; import mc.core.player.PlayerManager;
import mc.core.text.Text;
import mc.core.text.TextColor;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import java.util.Optional; import java.util.Optional;
@@ -42,8 +43,9 @@ public class ListCommand implements CommandExecutor {
StringJoiner sj = new StringJoiner(", "); StringJoiner sj = new StringJoiner(", ");
playerManager.getPlayers().forEach(pl -> sj.add(pl.getName())); playerManager.getPlayers().forEach(pl -> sj.add(pl.getName()));
sender.getChannel().sendChatMessage( Text message = Text.builder(TextColor.GREEN, "Online(" + playerManager.getCountOnlinePlayers() + "): ")
ChatStyle.GREEN + "Online(" + playerManager.getCountOnlinePlayers() + "): " .append(Text.of(TextColor.DARK_GREEN, sj.toString()))
+ ChatStyle.DARK_GREEN + sj.toString()); .build();
sender.getChannel().sendChatMessage(message);
} }
} }