FileLogger.java

package dev.aura.bungeechat.chatlog;

import dev.aura.bungeechat.BungeeChat;
import dev.aura.bungeechat.api.placeholder.BungeeChatContext;
import dev.aura.bungeechat.api.placeholder.PlaceHolderManager;
import dev.aura.bungeechat.message.Format;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.util.Optional;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class FileLogger implements ChatLogger, AutoCloseable {
  private static final BungeeChatContext context = new BungeeChatContext();
  private static final File pluginDir = BungeeChat.getInstance().getConfigFolder();

  private final String logFile;
  private String oldFile = "";
  private Writer fw;
  private PrintWriter pw;

  @Override
  public void log(BungeeChatContext context) {
    initLogFile();

    pw.println(Format.CHAT_LOGGING_FILE.get(context));
    pw.flush();
  }

  @Override
  public void close() throws IOException {
    if (fw != null) fw.close();
    fw = null;

    if (pw != null) pw.close();
    pw = null;
  }

  private void initLogFile() {
    String newFile = PlaceHolderManager.processMessage(logFile, context);

    if (oldFile.equals(newFile)) return;

    try {
      // First close old writers
      close();

      File saveTo = new File(pluginDir, newFile);
      Optional.ofNullable(saveTo.getParentFile()).ifPresent(File::mkdirs);

      if (!saveTo.exists() && !saveTo.createNewFile()) {
        throw new IOException("Could not create " + saveTo);
      }

      oldFile = newFile;
      fw = new OutputStreamWriter(new FileOutputStream(saveTo, true), StandardCharsets.UTF_8);
      pw = new PrintWriter(fw);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}