Files
WolfLauncher/core/LauncherLogger.cs

142 lines
4.3 KiB
C#
Raw Normal View History

2023-08-02 14:01:07 +02:00
using System;
using System.Collections.Concurrent;
using System.IO;
using System.Text;
using System.Windows.Forms;
using WolfLauncher.model;
/**
* Author: HypherionSA
* Log Window controller for the Launcher
**/
namespace WolfLauncher.core
{
public class LauncherLogger
{
// Static instance accessible anywhere
public static readonly LauncherLogger INSTANCE = new LauncherLogger();
// Running Instance Log Directory and File
private readonly DirectoryInfo logDir = new DirectoryInfo("launcherdata/logs");
private readonly FileInfo logFile = new FileInfo("launcherdata/logs/running.log");
// Log Queue, waiting to be written to log and log window
private ConcurrentQueue<string> logQueue = new ConcurrentQueue<string>();
// Timer to control logging, so it doesn't spam
private Timer tmr;
// Variables for the active Console window if any
public RichTextBox logWindow { get; set; }
public Instance loggingInstance { get; set; }
public bool canUpdateLog { get; set; }
// Should not be created elsewhere
private LauncherLogger()
{
// Create log directory if it doesn't exist
if (!logDir.Exists)
logDir.Create();
// Setup the log timer
tmr = new Timer();
tmr.Interval = 1000;
tmr.Enabled = false;
tmr.Tick += Tmr_Elapsed;
}
/**
* Check if any pending log entries are present, and process them
**/
private void Tmr_Elapsed(object sender, EventArgs e)
{
// Log is empty, so we don't continue
if (logQueue.Count == 0)
return;
// Dump the queue into a string
var sb = new StringBuilder();
while (logQueue.TryDequeue(out string msg))
{
sb.AppendLine(msg);
}
// Write to log file for persistance
File.AppendAllText(logFile.FullName, sb.ToString());
// Console window is open, so we update the log window
if (logWindow != null && !logWindow.IsDisposed && canUpdateLog)
logWindow.AppendText(sb.ToString());
}
/**
* Called when an instance is started, to start the logging process
**/
public void startLogging(Instance ins)
{
// Disable timer and remove previous log if it exists
tmr.Enabled = false;
if (logFile.Exists)
logFile.Delete();
// Clear the queue and enable the timer
logQueue = new ConcurrentQueue<string>();
tmr.Enabled = true;
loggingInstance = ins;
}
/**
* Add an entry to the log
**/
public void addLog(string log)
{
// Check if string is empty and ignore if it is
if (string.IsNullOrEmpty(log))
return;
// Add to log queue
logQueue.Enqueue(log);
}
/**
* Clear the current log and log file
**/
public void clearLog()
{
// Disable timer and delete log file
tmr.Enabled = false;
if (logFile.Exists)
logFile.Delete();
// Clear queue and re-enable timer
logQueue = new ConcurrentQueue<string>();
tmr.Enabled = true;
}
/**
* Load persisted log from disk to be used in log window
**/
public void loadLog(Instance ins = null)
{
// Instance Console window is closed, so we ignore
if (logWindow == null || logWindow.IsDisposed)
return;
// Check if the console window matches the running instance
if (loggingInstance != null && ins != null && ins == loggingInstance)
{
// Clear old log from window if any
logWindow.Clear();
// Check if persisted log exists
if (!logFile.Exists)
return;
// Load log from file into window
string log = File.ReadAllText(logFile.FullName, Encoding.UTF8);
logWindow.Text = log;
}
}
}
}