Added sponge support
This commit is contained in:
parent
0cb3d3142f
commit
ac63c37b46
16
pom.xml
16
pom.xml
|
@ -8,7 +8,7 @@
|
|||
<packaging>jar</packaging>
|
||||
|
||||
<name>ColorConsole</name>
|
||||
<version>1.5</version>
|
||||
<version>1.6</version>
|
||||
<inceptionYear>2016</inceptionYear>
|
||||
<url>http://dev.bukkit.org/bukkit-plugins/colorconsole/</url>
|
||||
<description>
|
||||
|
@ -89,6 +89,12 @@
|
|||
<id>RYRED-REPO</id>
|
||||
<url>http://mvn.ryred.co/repository/snapshots/</url>
|
||||
</repository>
|
||||
|
||||
<!--Sponge-API-->
|
||||
<repository>
|
||||
<id>sponge-repo</id>
|
||||
<url>http://repo.spongepowered.org/maven</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<dependencies>
|
||||
|
@ -108,6 +114,14 @@
|
|||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.spongepowered</groupId>
|
||||
<artifactId>spongeapi</artifactId>
|
||||
<version>4.1.0-SNAPSHOT</version>
|
||||
<type>jar</type>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.fusesource.jansi</groupId>
|
||||
<artifactId>jansi</artifactId>
|
||||
|
|
|
@ -0,0 +1,81 @@
|
|||
package com.github.games647.colorconsole.sponge;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import ninja.leaping.configurate.objectmapping.Setting;
|
||||
|
||||
public class ColorConsoleConfig {
|
||||
|
||||
public ColorConsoleConfig() {
|
||||
this.pluginColors = Maps.newHashMap();
|
||||
this.pluginColors.put("ColorConsole", "yellow");
|
||||
|
||||
this.levelColors = Maps.newHashMap();
|
||||
this.levelColors.put("FATAL", "red blink");
|
||||
this.levelColors.put("ERROR", "red");
|
||||
this.levelColors.put("WARN", "yellow bold");
|
||||
this.levelColors.put("INFO", "default");
|
||||
this.levelColors.put("DEBUG", "green bold");
|
||||
this.levelColors.put("TRACE", "blue");
|
||||
}
|
||||
|
||||
@Setting(comment = "Should the plugin tag [PLUGIN_NAME] be highlighted")
|
||||
private boolean colorPluginTag = true;
|
||||
|
||||
@Setting(comment = "Should the log message be highlighted depending on the logging level")
|
||||
private boolean colorLoggingLevel = true;
|
||||
|
||||
@Setting(comment = "How the messages should be displayed\n"
|
||||
+ "\n"
|
||||
+ "Variables:\n"
|
||||
+ "%thread - Thread name\n"
|
||||
+ "%d{HH:mm:ss} - Timestamp\n"
|
||||
+ "%msg - log message\n"
|
||||
+ "%logger - logger name\n"
|
||||
+ "%n - new line\n"
|
||||
+ "\n"
|
||||
+ "These variables try to get the orgin. This is an expensive operation and may impact performance. "
|
||||
+ "Use with caution.\n"
|
||||
+ "\n"
|
||||
+ "%class{precision} - Class name\n"
|
||||
+ "%method - Method name\n"
|
||||
+ "%line - Line number\n"
|
||||
+ "\n"
|
||||
+ "For more details vist: https://logging.apache.org/log4j/2.x/manual/layouts.html#Patterns")
|
||||
private String logFormat = "[%d{HH:mm:ss}] [%level] [%logger]: %msg%n";
|
||||
|
||||
@Setting(comment = "Log Level Colors")
|
||||
private Map<String, String> levelColors;
|
||||
|
||||
@Setting(comment = "Plugin Colors")
|
||||
private String defaultPluginColor = "blue";
|
||||
|
||||
@Setting(comment = "Custom plugin colors")
|
||||
private Map<String, String> pluginColors;
|
||||
|
||||
public boolean isColorPluginTag() {
|
||||
return colorPluginTag;
|
||||
}
|
||||
|
||||
public boolean isColorLoggingLevel() {
|
||||
return colorLoggingLevel;
|
||||
}
|
||||
|
||||
public String getLogFormat() {
|
||||
return logFormat;
|
||||
}
|
||||
|
||||
public Map<String, String> getLevelColors() {
|
||||
return levelColors;
|
||||
}
|
||||
|
||||
public String getDefaultPluginColor() {
|
||||
return defaultPluginColor;
|
||||
}
|
||||
|
||||
public Map<String, String> getPluginColors() {
|
||||
return pluginColors;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,135 @@
|
|||
package com.github.games647.colorconsole.sponge;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.Serializable;
|
||||
import java.lang.reflect.Field;
|
||||
import java.nio.charset.Charset;
|
||||
|
||||
import ninja.leaping.configurate.commented.CommentedConfigurationNode;
|
||||
import ninja.leaping.configurate.hocon.HoconConfigurationLoader;
|
||||
import ninja.leaping.configurate.loader.ConfigurationLoader;
|
||||
import ninja.leaping.configurate.objectmapping.ObjectMapper;
|
||||
import ninja.leaping.configurate.objectmapping.ObjectMappingException;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.core.Appender;
|
||||
import org.apache.logging.log4j.core.Layout;
|
||||
import org.apache.logging.log4j.core.LoggerContext;
|
||||
import org.apache.logging.log4j.core.config.Configuration;
|
||||
import org.apache.logging.log4j.core.config.DefaultConfiguration;
|
||||
import org.apache.logging.log4j.core.layout.PatternLayout;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.spongepowered.api.config.DefaultConfig;
|
||||
import org.spongepowered.api.event.Listener;
|
||||
import org.spongepowered.api.event.game.state.GamePreInitializationEvent;
|
||||
import org.spongepowered.api.plugin.Plugin;
|
||||
|
||||
@Plugin(id = "colorconsole", name = "ColorConsole", version = "1.6"
|
||||
, url = "https://github.com/games647/ColorConsole/"
|
||||
, description = "Print colorful console messages depending on the logging level")
|
||||
public class ColorConsoleSponge {
|
||||
|
||||
private final Logger logger;
|
||||
|
||||
@Inject
|
||||
@DefaultConfig(sharedRoot = true)
|
||||
private File configFile;
|
||||
|
||||
@Inject
|
||||
@DefaultConfig(sharedRoot = true)
|
||||
private ConfigurationLoader<CommentedConfigurationNode> configManager;
|
||||
|
||||
private ObjectMapper<ColorConsoleConfig>.BoundInstance configMapper;
|
||||
private CommentedConfigurationNode rootNode;
|
||||
|
||||
@Inject
|
||||
public ColorConsoleSponge(Logger logger) {
|
||||
this.logger = logger;
|
||||
}
|
||||
|
||||
public ColorConsoleConfig getConfig() {
|
||||
return configMapper.getInstance();
|
||||
}
|
||||
|
||||
public CommentedConfigurationNode getConfigRaw() {
|
||||
return rootNode;
|
||||
}
|
||||
|
||||
@Listener //During this state, the plugin gets ready for initialization. Logger and config
|
||||
public void onPreInit(GamePreInitializationEvent preInitEvent) {
|
||||
logger.info("Setting up config");
|
||||
|
||||
rootNode = configManager.createEmptyNode();
|
||||
ConfigurationLoader<CommentedConfigurationNode> configLoader = HoconConfigurationLoader.builder()
|
||||
.setPath(configFile.toPath()).build();
|
||||
try {
|
||||
configMapper = ObjectMapper
|
||||
.forClass(ColorConsoleConfig.class).bindToNew();
|
||||
|
||||
rootNode = configManager.load();
|
||||
configMapper.populate(rootNode);
|
||||
|
||||
//add and save missing values
|
||||
configMapper.serialize(rootNode);
|
||||
configLoader.save(rootNode);
|
||||
} catch (IOException | ObjectMappingException ioEx) {
|
||||
logger.error("Cannot save default config", ioEx);
|
||||
return;
|
||||
}
|
||||
|
||||
installLogFormat();
|
||||
logger.warn("Test");
|
||||
}
|
||||
|
||||
private void installLogFormat() {
|
||||
Appender terminalAppender = getTerminalAppender();
|
||||
|
||||
String logFormat = configMapper.getInstance().getLogFormat();
|
||||
if (configMapper.getInstance().isColorLoggingLevel()) {
|
||||
logFormat = "%highlight{" + logFormat + "}{"
|
||||
+ "FATAL=" + configMapper.getInstance().getLevelColors().get("FATAL") + ", "
|
||||
+ "ERROR=" + configMapper.getInstance().getLevelColors().get("ERROR") + ", "
|
||||
+ "WARN=" + configMapper.getInstance().getLevelColors().get("WARN") + ", "
|
||||
+ "INFO=" + configMapper.getInstance().getLevelColors().get("INFO") + ", "
|
||||
+ "DEBUG=" + configMapper.getInstance().getLevelColors().get("DEBUG") + ", "
|
||||
+ "TRACE=" + configMapper.getInstance().getLevelColors().get("TRACE") + "}";
|
||||
}
|
||||
|
||||
PatternLayout layout = PatternLayout
|
||||
.createLayout(logFormat, new DefaultConfiguration(), null, Charset.defaultCharset().name(), "true");
|
||||
setLayout(layout);
|
||||
|
||||
if (configMapper.getInstance().isColorPluginTag()) {
|
||||
org.apache.logging.log4j.core.Logger rootLogger = ((org.apache.logging.log4j.core.Logger) LogManager
|
||||
.getRootLogger());
|
||||
|
||||
ColorPluginAppender pluginAppender = new ColorPluginAppender(terminalAppender, this);
|
||||
pluginAppender.start();
|
||||
|
||||
rootLogger.removeAppender(terminalAppender);
|
||||
rootLogger.addAppender(pluginAppender);
|
||||
}
|
||||
}
|
||||
|
||||
private void setLayout(Layout<? extends Serializable> layout) {
|
||||
Appender terminalAppender = getTerminalAppender();
|
||||
|
||||
try {
|
||||
Field field = terminalAppender.getClass().getSuperclass().getDeclaredField("layout");
|
||||
field.setAccessible(true);
|
||||
field.set(terminalAppender, layout);
|
||||
} catch (Exception ex) {
|
||||
logger.error("Failed to install log format", ex);
|
||||
}
|
||||
}
|
||||
|
||||
private Appender getTerminalAppender() {
|
||||
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
|
||||
Configuration conf = ctx.getConfiguration();
|
||||
|
||||
return conf.getAppenders().get("FmlConsole");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,110 @@
|
|||
package com.github.games647.colorconsole.sponge;
|
||||
|
||||
import org.apache.logging.log4j.core.Appender;
|
||||
import org.apache.logging.log4j.core.LogEvent;
|
||||
import org.apache.logging.log4j.core.appender.AbstractAppender;
|
||||
import org.apache.logging.log4j.core.impl.Log4jLogEvent;
|
||||
import org.fusesource.jansi.Ansi;
|
||||
import org.fusesource.jansi.Ansi.Attribute;
|
||||
import org.fusesource.jansi.AnsiRenderer;
|
||||
import org.fusesource.jansi.AnsiRenderer.Code;
|
||||
|
||||
public class ColorPluginAppender extends AbstractAppender {
|
||||
|
||||
private final Appender oldAppender;
|
||||
|
||||
private final ColorConsoleSponge plugin;
|
||||
|
||||
private final String reset = Ansi.ansi().a(Attribute.RESET).toString();
|
||||
private final String defaultPluginColor;
|
||||
|
||||
public ColorPluginAppender(Appender oldAppender, ColorConsoleSponge plugin) {
|
||||
super(oldAppender.getName(), null, oldAppender.getLayout());
|
||||
|
||||
this.plugin = plugin;
|
||||
|
||||
this.oldAppender = oldAppender;
|
||||
this.defaultPluginColor = format(plugin.getConfig().getDefaultPluginColor());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void append(LogEvent event) {
|
||||
if (oldAppender.isStarted()) {
|
||||
String loggerName = event.getLoggerName();
|
||||
String pluginColor = plugin.getConfig().getPluginColors().get(loggerName);
|
||||
if (pluginColor == null) {
|
||||
pluginColor = defaultPluginColor;
|
||||
} else {
|
||||
pluginColor = format(pluginColor);
|
||||
}
|
||||
|
||||
String levelColor = "";
|
||||
if (plugin.getConfig().isColorLoggingLevel()) {
|
||||
levelColor = format(plugin.getConfig().getLevelColors().get(event.getLevel().name()));
|
||||
}
|
||||
|
||||
String newLoggerName = pluginColor + loggerName + reset + levelColor;
|
||||
|
||||
LogEvent newEvent = new Log4jLogEvent(newLoggerName, event.getMarker(), event.getFQCN()
|
||||
, event.getLevel(), event.getMessage(), event.getThrown(), event.getContextMap()
|
||||
, event.getContextStack(), event.getThreadName(), event.getSource(), event.getMillis());
|
||||
oldAppender.append(newEvent);
|
||||
}
|
||||
}
|
||||
|
||||
public Appender getOldAppender() {
|
||||
return oldAppender;
|
||||
}
|
||||
|
||||
private String format(String pluginFormat) {
|
||||
String[] formatParts = pluginFormat.split(" ");
|
||||
Ansi ansi = Ansi.ansi();
|
||||
for (String format : formatParts) {
|
||||
for (Code ansiCode : AnsiRenderer.Code.values()) {
|
||||
if (ansiCode.name().equalsIgnoreCase(format)) {
|
||||
if (ansiCode.isAttribute()) {
|
||||
ansi.a(ansiCode.getAttribute());
|
||||
} else if (ansiCode.isBackground()) {
|
||||
ansi.bg(ansiCode.getColor());
|
||||
} else {
|
||||
ansi.fg(ansiCode.getColor());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ("blink".equalsIgnoreCase(format)) {
|
||||
ansi.a(Attribute.BLINK_SLOW);
|
||||
continue;
|
||||
}
|
||||
|
||||
if ("strikethrough".equalsIgnoreCase(format)) {
|
||||
ansi.a(Attribute.STRIKETHROUGH_ON);
|
||||
continue;
|
||||
}
|
||||
|
||||
if ("hidden".equalsIgnoreCase(format)) {
|
||||
ansi.a(Attribute.CONCEAL_OFF);
|
||||
continue;
|
||||
}
|
||||
|
||||
if ("dim".equalsIgnoreCase(format)) {
|
||||
ansi.a(Attribute.INTENSITY_FAINT);
|
||||
continue;
|
||||
}
|
||||
|
||||
if ("reverse".equalsIgnoreCase(format)) {
|
||||
ansi.a(Attribute.NEGATIVE_ON);
|
||||
continue;
|
||||
}
|
||||
|
||||
for (Ansi.Color color : Ansi.Color.values()) {
|
||||
if (format.equalsIgnoreCase(color.name())) {
|
||||
ansi.fg(color);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ansi.toString();
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue