Files
Nitrox/NitroxServer/ConsoleCommands/ConfigCommand.cs
2025-07-06 00:23:46 +02:00

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
}
}
}
}