first commit
This commit is contained in:
82
NitroxServer/ConsoleCommands/ConfigCommand.cs
Normal file
82
NitroxServer/ConsoleCommands/ConfigCommand.cs
Normal file
@@ -0,0 +1,82 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user