Added sponge support

This commit is contained in:
games647 2016-05-13 19:07:35 +02:00
parent 0cb3d3142f
commit ac63c37b46
4 changed files with 341 additions and 1 deletions

16
pom.xml
View File

@ -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>

View File

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

View File

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

View File

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