2021-07-01 15:43:35 +02:00
package net.essentialsx.discord.util ;
import com.earth2me.essentials.utils.FormatUtil ;
import com.google.common.base.Splitter ;
import net.dv8tion.jda.api.entities.Message ;
2021-07-06 21:32:22 +02:00
import net.dv8tion.jda.api.utils.TimeFormat ;
2022-06-27 20:54:10 +02:00
import net.essentialsx.discord.EssentialsDiscord ;
2021-07-01 15:43:35 +02:00
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 ;
2021-07-06 21:32:22 +02:00
import java.time.Instant ;
2021-07-01 15:43:35 +02:00
import java.util.concurrent.BlockingQueue ;
import java.util.concurrent.LinkedBlockingQueue ;
2021-10-24 18:12:42 +02:00
import java.util.regex.Pattern ;
2021-07-01 15:43:35 +02:00
import static com.earth2me.essentials.I18n.tl ;
@Plugin ( name = " EssentialsX-ConsoleInjector " , category = " Core " , elementType = " appender " , printObject = true )
public class ConsoleInjector extends AbstractAppender {
2022-06-27 20:54:10 +02:00
private final static java . util . logging . Logger logger = EssentialsDiscord . getWrappedLogger ( ) ;
2021-07-01 15:43:35 +02:00
private final JDADiscordService jda ;
private final BlockingQueue < String > messageQueue = new LinkedBlockingQueue < > ( ) ;
private final int taskId ;
2022-11-12 00:28:55 +01:00
private boolean removed = false ;
2021-07-01 15:43:35 +02:00
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 ;
}
2022-06-15 17:31:42 +02:00
// Ansi strip is for normal colors, normal strip is for 1.16 hex color codes as they are not formatted correctly, adventure strip is for magic color char strip
String entry = FormatUtil . stripPaper ( FormatUtil . stripFormat ( FormatUtil . stripAnsi ( event . getMessage ( ) . getFormattedMessage ( ) ) ) ) . trim ( ) ;
2021-07-01 15:43:35 +02:00
if ( entry . isEmpty ( ) ) {
return ;
}
2021-10-24 18:12:42 +02:00
if ( ! jda . getSettings ( ) . getConsoleFilters ( ) . isEmpty ( ) ) {
for ( final Pattern pattern : jda . getSettings ( ) . getConsoleFilters ( ) ) {
if ( pattern . matcher ( entry ) . find ( ) ) {
return ;
}
}
}
2021-07-01 15:43:35 +02:00
final String loggerName = event . getLoggerName ( ) ;
if ( ! loggerName . isEmpty ( ) & & ! loggerName . contains ( " . " ) ) {
entry = " [ " + event . getLoggerName ( ) + " ] " + entry ;
}
2022-08-21 22:44:24 +02:00
messageQueue . addAll ( Splitter . fixedLength ( Message . MAX_CONTENT_LENGTH - 50 ) . splitToList (
2021-07-01 15:43:35 +02:00
MessageUtil . formatMessage ( jda . getSettings ( ) . getConsoleFormat ( ) ,
2021-07-06 21:32:22 +02:00
TimeFormat . TIME_LONG . format ( Instant . now ( ) ) ,
2021-07-01 15:43:35 +02:00
event . getLevel ( ) . name ( ) ,
MessageUtil . sanitizeDiscordMarkdown ( entry ) ) ) ) ;
}
public void remove ( ) {
( ( Logger ) LogManager . getRootLogger ( ) ) . removeAppender ( this ) ;
Bukkit . getScheduler ( ) . cancelTask ( taskId ) ;
messageQueue . clear ( ) ;
2022-08-22 19:56:53 +02:00
if ( jda . getConsoleWebhook ( ) ! = null & & ! jda . getConsoleWebhook ( ) . isShutdown ( ) ) {
jda . getConsoleWebhook ( ) . close ( ) ;
}
2022-11-12 00:28:55 +01:00
removed = true ;
}
public boolean isRemoved ( ) {
return removed ;
2021-07-01 15:43:35 +02:00
}
}