83 lines
2.6 KiB
C#
83 lines
2.6 KiB
C#
using System;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using NitroxModel.DataStructures.GameLogic;
|
|
using NitroxModel.Platforms.OS.Shared;
|
|
using NitroxModel.Serialization;
|
|
using NitroxServer.ConsoleCommands.Abstract;
|
|
|
|
namespace NitroxServer.ConsoleCommands
|
|
{
|
|
internal class ConfigCommand : Command
|
|
{
|
|
private readonly SemaphoreSlim configOpenLock = new(1);
|
|
private readonly Server server;
|
|
private readonly SubnauticaServerConfig serverConfig;
|
|
|
|
public ConfigCommand(Server server, SubnauticaServerConfig serverConfig) : base("config", Perms.CONSOLE, "Opens the server configuration file")
|
|
{
|
|
this.server = server;
|
|
this.serverConfig = serverConfig;
|
|
}
|
|
|
|
protected override void Execute(CallArgs args)
|
|
{
|
|
if (!configOpenLock.Wait(0))
|
|
{
|
|
Log.Warn("Waiting on previous config command to close the configuration file.");
|
|
return;
|
|
}
|
|
|
|
// Save config file if it doesn't exist yet.
|
|
string saveDir = Path.Combine(KeyValueStore.Instance.GetSavesFolderDir(), server.Name);
|
|
string configFile = Path.Combine(saveDir, serverConfig.FileName);
|
|
if (!File.Exists(configFile))
|
|
{
|
|
serverConfig.Serialize(saveDir);
|
|
}
|
|
|
|
Task.Run(async () =>
|
|
{
|
|
try
|
|
{
|
|
await StartWithDefaultProgramAsync(configFile);
|
|
}
|
|
finally
|
|
{
|
|
configOpenLock.Release();
|
|
}
|
|
serverConfig.Deserialize(saveDir); // Notifies user if deserialization failed.
|
|
Log.Info("If you made changes, restart the server for them to take effect.");
|
|
})
|
|
.ContinueWith(t =>
|
|
{
|
|
#if DEBUG
|
|
if (t.Exception != null)
|
|
{
|
|
throw t.Exception;
|
|
}
|
|
#endif
|
|
});
|
|
}
|
|
|
|
private async Task StartWithDefaultProgramAsync(string fileToOpen)
|
|
{
|
|
using Process process = FileSystem.Instance.OpenOrExecuteFile(fileToOpen);
|
|
await process.WaitForExitAsync();
|
|
try
|
|
{
|
|
while (!process.HasExited)
|
|
{
|
|
await Task.Delay(100);
|
|
}
|
|
}
|
|
catch (Exception)
|
|
{
|
|
// ignored
|
|
}
|
|
}
|
|
}
|
|
}
|