skyrim-console-server/EmpathicQubit.ConsoleServer/ExternalInterop.cs
2021-05-16 10:43:37 -04:00

87 lines
2.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace EmpathicQbt.ConsoleServer {
public class ExternalInterop {
private Configuration config = null;
private SkyrimInterop skyrimInterop = null;
private readonly HashSet<string> BATCH_FILENAMES = new HashSet<string>() { "wotv", "ivrqs" };
private readonly long FILE_CHANGE_DEBOUNCE_TIME_TICKS = 10000 * 200; // 200 ms
private string configFileName = null;
private FileSystemWatcher configFileWatcher;
private bool isConfigFileChanged = false;
public ExternalInterop(Configuration config, SkyrimInterop skyrimInterop) {
this.config = config;
this.skyrimInterop = skyrimInterop;
}
public void Start() {
ListenForConfigFile();
}
public void Stop() {
if(configFileWatcher != null)
{
configFileWatcher.EnableRaisingEvents = false;
}
}
private void ListenForConfigFile()
{
try
{
string filePath = config.GetIniFilePath();
if (filePath == null) {
throw new Exception("Configuration file does not exist.");
}
configFileName = Path.GetFileName(filePath).ToLower();
configFileWatcher = new FileSystemWatcher();
configFileWatcher.Path = Path.GetDirectoryName(filePath);
configFileWatcher.Changed += Watcher_ConfigFileChanged;
configFileWatcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.CreationTime;
Trace.TraceInformation("Watching for config file at {0}", configFileWatcher.Path);
configFileWatcher.EnableRaisingEvents = true;
}
catch (Exception ex)
{
Trace.TraceError("Failed to watch for config files: {0}", ex.ToString());
}
}
private void Watcher_ConfigFileChanged(object sender, FileSystemEventArgs e)
{
if (!isConfigFileChanged &&
(e.ChangeType == WatcherChangeTypes.Changed || e.ChangeType == WatcherChangeTypes.Created))
{
string filename = e.Name.ToLower();
if (filename.Equals(configFileName))
{
Trace.TraceInformation("Config file {0} changed", filename);
// Wait for the configuration file to be saved
Thread.Sleep(1000);
isConfigFileChanged = true;
Stop();
skyrimInterop.Stop();
}
}
}
public bool IsConfigFileChanged() {
return isConfigFileChanged;
}
}
}