mirror of
https://github.com/TotalFreedomMC/BukkitTelnet.git
synced 2024-06-16 16:51:22 +00:00
The LogAppender should be a single instance only. Fixes #3
This commit is contained in:
parent
57890b0c76
commit
4407c6ab95
|
@ -1,5 +1,7 @@
|
||||||
package me.StevenLawson.BukkitTelnet;
|
package me.StevenLawson.BukkitTelnet;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.core.Logger;
|
||||||
import org.bukkit.Server;
|
import org.bukkit.Server;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
|
@ -23,6 +25,8 @@ public class BukkitTelnet extends JavaPlugin
|
||||||
{
|
{
|
||||||
TelnetConfig.getInstance().loadConfig();
|
TelnetConfig.getInstance().loadConfig();
|
||||||
|
|
||||||
|
((Logger) LogManager.getRootLogger()).addAppender(TelnetLogAppender.getInstance());
|
||||||
|
|
||||||
TelnetServer.getInstance().startServer();
|
TelnetServer.getInstance().startServer();
|
||||||
|
|
||||||
TelnetLogger.info(plugin.getName() + " v" + plugin.getDescription().getVersion() + " enabled");
|
TelnetLogger.info(plugin.getName() + " v" + plugin.getDescription().getVersion() + " enabled");
|
||||||
|
|
|
@ -14,11 +14,12 @@ import java.util.logging.Logger;
|
||||||
public class SocketListener extends Thread
|
public class SocketListener extends Thread
|
||||||
{
|
{
|
||||||
private final ServerSocket serverSocket;
|
private final ServerSocket serverSocket;
|
||||||
private final List<ClientSession> clientSessions = new ArrayList<ClientSession>();
|
private final List<ClientSession> clientSessions;
|
||||||
|
|
||||||
public SocketListener(ServerSocket serverSocket)
|
public SocketListener(ServerSocket serverSocket)
|
||||||
{
|
{
|
||||||
this.serverSocket = serverSocket;
|
this.serverSocket = serverSocket;
|
||||||
|
this.clientSessions = new ArrayList<ClientSession>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -48,9 +49,14 @@ public class SocketListener extends Thread
|
||||||
private void removeDisconnected()
|
private void removeDisconnected()
|
||||||
{
|
{
|
||||||
final Iterator<ClientSession> it = clientSessions.iterator();
|
final Iterator<ClientSession> it = clientSessions.iterator();
|
||||||
|
|
||||||
while (it.hasNext())
|
while (it.hasNext())
|
||||||
{
|
{
|
||||||
if (!it.next().syncIsConnected())
|
final ClientSession session = it.next();
|
||||||
|
|
||||||
|
TelnetLogAppender.getInstance().removeSession(session);
|
||||||
|
|
||||||
|
if (!session.syncIsConnected())
|
||||||
{
|
{
|
||||||
it.remove();
|
it.remove();
|
||||||
}
|
}
|
||||||
|
|
119
src/me/StevenLawson/BukkitTelnet/TelnetLogAppender.java
Normal file
119
src/me/StevenLawson/BukkitTelnet/TelnetLogAppender.java
Normal file
|
@ -0,0 +1,119 @@
|
||||||
|
package me.StevenLawson.BukkitTelnet;
|
||||||
|
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.io.StringWriter;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
import me.StevenLawson.BukkitTelnet.session.ClientSession;
|
||||||
|
import me.StevenLawson.BukkitTelnet.session.FilterMode;
|
||||||
|
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;
|
||||||
|
|
||||||
|
public class TelnetLogAppender extends AbstractAppender
|
||||||
|
{
|
||||||
|
private final Set<ClientSession> sessions;
|
||||||
|
private final SimpleDateFormat dateFormat;
|
||||||
|
|
||||||
|
private TelnetLogAppender()
|
||||||
|
{
|
||||||
|
super("BukkitTelnet", null, null);
|
||||||
|
|
||||||
|
this.sessions = new HashSet<ClientSession>();
|
||||||
|
this.dateFormat = new SimpleDateFormat("HH:mm:ss");
|
||||||
|
|
||||||
|
super.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<ClientSession> getSessions()
|
||||||
|
{
|
||||||
|
return Collections.unmodifiableSet(sessions);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean addSession(ClientSession session)
|
||||||
|
{
|
||||||
|
return sessions.add(session);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean removeSession(ClientSession session)
|
||||||
|
{
|
||||||
|
return sessions.remove(session);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeAllSesssions()
|
||||||
|
{
|
||||||
|
sessions.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void append(LogEvent event)
|
||||||
|
{
|
||||||
|
final String message = event.getMessage().getFormattedMessage();
|
||||||
|
|
||||||
|
for (ClientSession session : sessions)
|
||||||
|
{
|
||||||
|
if (!session.syncIsConnected())
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (session.getFilterMode() == FilterMode.CHAT_ONLY)
|
||||||
|
{
|
||||||
|
if (!(message.startsWith("<")
|
||||||
|
|| message.startsWith("[Server")
|
||||||
|
|| message.startsWith("[CONSOLE") || message.startsWith("[TotalFreedomMod] [ADMIN]")))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (session.getFilterMode() == FilterMode.NONCHAT_ONLY)
|
||||||
|
{
|
||||||
|
if (message.startsWith("<")
|
||||||
|
|| message.startsWith("[Server")
|
||||||
|
|| message.startsWith("[CONSOLE")
|
||||||
|
|| message.startsWith("[TotalFreedomMod] [ADMIN]"))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
session.printRawln(formatMessage(message, event));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String formatMessage(String message, LogEvent event)
|
||||||
|
{
|
||||||
|
final StringBuilder builder = new StringBuilder();
|
||||||
|
final Throwable ex = event.getThrown();
|
||||||
|
|
||||||
|
builder.append("[");
|
||||||
|
builder.append(dateFormat.format(event.getMillis()));
|
||||||
|
builder.append(" ");
|
||||||
|
builder.append(event.getLevel().name().toUpperCase());
|
||||||
|
builder.append("]: ");
|
||||||
|
builder.append(message);
|
||||||
|
|
||||||
|
if (ex != null)
|
||||||
|
{
|
||||||
|
StringWriter writer = new StringWriter();
|
||||||
|
ex.printStackTrace(new PrintWriter(writer));
|
||||||
|
builder.append(writer);
|
||||||
|
}
|
||||||
|
|
||||||
|
return builder.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TelnetLogAppender getInstance()
|
||||||
|
{
|
||||||
|
return TelnetLogAppenderHolder.INSTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class TelnetLogAppenderHolder
|
||||||
|
{
|
||||||
|
private static final TelnetLogAppender INSTANCE = new TelnetLogAppender();
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,10 +4,6 @@ import java.io.IOException;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.net.ServerSocket;
|
import java.net.ServerSocket;
|
||||||
import java.net.UnknownHostException;
|
import java.net.UnknownHostException;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import me.StevenLawson.BukkitTelnet.TelnetConfig.SimpleConfigEntries;
|
import me.StevenLawson.BukkitTelnet.TelnetConfig.SimpleConfigEntries;
|
||||||
|
|
||||||
public class TelnetServer
|
public class TelnetServer
|
||||||
|
@ -48,7 +44,7 @@ public class TelnetServer
|
||||||
}
|
}
|
||||||
|
|
||||||
// Server socket
|
// Server socket
|
||||||
ServerSocket serversocket;
|
final ServerSocket serversocket;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -87,10 +83,10 @@ public class TelnetServer
|
||||||
|
|
||||||
public static TelnetServer getInstance()
|
public static TelnetServer getInstance()
|
||||||
{
|
{
|
||||||
return BT_TelnetServerHolder.INSTANCE;
|
return TelnetServerHolder.INSTANCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class BT_TelnetServerHolder
|
private static class TelnetServerHolder
|
||||||
{
|
{
|
||||||
private static final TelnetServer INSTANCE = new TelnetServer();
|
private static final TelnetServer INSTANCE = new TelnetServer();
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,9 @@ import java.util.Map;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import me.StevenLawson.BukkitTelnet.BukkitTelnet;
|
import me.StevenLawson.BukkitTelnet.BukkitTelnet;
|
||||||
import me.StevenLawson.BukkitTelnet.TelnetConfig;
|
import me.StevenLawson.BukkitTelnet.TelnetConfig;
|
||||||
|
import me.StevenLawson.BukkitTelnet.TelnetLogAppender;
|
||||||
import me.StevenLawson.BukkitTelnet.TelnetLogger;
|
import me.StevenLawson.BukkitTelnet.TelnetLogger;
|
||||||
|
import me.StevenLawson.BukkitTelnet.TelnetServer;
|
||||||
import me.StevenLawson.BukkitTelnet.Util;
|
import me.StevenLawson.BukkitTelnet.Util;
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
|
@ -32,7 +34,6 @@ public final class ClientSession extends Thread
|
||||||
private final String clientAddress;
|
private final String clientAddress;
|
||||||
//
|
//
|
||||||
private final SessionCommandSender commandSender;
|
private final SessionCommandSender commandSender;
|
||||||
private final SessionLogAppender logAppender;
|
|
||||||
private FilterMode filterMode;
|
private FilterMode filterMode;
|
||||||
//
|
//
|
||||||
private BufferedWriter writer;
|
private BufferedWriter writer;
|
||||||
|
@ -46,7 +47,6 @@ public final class ClientSession extends Thread
|
||||||
this.clientAddress = clientSocket.getInetAddress().getHostAddress();
|
this.clientAddress = clientSocket.getInetAddress().getHostAddress();
|
||||||
this.username = "";
|
this.username = "";
|
||||||
this.commandSender = new SessionCommandSender(this);
|
this.commandSender = new SessionCommandSender(this);
|
||||||
this.logAppender = new SessionLogAppender(this);
|
|
||||||
this.filterMode = FilterMode.FULL;
|
this.filterMode = FilterMode.FULL;
|
||||||
this.hasTerminated = false;
|
this.hasTerminated = false;
|
||||||
|
|
||||||
|
@ -92,11 +92,6 @@ public final class ClientSession extends Thread
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Logger getLogger()
|
|
||||||
{
|
|
||||||
return (Logger) LogManager.getRootLogger();
|
|
||||||
}
|
|
||||||
|
|
||||||
public synchronized void syncTerminateSession()
|
public synchronized void syncTerminateSession()
|
||||||
{
|
{
|
||||||
if (hasTerminated)
|
if (hasTerminated)
|
||||||
|
@ -107,7 +102,7 @@ public final class ClientSession extends Thread
|
||||||
hasTerminated = true;
|
hasTerminated = true;
|
||||||
|
|
||||||
TelnetLogger.info("Closing connection: " + clientAddress + (username.isEmpty() ? "" : " (" + username + ")"));
|
TelnetLogger.info("Closing connection: " + clientAddress + (username.isEmpty() ? "" : " (" + username + ")"));
|
||||||
getLogger().removeAppender(logAppender);
|
TelnetLogAppender.getInstance().removeSession(this);
|
||||||
|
|
||||||
synchronized (clientSocket)
|
synchronized (clientSocket)
|
||||||
{
|
{
|
||||||
|
@ -138,11 +133,6 @@ public final class ClientSession extends Thread
|
||||||
return commandSender;
|
return commandSender;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SessionLogAppender getAppender()
|
|
||||||
{
|
|
||||||
return logAppender;
|
|
||||||
}
|
|
||||||
|
|
||||||
public FilterMode getFilterMode()
|
public FilterMode getFilterMode()
|
||||||
{
|
{
|
||||||
return filterMode;
|
return filterMode;
|
||||||
|
@ -384,7 +374,7 @@ public final class ClientSession extends Thread
|
||||||
TelnetLogger.info(clientAddress + " logged in as \"" + username + "\".");
|
TelnetLogger.info(clientAddress + " logged in as \"" + username + "\".");
|
||||||
|
|
||||||
// Start feeding data to the client.
|
// Start feeding data to the client.
|
||||||
getLogger().addAppender(logAppender);
|
TelnetLogAppender.getInstance().addSession(this);
|
||||||
|
|
||||||
// Process commands
|
// Process commands
|
||||||
while (syncIsConnected())
|
while (syncIsConnected())
|
||||||
|
|
|
@ -1,74 +0,0 @@
|
||||||
package me.StevenLawson.BukkitTelnet.session;
|
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
|
||||||
import java.io.StringWriter;
|
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import org.apache.logging.log4j.core.LogEvent;
|
|
||||||
import org.apache.logging.log4j.core.appender.AbstractAppender;
|
|
||||||
|
|
||||||
public class SessionLogAppender extends AbstractAppender
|
|
||||||
{
|
|
||||||
private final ClientSession session;
|
|
||||||
private final SimpleDateFormat dateFormat;
|
|
||||||
|
|
||||||
public SessionLogAppender(ClientSession session)
|
|
||||||
{
|
|
||||||
super("BukkitTelnet", null, null);
|
|
||||||
|
|
||||||
this.session = session;
|
|
||||||
this.dateFormat = new SimpleDateFormat("HH:mm:ss");
|
|
||||||
|
|
||||||
start();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void append(LogEvent event)
|
|
||||||
{
|
|
||||||
final String message = event.getMessage().getFormattedMessage();
|
|
||||||
|
|
||||||
if (session.getFilterMode() == FilterMode.CHAT_ONLY)
|
|
||||||
{
|
|
||||||
if (!(message.startsWith("<")
|
|
||||||
|| message.startsWith("[Server")
|
|
||||||
|| message.startsWith("[CONSOLE") || message.startsWith("[TotalFreedomMod] [ADMIN]")))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (session.getFilterMode() == FilterMode.NONCHAT_ONLY)
|
|
||||||
{
|
|
||||||
if (message.startsWith("<")
|
|
||||||
|| message.startsWith("[Server")
|
|
||||||
|| message.startsWith("[CONSOLE")
|
|
||||||
|| message.startsWith("[TotalFreedomMod] [ADMIN]"))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
session.printRawln(formatMessage(message, event));
|
|
||||||
}
|
|
||||||
|
|
||||||
private String formatMessage(String message, LogEvent event)
|
|
||||||
{
|
|
||||||
final StringBuilder builder = new StringBuilder();
|
|
||||||
final Throwable ex = event.getThrown();
|
|
||||||
|
|
||||||
builder.append("[");
|
|
||||||
builder.append(dateFormat.format(event.getMillis()));
|
|
||||||
builder.append(" ");
|
|
||||||
builder.append(event.getLevel().name().toUpperCase());
|
|
||||||
builder.append("]: ");
|
|
||||||
builder.append(message);
|
|
||||||
|
|
||||||
if (ex != null)
|
|
||||||
{
|
|
||||||
StringWriter writer = new StringWriter();
|
|
||||||
ex.printStackTrace(new PrintWriter(writer));
|
|
||||||
builder.append(writer);
|
|
||||||
}
|
|
||||||
|
|
||||||
return builder.toString();
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in a new issue