90 lines
3.6 KiB
Java
90 lines
3.6 KiB
Java
package net.essentialsx.discord.util;
|
|
|
|
import com.earth2me.essentials.utils.FormatUtil;
|
|
import com.google.common.base.Splitter;
|
|
import net.dv8tion.jda.api.entities.Message;
|
|
import net.essentialsx.discord.JDADiscordService;
|
|
import org.apache.logging.log4j.LogManager;
|
|
import org.apache.logging.log4j.core.LogEvent;
|
|
import org.apache.logging.log4j.core.Logger;
|
|
import org.apache.logging.log4j.core.appender.AbstractAppender;
|
|
import org.apache.logging.log4j.core.config.plugins.Plugin;
|
|
import org.bukkit.Bukkit;
|
|
|
|
import java.text.SimpleDateFormat;
|
|
import java.util.Date;
|
|
import java.util.concurrent.BlockingQueue;
|
|
import java.util.concurrent.LinkedBlockingQueue;
|
|
|
|
import static com.earth2me.essentials.I18n.tl;
|
|
|
|
@Plugin(name = "EssentialsX-ConsoleInjector", category = "Core", elementType = "appender", printObject = true)
|
|
public class ConsoleInjector extends AbstractAppender {
|
|
private final static java.util.logging.Logger logger = java.util.logging.Logger.getLogger("EssentialsDiscord");
|
|
|
|
private final JDADiscordService jda;
|
|
private final BlockingQueue<String> messageQueue = new LinkedBlockingQueue<>();
|
|
private final SimpleDateFormat timestampFormat = new SimpleDateFormat("HH:mm:ss");
|
|
private final int taskId;
|
|
|
|
public ConsoleInjector(JDADiscordService jda) {
|
|
super("EssentialsX-ConsoleInjector", null, null, false);
|
|
this.jda = jda;
|
|
((Logger) LogManager.getRootLogger()).addAppender(this);
|
|
taskId = Bukkit.getScheduler().runTaskTimerAsynchronously(jda.getPlugin(), () -> {
|
|
final StringBuilder buffer = new StringBuilder();
|
|
String curLine;
|
|
while ((curLine = messageQueue.peek()) != null) {
|
|
if (buffer.length() + curLine.length() > Message.MAX_CONTENT_LENGTH - 2) {
|
|
sendMessage(buffer.toString());
|
|
buffer.setLength(0);
|
|
continue;
|
|
}
|
|
buffer.append("\n").append(messageQueue.poll());
|
|
}
|
|
if (buffer.length() != 0) {
|
|
sendMessage(buffer.toString());
|
|
}
|
|
}, 20, 40).getTaskId();
|
|
}
|
|
|
|
private void sendMessage(String content) {
|
|
jda.getConsoleWebhook().send(jda.getWebhookMessage(content)).exceptionally(e -> {
|
|
logger.severe(tl("discordErrorWebhook"));
|
|
remove();
|
|
return null;
|
|
});
|
|
}
|
|
|
|
@Override
|
|
public void append(LogEvent event) {
|
|
if (event.getLevel().intLevel() > jda.getSettings().getConsoleLogLevel().intLevel()) {
|
|
return;
|
|
}
|
|
|
|
// Ansi strip is for normal colors, normal strip is for 1.16 hex color codes as they are not formatted correctly
|
|
String entry = FormatUtil.stripFormat(FormatUtil.stripAnsi(event.getMessage().getFormattedMessage())).trim();
|
|
if (entry.isEmpty()) {
|
|
return;
|
|
}
|
|
|
|
final String loggerName = event.getLoggerName();
|
|
if (!loggerName.isEmpty() && !loggerName.contains(".")) {
|
|
entry = "[" + event.getLoggerName() + "] " + entry;
|
|
}
|
|
|
|
//noinspection UnstableApiUsage
|
|
messageQueue.addAll(Splitter.fixedLength(Message.MAX_CONTENT_LENGTH).splitToList(
|
|
MessageUtil.formatMessage(jda.getSettings().getConsoleFormat(),
|
|
timestampFormat.format(new Date()),
|
|
event.getLevel().name(),
|
|
MessageUtil.sanitizeDiscordMarkdown(entry))));
|
|
}
|
|
|
|
public void remove() {
|
|
((Logger) LogManager.getRootLogger()).removeAppender(this);
|
|
Bukkit.getScheduler().cancelTask(taskId);
|
|
messageQueue.clear();
|
|
}
|
|
}
|