diff --git a/Readme.md b/Readme.md
index 40a7204..e3d1dd4 100644
--- a/Readme.md
+++ b/Readme.md
@@ -18,8 +18,6 @@ that are detailed in their respective Readme file (if any).
- `pandalib-paper-permissions` Integration of the permission system `pandalib-permissions` into Bukkit, Vault and WEPIF permission systems;
- `pandalib-players` A library to handle classes representing online or offline players;
- `pandalib-players-permissible` An extension of `pandalib-players` with support for the permission system `pandalib-permissions`;
-- `pandalib-bungee-players` A partial extension and implementation of `pandalib-players` for Bungeecord plugin;
-- `pandalib-paper-players` A partial extension and implementation of `pandalib-players` for Paper plugin;
- `pandalib-netapi` A poorly designed, but working TCP network library;
- `pandalib-net` A better-designed, packet-based TCP network library (_still in development_);
- `pandalib-commands` An abstract command manager working on top of [Brigadier](https://github.com/Mojang/brigadier);
diff --git a/pandalib-bungee-players/pom.xml b/pandalib-bungee-players/pom.xml
deleted file mode 100644
index 6269ba6..0000000
--- a/pandalib-bungee-players/pom.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
- pandalib-parent
- fr.pandacube.lib
- 1.0-SNAPSHOT
- ../pom.xml
-
- 4.0.0
-
- pandalib-bungee-players
- jar
-
-
-
- bungeecord-repo
- https://oss.sonatype.org/content/repositories/snapshots
-
-
-
-
-
- fr.pandacube.lib
- pandalib-util
- ${project.version}
-
-
- fr.pandacube.lib
- pandalib-players
- ${project.version}
-
-
- fr.pandacube.lib
- pandalib-reflect
- ${project.version}
-
-
-
- net.md-5
- bungeecord-api
- ${bungeecord.version}
- provided
-
-
-
- net.md-5
- bungeecord-protocol
- ${bungeecord.version}
- provided
-
-
-
-
-
\ No newline at end of file
diff --git a/pandalib-bungee/pom.xml b/pandalib-bungee/pom.xml
index a090412..738f22e 100644
--- a/pandalib-bungee/pom.xml
+++ b/pandalib-bungee/pom.xml
@@ -21,17 +21,44 @@
+
+ fr.pandacube.lib
+ pandalib-core
+ ${project.version}
+
+
+ fr.pandacube.lib
+ pandalib-util
+ ${project.version}
+
+
+ fr.pandacube.lib
+ pandalib-players
+ ${project.version}
+
+
+ fr.pandacube.lib
+ pandalib-reflect
+ ${project.version}
+
+
+
+ net.md-5
+ bungeecord-protocol
+ ${bungeecord.version}
+ provided
+
net.md-5
bungeecord-api
${bungeecord.version}
provided
-
- fr.pandacube.lib
- pandalib-core
- ${project.version}
+ net.md-5
+ bungeecord-log
+ ${bungeecord.version}
+ provided
diff --git a/pandalib-bungee/src/main/java/fr/pandacube/lib/bungee/PandaLibBungee.java b/pandalib-bungee/src/main/java/fr/pandacube/lib/bungee/PandaLibBungee.java
new file mode 100644
index 0000000..8214fe1
--- /dev/null
+++ b/pandalib-bungee/src/main/java/fr/pandacube/lib/bungee/PandaLibBungee.java
@@ -0,0 +1,29 @@
+package fr.pandacube.lib.bungee;
+
+import fr.pandacube.lib.bungee.util.DailyLogRotateFileHandler;
+import fr.pandacube.lib.bungee.util.PluginMessagePassthrough;
+import net.md_5.bungee.api.plugin.Plugin;
+
+public class PandaLibBungee {
+
+ private static Plugin plugin;
+
+ public static void onLoad(Plugin plugin) {
+ PandaLibBungee.plugin = plugin;
+
+ }
+
+ public static void onEnable() {
+ PluginMessagePassthrough.init(plugin);
+ DailyLogRotateFileHandler.init(true);
+ }
+
+
+ public static void disable() {
+
+ }
+
+ public static Plugin getPlugin() {
+ return plugin;
+ }
+}
diff --git a/pandalib-bungee-players/src/main/java/fr/pandacube/lib/bungee/players/BungeeOffPlayer.java b/pandalib-bungee/src/main/java/fr/pandacube/lib/bungee/players/BungeeOffPlayer.java
similarity index 100%
rename from pandalib-bungee-players/src/main/java/fr/pandacube/lib/bungee/players/BungeeOffPlayer.java
rename to pandalib-bungee/src/main/java/fr/pandacube/lib/bungee/players/BungeeOffPlayer.java
diff --git a/pandalib-bungee-players/src/main/java/fr/pandacube/lib/bungee/players/BungeeOnlinePlayer.java b/pandalib-bungee/src/main/java/fr/pandacube/lib/bungee/players/BungeeOnlinePlayer.java
similarity index 100%
rename from pandalib-bungee-players/src/main/java/fr/pandacube/lib/bungee/players/BungeeOnlinePlayer.java
rename to pandalib-bungee/src/main/java/fr/pandacube/lib/bungee/players/BungeeOnlinePlayer.java
diff --git a/pandalib-bungee/src/main/java/fr/pandacube/lib/bungee/util/DailyLogRotateFileHandler.java b/pandalib-bungee/src/main/java/fr/pandacube/lib/bungee/util/DailyLogRotateFileHandler.java
new file mode 100644
index 0000000..543344e
--- /dev/null
+++ b/pandalib-bungee/src/main/java/fr/pandacube/lib/bungee/util/DailyLogRotateFileHandler.java
@@ -0,0 +1,150 @@
+package fr.pandacube.lib.bungee.util;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.concurrent.ThreadFactory;
+import java.util.logging.ErrorManager;
+import java.util.logging.Filter;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.zip.GZIPOutputStream;
+
+import com.google.common.io.Files;
+import fr.pandacube.lib.bungee.PandaLibBungee;
+import net.md_5.bungee.api.ProxyServer;
+import net.md_5.bungee.log.ConciseFormatter;
+
+public class DailyLogRotateFileHandler extends Handler {
+
+ private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+
+
+ public static void init(boolean hideInitialHandlerLogEntries) {
+ ProxyServer.getInstance().getLogger().addHandler(new DailyLogRotateFileHandler(hideInitialHandlerLogEntries));
+ }
+
+
+ private BufferedWriter currentFile = null;
+ private String currentFileDate = getCurrentDay();
+ private boolean closed = false;
+
+ private DailyLogRotateFileHandler(boolean hideInitialHandlerLogEntries) {
+ if (hideInitialHandlerLogEntries)
+ setFilter(new InitialHandlerLogRemover());
+ setFormatter(new ConciseFormatter(false));
+ setLevel(Level.parse(System.getProperty("net.md_5.bungee.file-log-level", "INFO")));
+ }
+
+ @Override
+ public synchronized void close() throws SecurityException {
+ closed = true;
+ if (currentFile != null) try {
+ currentFile.close();
+ } catch (IOException ignored) {
+ }
+ }
+
+ @Override
+ public synchronized void flush() {
+ if (closed) return;
+ if (currentFile == null) return;
+ try {
+ currentFile.flush();
+ } catch (IOException ignored) {
+ }
+ }
+
+ @Override
+ public synchronized void publish(LogRecord record) {
+ if (closed || !isLoggable(record))
+ return;
+
+ if (currentFile == null || !currentFileDate.equals(getCurrentDay()))
+ changeFile();
+
+ if (currentFile == null)
+ return;
+
+ String formattedMessage;
+
+ try {
+ formattedMessage = getFormatter().format(record);
+ } catch (Exception ex) {
+ reportError(null, ex, ErrorManager.FORMAT_FAILURE);
+ return;
+ }
+
+ try {
+ currentFile.write(formattedMessage);
+ currentFile.flush();
+ } catch (Exception ex) {
+ reportError(null, ex, ErrorManager.WRITE_FAILURE);
+ }
+ }
+
+ private void changeFile() {
+ if (currentFile != null) {
+ try {
+ currentFile.flush();
+ currentFile.close();
+ } catch (IOException ignored) {
+ }
+ File fileNewName = new File("logs/" + currentFileDate + ".log");
+ new File("logs/latest.log").renameTo(fileNewName);
+ ProxyServer.getInstance().getScheduler().runAsync(PandaLibBungee.getPlugin(), () -> compress(fileNewName));
+ }
+
+ currentFileDate = getCurrentDay();
+ try {
+ File logDir = new File("logs");
+ logDir.mkdir();
+ currentFile = new BufferedWriter(new FileWriter("logs/latest.log", true));
+ } catch (SecurityException | IOException e) {
+ reportError("Erreur lors de l'initialisation d'un fichier log", e, ErrorManager.OPEN_FAILURE);
+ currentFile = null;
+ }
+ }
+
+ private String getCurrentDay() {
+ return dateFormat.format(new Date());
+ }
+
+
+ private void compress(File sourceFile) {
+ File destFile = new File(sourceFile.getParentFile(), sourceFile.getName() + ".gz");
+ if (destFile.exists())
+ destFile.delete();
+ try (GZIPOutputStream os = new GZIPOutputStream(new FileOutputStream(destFile))) {
+ Files.copy(sourceFile, os);
+ } catch (IOException e) {
+ if (destFile.exists())
+ destFile.delete();
+ throw new RuntimeException(e);
+ }
+ sourceFile.delete();
+
+ }
+
+
+
+ private class InitialHandlerLogRemover implements Filter {
+
+ @Override
+ public boolean isLoggable(LogRecord record) {
+ String formattedRecord = getFormatter().format(record);
+ if (formattedRecord.contains("<-> InitialHandler has connected")) return false;
+ if (formattedRecord.contains("<-> InitialHandler has pinged")) return false;
+ return true;
+ }
+
+ }
+}
diff --git a/pandalib-bungee/src/main/java/fr/pandacube/lib/bungee/PluginMessagePassthrough.java b/pandalib-bungee/src/main/java/fr/pandacube/lib/bungee/util/PluginMessagePassthrough.java
similarity index 98%
rename from pandalib-bungee/src/main/java/fr/pandacube/lib/bungee/PluginMessagePassthrough.java
rename to pandalib-bungee/src/main/java/fr/pandacube/lib/bungee/util/PluginMessagePassthrough.java
index fa40ab7..1495aa6 100644
--- a/pandalib-bungee/src/main/java/fr/pandacube/lib/bungee/PluginMessagePassthrough.java
+++ b/pandalib-bungee/src/main/java/fr/pandacube/lib/bungee/util/PluginMessagePassthrough.java
@@ -1,4 +1,4 @@
-package fr.pandacube.lib.bungee;
+package fr.pandacube.lib.bungee.util;
import java.util.ArrayList;
import java.util.Collections;
diff --git a/pom.xml b/pom.xml
index 6a8412d..7b0c8bf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -64,7 +64,6 @@
pandalib-bungee
pandalib-bungee-commands
pandalib-bungee-permissions
- pandalib-bungee-players
pandalib-chat
pandalib-cli
pandalib-commands