mirror of
https://github.com/tribufu/ServerManagers
synced 2026-06-01 09:42:39 +00:00
World Save Back and Restore Changes
1. added the SaveGames folder to the to the backup zip file. 2. now restores the SaveGames folder.
This commit is contained in:
parent
aa5c135be7
commit
a5e749963a
19 changed files with 408 additions and 96 deletions
|
|
@ -95,7 +95,7 @@
|
||||||
<setting name="UpdateCheckTime" serializeAs="String">
|
<setting name="UpdateCheckTime" serializeAs="String">
|
||||||
<value>720</value>
|
<value>720</value>
|
||||||
</setting>
|
</setting>
|
||||||
<setting name="SavedArksRelativePath" serializeAs="String">
|
<setting name="SavedFilesRelativePath" serializeAs="String">
|
||||||
<value>ShooterGame\Saved\SavedArks</value>
|
<value>ShooterGame\Saved\SavedArks</value>
|
||||||
</setting>
|
</setting>
|
||||||
<setting name="HelpUrl" serializeAs="String">
|
<setting name="HelpUrl" serializeAs="String">
|
||||||
|
|
@ -356,6 +356,9 @@
|
||||||
<setting name="ServerCallUrlDelay" serializeAs="String">
|
<setting name="ServerCallUrlDelay" serializeAs="String">
|
||||||
<value>12</value>
|
<value>12</value>
|
||||||
</setting>
|
</setting>
|
||||||
|
<setting name="SaveGamesRelativePath" serializeAs="String">
|
||||||
|
<value>SaveGames</value>
|
||||||
|
</setting>
|
||||||
</ServerManagerTool.Config>
|
</ServerManagerTool.Config>
|
||||||
<ServerManagerTool.Common.CommonConfig>
|
<ServerManagerTool.Common.CommonConfig>
|
||||||
<setting name="DefaultSteamAPIKey" serializeAs="String">
|
<setting name="DefaultSteamAPIKey" serializeAs="String">
|
||||||
|
|
|
||||||
13
src/ARKServerManager/Config.Designer.cs
generated
13
src/ARKServerManager/Config.Designer.cs
generated
|
|
@ -309,9 +309,9 @@ namespace ServerManagerTool {
|
||||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
[global::System.Configuration.DefaultSettingValueAttribute("ShooterGame\\Saved\\SavedArks")]
|
[global::System.Configuration.DefaultSettingValueAttribute("ShooterGame\\Saved\\SavedArks")]
|
||||||
public string SavedArksRelativePath {
|
public string SavedFilesRelativePath {
|
||||||
get {
|
get {
|
||||||
return ((string)(this["SavedArksRelativePath"]));
|
return ((string)(this["SavedFilesRelativePath"]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3150,5 +3150,14 @@ namespace ServerManagerTool {
|
||||||
this["DiscordBotAllServersKeyword"] = value;
|
this["DiscordBotAllServersKeyword"] = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("SaveGames")]
|
||||||
|
public string SaveGamesRelativePath {
|
||||||
|
get {
|
||||||
|
return ((string)(this["SaveGamesRelativePath"]));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -92,7 +92,7 @@
|
||||||
<Setting Name="UpdateCheckTime" Type="System.Int32" Scope="Application">
|
<Setting Name="UpdateCheckTime" Type="System.Int32" Scope="Application">
|
||||||
<Value Profile="(Default)">720</Value>
|
<Value Profile="(Default)">720</Value>
|
||||||
</Setting>
|
</Setting>
|
||||||
<Setting Name="SavedArksRelativePath" Type="System.String" Scope="Application">
|
<Setting Name="SavedFilesRelativePath" Type="System.String" Scope="Application">
|
||||||
<Value Profile="(Default)">ShooterGame\Saved\SavedArks</Value>
|
<Value Profile="(Default)">ShooterGame\Saved\SavedArks</Value>
|
||||||
</Setting>
|
</Setting>
|
||||||
<Setting Name="UpgradeConfig" Type="System.Boolean" Scope="User">
|
<Setting Name="UpgradeConfig" Type="System.Boolean" Scope="User">
|
||||||
|
|
@ -866,5 +866,8 @@
|
||||||
<Setting Name="DiscordBotAllServersKeyword" Type="System.String" Scope="User">
|
<Setting Name="DiscordBotAllServersKeyword" Type="System.String" Scope="User">
|
||||||
<Value Profile="(Default)">all</Value>
|
<Value Profile="(Default)">all</Value>
|
||||||
</Setting>
|
</Setting>
|
||||||
|
<Setting Name="SaveGamesRelativePath" Type="System.String" Scope="Application">
|
||||||
|
<Value Profile="(Default)">SaveGames</Value>
|
||||||
|
</Setting>
|
||||||
</Settings>
|
</Settings>
|
||||||
</SettingsFile>
|
</SettingsFile>
|
||||||
|
|
@ -2008,6 +2008,7 @@ namespace ServerManagerTool.Lib
|
||||||
{
|
{
|
||||||
LogProfileMessage("Back up world files started...");
|
LogProfileMessage("Back up world files started...");
|
||||||
|
|
||||||
|
var worldFileName = Path.GetFileName(worldFile);
|
||||||
var backupFolder = GetServerBackupFolder(_profile);
|
var backupFolder = GetServerBackupFolder(_profile);
|
||||||
var mapName = ServerProfile.GetProfileMapFileName(_profile.ServerMap, _profile.PGM_Enabled, _profile.PGM_Name);
|
var mapName = ServerProfile.GetProfileMapFileName(_profile.ServerMap, _profile.PGM_Enabled, _profile.PGM_Name);
|
||||||
var backupFileName = $"{mapName}_{_startTime:yyyyMMdd_HHmmss}{Config.Default.BackupExtension}";
|
var backupFileName = $"{mapName}_{_startTime:yyyyMMdd_HHmmss}{Config.Default.BackupExtension}";
|
||||||
|
|
@ -2019,36 +2020,6 @@ namespace ServerManagerTool.Lib
|
||||||
if (File.Exists(backupFile))
|
if (File.Exists(backupFile))
|
||||||
File.Delete(backupFile);
|
File.Delete(backupFile);
|
||||||
|
|
||||||
var files = new List<string>
|
|
||||||
{
|
|
||||||
worldFile
|
|
||||||
};
|
|
||||||
|
|
||||||
// get the player files
|
|
||||||
var saveFolderInfo = new DirectoryInfo(saveFolder);
|
|
||||||
var playerFileFilter = $"*{Config.Default.PlayerFileExtension}";
|
|
||||||
var playerFiles = saveFolderInfo.GetFiles(playerFileFilter, SearchOption.TopDirectoryOnly);
|
|
||||||
foreach (var file in playerFiles)
|
|
||||||
{
|
|
||||||
files.Add(file.FullName);
|
|
||||||
}
|
|
||||||
|
|
||||||
// get the tribe files
|
|
||||||
var tribeFileFilter = $"*{Config.Default.TribeFileExtension}";
|
|
||||||
var tribeFiles = saveFolderInfo.GetFiles(tribeFileFilter, SearchOption.TopDirectoryOnly);
|
|
||||||
foreach (var file in tribeFiles)
|
|
||||||
{
|
|
||||||
files.Add(file.FullName);
|
|
||||||
}
|
|
||||||
|
|
||||||
// get the tribute tribe files
|
|
||||||
var tributeTribeFileFilter = $"*{Config.Default.TributeTribeFileExtension}";
|
|
||||||
var tributeTribeFiles = saveFolderInfo.GetFiles(tributeTribeFileFilter, SearchOption.TopDirectoryOnly);
|
|
||||||
foreach (var file in tributeTribeFiles)
|
|
||||||
{
|
|
||||||
files.Add(file.FullName);
|
|
||||||
}
|
|
||||||
|
|
||||||
var comment = new StringBuilder();
|
var comment = new StringBuilder();
|
||||||
comment.AppendLine($"Windows Platform: {Environment.OSVersion.Platform}");
|
comment.AppendLine($"Windows Platform: {Environment.OSVersion.Platform}");
|
||||||
comment.AppendLine($"Windows Version: {Environment.OSVersion.VersionString}");
|
comment.AppendLine($"Windows Version: {Environment.OSVersion.VersionString}");
|
||||||
|
|
@ -2061,7 +2032,48 @@ namespace ServerManagerTool.Lib
|
||||||
comment.AppendLine($"PGM Server: {_profile.PGM_Enabled}");
|
comment.AppendLine($"PGM Server: {_profile.PGM_Enabled}");
|
||||||
comment.AppendLine($"Process: {ServerProcess}");
|
comment.AppendLine($"Process: {ServerProcess}");
|
||||||
|
|
||||||
ZipUtils.ZipFiles(backupFile, files, comment.ToString(), false);
|
var saveFolderInfo = new DirectoryInfo(saveFolder);
|
||||||
|
|
||||||
|
// backup the world save file
|
||||||
|
ZipUtils.ZipAFile(backupFile, worldFileName, worldFile, comment.ToString());
|
||||||
|
|
||||||
|
// backup the player files
|
||||||
|
var playerFileFilter = $"*{Config.Default.PlayerFileExtension}";
|
||||||
|
var playerFiles = saveFolderInfo.GetFiles(playerFileFilter, SearchOption.TopDirectoryOnly);
|
||||||
|
foreach (var file in playerFiles)
|
||||||
|
{
|
||||||
|
ZipUtils.ZipAFile(backupFile, file.Name, file.FullName);
|
||||||
|
}
|
||||||
|
|
||||||
|
// backup the tribe files
|
||||||
|
var tribeFileFilter = $"*{Config.Default.TribeFileExtension}";
|
||||||
|
var tribeFiles = saveFolderInfo.GetFiles(tribeFileFilter, SearchOption.TopDirectoryOnly);
|
||||||
|
foreach (var file in tribeFiles)
|
||||||
|
{
|
||||||
|
ZipUtils.ZipAFile(backupFile, file.Name, file.FullName);
|
||||||
|
}
|
||||||
|
|
||||||
|
// backup the tribute tribe files
|
||||||
|
var tributeTribeFileFilter = $"*{Config.Default.TributeTribeFileExtension}";
|
||||||
|
var tributeTribeFiles = saveFolderInfo.GetFiles(tributeTribeFileFilter, SearchOption.TopDirectoryOnly);
|
||||||
|
foreach (var file in tributeTribeFiles)
|
||||||
|
{
|
||||||
|
ZipUtils.ZipAFile(backupFile, file.Name, file.FullName);
|
||||||
|
}
|
||||||
|
|
||||||
|
// backup the save games files
|
||||||
|
var saveGamesFolder = GetServerSaveGamesFolder();
|
||||||
|
if (Directory.Exists(saveGamesFolder))
|
||||||
|
{
|
||||||
|
var saveGamesFolderInfo = new DirectoryInfo(saveGamesFolder);
|
||||||
|
|
||||||
|
var saveGamesFileFilter = $"*";
|
||||||
|
var saveGamesFiles = saveGamesFolderInfo.GetFiles(saveGamesFileFilter, SearchOption.AllDirectories);
|
||||||
|
foreach (var file in saveGamesFiles)
|
||||||
|
{
|
||||||
|
ZipUtils.ZipAFile(backupFile, file.FullName.Replace(saveGamesFolder, Config.Default.SaveGamesRelativePath), file.FullName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
LogProfileMessage($"Backed up world files - {saveFolder}");
|
LogProfileMessage($"Backed up world files - {saveFolder}");
|
||||||
LogProfileMessage($"Backup file created - {backupFile}");
|
LogProfileMessage($"Backup file created - {backupFile}");
|
||||||
|
|
@ -2404,6 +2416,8 @@ namespace ServerManagerTool.Lib
|
||||||
|
|
||||||
private string GetServerSaveFolder() => IOUtils.NormalizePath(ServerProfile.GetProfileSavePath(_profile.InstallDirectory, _profile.AltSaveDirectoryName, _profile.PGM_Enabled, _profile.PGM_Name));
|
private string GetServerSaveFolder() => IOUtils.NormalizePath(ServerProfile.GetProfileSavePath(_profile.InstallDirectory, _profile.AltSaveDirectoryName, _profile.PGM_Enabled, _profile.PGM_Name));
|
||||||
|
|
||||||
|
private string GetServerSaveGamesFolder() => IOUtils.NormalizePath(ServerProfile.GetProfileSaveGamesPath(_profile.InstallDirectory));
|
||||||
|
|
||||||
private string GetServerVersionFile() => IOUtils.NormalizePath(Path.Combine(_profile.InstallDirectory, Config.Default.VersionFile));
|
private string GetServerVersionFile() => IOUtils.NormalizePath(Path.Combine(_profile.InstallDirectory, Config.Default.VersionFile));
|
||||||
|
|
||||||
public static Version GetServerVersion(string versionFile)
|
public static Version GetServerVersion(string versionFile)
|
||||||
|
|
|
||||||
|
|
@ -4830,6 +4830,7 @@ namespace ServerManagerTool.Lib
|
||||||
|
|
||||||
var mapName = GetProfileMapFileName(this);
|
var mapName = GetProfileMapFileName(this);
|
||||||
var worldFileName = $"{mapName}{Config.Default.MapExtension}";
|
var worldFileName = $"{mapName}{Config.Default.MapExtension}";
|
||||||
|
var saveGamesFolder = GetProfileSaveGamesPath(this);
|
||||||
|
|
||||||
// check if the archive file contains the world save file at minimum
|
// check if the archive file contains the world save file at minimum
|
||||||
if (isArchiveFile)
|
if (isArchiveFile)
|
||||||
|
|
@ -4854,11 +4855,12 @@ namespace ServerManagerTool.Lib
|
||||||
|
|
||||||
var worldFile = IOUtils.NormalizePath(Path.Combine(saveFolder, worldFileName));
|
var worldFile = IOUtils.NormalizePath(Path.Combine(saveFolder, worldFileName));
|
||||||
var restoreFileInfo = new FileInfo(restoreFile);
|
var restoreFileInfo = new FileInfo(restoreFile);
|
||||||
int restoredFileCount;
|
var restoredFileCount = 0;
|
||||||
|
|
||||||
if (isArchiveFile)
|
if (isArchiveFile)
|
||||||
{
|
{
|
||||||
// create a list of files to be deleted
|
// create a list of files to be deleted
|
||||||
|
var directories = new List<string>();
|
||||||
var files = new List<string>
|
var files = new List<string>
|
||||||
{
|
{
|
||||||
worldFile
|
worldFile
|
||||||
|
|
@ -4892,13 +4894,10 @@ namespace ServerManagerTool.Lib
|
||||||
files.Add(file.FullName);
|
files.Add(file.FullName);
|
||||||
}
|
}
|
||||||
|
|
||||||
//// get the player images files
|
if (Directory.Exists(saveGamesFolder) && ZipUtils.DoesFolderExist(restoreFile, Config.Default.SaveGamesRelativePath))
|
||||||
//var playerImageFileFilter = $"*{Config.Default.PlayerImageFileExtension}";
|
{
|
||||||
//var playerImageFiles = saveFolderInfo.GetFiles(playerImageFileFilter, SearchOption.TopDirectoryOnly);
|
directories.Add(saveGamesFolder);
|
||||||
//foreach (var file in playerImageFiles)
|
}
|
||||||
//{
|
|
||||||
// files.Add(file.FullName);
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// delete the selected files
|
// delete the selected files
|
||||||
|
|
@ -4914,14 +4913,32 @@ namespace ServerManagerTool.Lib
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (var directory in directories)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Directory.Delete(directory, true);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// if unable to delete, do not bother
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// restore the files from the backup
|
// restore the files from the backup
|
||||||
if (restoreAll)
|
if (restoreAll)
|
||||||
{
|
{
|
||||||
restoredFileCount = ZipUtils.ExtractAllFiles(restoreFile, saveFolder);
|
restoredFileCount += ZipUtils.ExtractFiles(restoreFile, saveFolder, sourceFolder: "", recurseFolders: false);
|
||||||
|
|
||||||
|
if (ZipUtils.DoesFolderExist(restoreFile, Config.Default.SaveGamesRelativePath))
|
||||||
|
{
|
||||||
|
var rootSaveFolder = Path.GetDirectoryName(saveGamesFolder);
|
||||||
|
restoredFileCount += ZipUtils.ExtractFiles(restoreFile, rootSaveFolder, Config.Default.SaveGamesRelativePath, recurseFolders: true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
restoredFileCount = ZipUtils.ExtractAFile(restoreFile, worldFileName, saveFolder);
|
restoredFileCount += ZipUtils.ExtractAFile(restoreFile, worldFileName, saveFolder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -6691,6 +6708,16 @@ namespace ServerManagerTool.Lib
|
||||||
return ModUtils.GetMapName(serverMap);
|
return ModUtils.GetMapName(serverMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static string GetProfileSaveGamesPath(ServerProfile profile)
|
||||||
|
{
|
||||||
|
return GetProfileSaveGamesPath(profile?.InstallDirectory);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string GetProfileSaveGamesPath(string installDirectory)
|
||||||
|
{
|
||||||
|
return Path.Combine(installDirectory ?? string.Empty, Config.Default.SavedRelativePath, Config.Default.SaveGamesRelativePath);
|
||||||
|
}
|
||||||
|
|
||||||
public static string GetProfileSavePath(ServerProfile profile)
|
public static string GetProfileSavePath(ServerProfile profile)
|
||||||
{
|
{
|
||||||
return GetProfileSavePath(profile?.InstallDirectory, profile?.AltSaveDirectoryName, profile?.PGM_Enabled ?? false, profile?.PGM_Name);
|
return GetProfileSavePath(profile?.InstallDirectory, profile?.AltSaveDirectoryName, profile?.PGM_Enabled ?? false, profile?.PGM_Name);
|
||||||
|
|
@ -6706,8 +6733,8 @@ namespace ServerManagerTool.Lib
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pgmEnabled)
|
if (pgmEnabled)
|
||||||
return Path.Combine(installDirectory ?? string.Empty, Config.Default.SavedArksRelativePath, Config.Default.SavedPGMRelativePath, pgmName ?? string.Empty);
|
return Path.Combine(installDirectory ?? string.Empty, Config.Default.SavedFilesRelativePath, Config.Default.SavedPGMRelativePath, pgmName ?? string.Empty);
|
||||||
return Path.Combine(installDirectory ?? string.Empty, Config.Default.SavedArksRelativePath);
|
return Path.Combine(installDirectory ?? string.Empty, Config.Default.SavedFilesRelativePath);
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,31 @@
|
||||||
<title>Ark Server Manager Version Feed</title>
|
<title>Ark Server Manager Version Feed</title>
|
||||||
<subtitle>This is the Ark Server Manager release version feed.</subtitle>
|
<subtitle>This is the Ark Server Manager release version feed.</subtitle>
|
||||||
<link href="http://arkservermanager.freeforums.net/" />
|
<link href="http://arkservermanager.freeforums.net/" />
|
||||||
<updated>2022-04-23T00:00:00Z</updated>
|
<updated>2022-05-02T00:00:00Z</updated>
|
||||||
|
|
||||||
|
<entry>
|
||||||
|
<id>urn:uuid:018EF426-73B9-4BF6-9602-77EE2CFD864C</id>
|
||||||
|
<title>1.1.424 (1.1.424.1)</title>
|
||||||
|
<summary>1.1.424.1</summary>
|
||||||
|
<link href="" />
|
||||||
|
<updated>2022-05-02T00:00:00Z</updated>
|
||||||
|
<content type="xhtml">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="font-family: Arial, Verdana, Helvetica, Sans-Serif;font-size: .8em;">
|
||||||
|
<p>
|
||||||
|
<u style="font-size: .9em;">CHANGE</u>
|
||||||
|
<br/>
|
||||||
|
<ul>
|
||||||
|
<li>World Save Backup - added the SaveGames folder to the to the backup zip file.</li>
|
||||||
|
<li>World Save Restore - now restores the SaveGames folder.</li>
|
||||||
|
</ul>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</content>
|
||||||
|
<author>
|
||||||
|
<name>bletch</name>
|
||||||
|
<email>bletch1971@hotmail.com</email>
|
||||||
|
</author>
|
||||||
|
</entry>
|
||||||
|
|
||||||
<entry>
|
<entry>
|
||||||
<id>urn:uuid:8AD6F2C4-D9BD-41D5-BE91-DA23F31A2FA4</id>
|
<id>urn:uuid:8AD6F2C4-D9BD-41D5-BE91-DA23F31A2FA4</id>
|
||||||
|
|
|
||||||
|
|
@ -5,28 +5,22 @@
|
||||||
<title>Ark Server Manager Version Feed</title>
|
<title>Ark Server Manager Version Feed</title>
|
||||||
<subtitle>This is the Ark Server Manager beta version feed.</subtitle>
|
<subtitle>This is the Ark Server Manager beta version feed.</subtitle>
|
||||||
<link href="http://arkservermanager.freeforums.net/" />
|
<link href="http://arkservermanager.freeforums.net/" />
|
||||||
<updated>2022-04-23T00:00:00Z</updated>
|
<updated>2022-05-02T00:00:00Z</updated>
|
||||||
|
|
||||||
<entry>
|
<entry>
|
||||||
<id>urn:uuid:8AD6F2C4-D9BD-41D5-BE91-DA23F31A2FA4</id>
|
<id>urn:uuid:018EF426-73B9-4BF6-9602-77EE2CFD864C</id>
|
||||||
<title>1.1.423 (1.1.423.1)</title>
|
<title>1.1.424 (1.1.424.1)</title>
|
||||||
<summary>1.1.423.1</summary>
|
<summary>1.1.424.1</summary>
|
||||||
<link href="" />
|
<link href="" />
|
||||||
<updated>2022-04-23T00:00:00Z</updated>
|
<updated>2022-05-02T00:00:00Z</updated>
|
||||||
<content type="xhtml">
|
<content type="xhtml">
|
||||||
<div xmlns="http://www.w3.org/1999/xhtml" style="font-family: Arial, Verdana, Helvetica, Sans-Serif;font-size: .8em;">
|
<div xmlns="http://www.w3.org/1999/xhtml" style="font-family: Arial, Verdana, Helvetica, Sans-Serif;font-size: .8em;">
|
||||||
<p>
|
<p>
|
||||||
<u style="font-size: .9em;">BUGFIX</u>
|
|
||||||
<br/>
|
|
||||||
<ul>
|
|
||||||
<li>Fixed the discord bot Info command, to release the profile once the command has finished running.</li>
|
|
||||||
</ul>
|
|
||||||
<u style="font-size: .9em;">CHANGE</u>
|
<u style="font-size: .9em;">CHANGE</u>
|
||||||
<br/>
|
<br/>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Profile Discord Settings - added new checkbox to allow the profile to be included in discord commands using the Cluster Id as the alias.</li>
|
<li>World Save Backup - added the SaveGames folder to the to the backup zip file.</li>
|
||||||
<li>Realigned the default Player and Creature levels to the wiki.</li>
|
<li>World Save Restore - now restores the SaveGames folder.</li>
|
||||||
<li>pt-BR Translation file updated.</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -87,7 +87,7 @@
|
||||||
<value>ConanSandbox\Mods</value>
|
<value>ConanSandbox\Mods</value>
|
||||||
</setting>
|
</setting>
|
||||||
<setting name="SavedRelativePath" serializeAs="String">
|
<setting name="SavedRelativePath" serializeAs="String">
|
||||||
<value>Saved</value>
|
<value>ConanSandbox\Saved</value>
|
||||||
</setting>
|
</setting>
|
||||||
<setting name="WorkshopCacheFile" serializeAs="String">
|
<setting name="WorkshopCacheFile" serializeAs="String">
|
||||||
<value>workshopcache_440900.json</value>
|
<value>workshopcache_440900.json</value>
|
||||||
|
|
@ -272,6 +272,9 @@
|
||||||
<setting name="ServerCallUrlDelay" serializeAs="String">
|
<setting name="ServerCallUrlDelay" serializeAs="String">
|
||||||
<value>12</value>
|
<value>12</value>
|
||||||
</setting>
|
</setting>
|
||||||
|
<setting name="SaveGamesRelativePath" serializeAs="String">
|
||||||
|
<value>SaveGames</value>
|
||||||
|
</setting>
|
||||||
</ServerManagerTool.Config>
|
</ServerManagerTool.Config>
|
||||||
<ServerManagerTool.Common.CommonConfig>
|
<ServerManagerTool.Common.CommonConfig>
|
||||||
<setting name="DefaultSteamAPIKey" serializeAs="String">
|
<setting name="DefaultSteamAPIKey" serializeAs="String">
|
||||||
|
|
|
||||||
11
src/ConanServerManager/Config.Designer.cs
generated
11
src/ConanServerManager/Config.Designer.cs
generated
|
|
@ -487,7 +487,7 @@ namespace ServerManagerTool {
|
||||||
|
|
||||||
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
[global::System.Configuration.DefaultSettingValueAttribute("Saved")]
|
[global::System.Configuration.DefaultSettingValueAttribute("ConanSandbox\\Saved")]
|
||||||
public string SavedRelativePath {
|
public string SavedRelativePath {
|
||||||
get {
|
get {
|
||||||
return ((string)(this["SavedRelativePath"]));
|
return ((string)(this["SavedRelativePath"]));
|
||||||
|
|
@ -2333,5 +2333,14 @@ namespace ServerManagerTool {
|
||||||
this["DiscordBotAllServersKeyword"] = value;
|
this["DiscordBotAllServersKeyword"] = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("SaveGames")]
|
||||||
|
public string SaveGamesRelativePath {
|
||||||
|
get {
|
||||||
|
return ((string)(this["SaveGamesRelativePath"]));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -135,7 +135,7 @@
|
||||||
<Value Profile="(Default)">False</Value>
|
<Value Profile="(Default)">False</Value>
|
||||||
</Setting>
|
</Setting>
|
||||||
<Setting Name="SavedRelativePath" Type="System.String" Scope="Application">
|
<Setting Name="SavedRelativePath" Type="System.String" Scope="Application">
|
||||||
<Value Profile="(Default)">Saved</Value>
|
<Value Profile="(Default)">ConanSandbox\Saved</Value>
|
||||||
</Setting>
|
</Setting>
|
||||||
<Setting Name="SteamCmdRedirectOutput" Type="System.Boolean" Scope="User">
|
<Setting Name="SteamCmdRedirectOutput" Type="System.Boolean" Scope="User">
|
||||||
<Value Profile="(Default)">False</Value>
|
<Value Profile="(Default)">False</Value>
|
||||||
|
|
@ -641,5 +641,8 @@
|
||||||
<Setting Name="DiscordBotAllServersKeyword" Type="System.String" Scope="User">
|
<Setting Name="DiscordBotAllServersKeyword" Type="System.String" Scope="User">
|
||||||
<Value Profile="(Default)">all</Value>
|
<Value Profile="(Default)">all</Value>
|
||||||
</Setting>
|
</Setting>
|
||||||
|
<Setting Name="SaveGamesRelativePath" Type="System.String" Scope="Application">
|
||||||
|
<Value Profile="(Default)">SaveGames</Value>
|
||||||
|
</Setting>
|
||||||
</Settings>
|
</Settings>
|
||||||
</SettingsFile>
|
</SettingsFile>
|
||||||
|
|
@ -1925,8 +1925,8 @@ namespace ServerManagerTool.Lib
|
||||||
if (Directory.Exists(saveFolder))
|
if (Directory.Exists(saveFolder))
|
||||||
{
|
{
|
||||||
// make a backup of the current world file.
|
// make a backup of the current world file.
|
||||||
var worldBackupFile = GetServerWorldBackupFile();
|
var worldFile = GetServerWorldBackupFile();
|
||||||
if (File.Exists(worldBackupFile))
|
if (File.Exists(worldFile))
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
@ -1944,8 +1944,6 @@ namespace ServerManagerTool.Lib
|
||||||
if (File.Exists(backupFile))
|
if (File.Exists(backupFile))
|
||||||
File.Delete(backupFile);
|
File.Delete(backupFile);
|
||||||
|
|
||||||
var files = new List<string>();
|
|
||||||
|
|
||||||
var comment = new StringBuilder();
|
var comment = new StringBuilder();
|
||||||
comment.AppendLine($"Windows Platform: {Environment.OSVersion.Platform}");
|
comment.AppendLine($"Windows Platform: {Environment.OSVersion.Platform}");
|
||||||
comment.AppendLine($"Windows Version: {Environment.OSVersion.VersionString}");
|
comment.AppendLine($"Windows Version: {Environment.OSVersion.VersionString}");
|
||||||
|
|
@ -1956,9 +1954,24 @@ namespace ServerManagerTool.Lib
|
||||||
comment.AppendLine($"Profile Name: {_profile.ProfileName}");
|
comment.AppendLine($"Profile Name: {_profile.ProfileName}");
|
||||||
comment.AppendLine($"Process: {ServerProcess}");
|
comment.AppendLine($"Process: {ServerProcess}");
|
||||||
|
|
||||||
ZipUtils.ZipAFile(backupFile, worldFileName, worldBackupFile, comment.ToString());
|
var saveFolderInfo = new DirectoryInfo(saveFolder);
|
||||||
if (files.Count > 0)
|
|
||||||
ZipUtils.UpdateFiles(backupFile, files, null, false, "");
|
// backup the world save file
|
||||||
|
ZipUtils.ZipAFile(backupFile, worldFileName, worldFile, comment.ToString());
|
||||||
|
|
||||||
|
// backup the save games files
|
||||||
|
var saveGamesFolder = GetServerSaveGamesFolder();
|
||||||
|
if (Directory.Exists(saveGamesFolder))
|
||||||
|
{
|
||||||
|
var saveGamesFolderInfo = new DirectoryInfo(saveGamesFolder);
|
||||||
|
|
||||||
|
var saveGamesFileFilter = $"*";
|
||||||
|
var saveGamesFiles = saveGamesFolderInfo.GetFiles(saveGamesFileFilter, SearchOption.AllDirectories);
|
||||||
|
foreach (var file in saveGamesFiles)
|
||||||
|
{
|
||||||
|
ZipUtils.ZipAFile(backupFile, file.FullName.Replace(saveGamesFolder, Config.Default.SaveGamesRelativePath), file.FullName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
LogProfileMessage($"Backed up world files - {saveFolder}");
|
LogProfileMessage($"Backed up world files - {saveFolder}");
|
||||||
LogProfileMessage($"Backup file created - {backupFile}");
|
LogProfileMessage($"Backup file created - {backupFile}");
|
||||||
|
|
@ -1986,12 +1999,12 @@ namespace ServerManagerTool.Lib
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LogProfileMessage($"Server save file does not exist or could not be found '{worldBackupFile}'.");
|
LogProfileMessage($"Server save file does not exist or could not be found '{worldFile}'.");
|
||||||
LogProfileMessage($"Backup not performed.");
|
LogProfileMessage($"Backup not performed.");
|
||||||
|
|
||||||
emailMessage?.AppendLine();
|
emailMessage?.AppendLine();
|
||||||
emailMessage?.AppendLine($"Server save file does not exist or could not be found.");
|
emailMessage?.AppendLine($"Server save file does not exist or could not be found.");
|
||||||
emailMessage?.AppendLine(worldBackupFile);
|
emailMessage?.AppendLine(worldFile);
|
||||||
|
|
||||||
emailMessage?.AppendLine();
|
emailMessage?.AppendLine();
|
||||||
emailMessage?.AppendLine("Backup not performed.");
|
emailMessage?.AppendLine("Backup not performed.");
|
||||||
|
|
@ -2289,6 +2302,8 @@ namespace ServerManagerTool.Lib
|
||||||
|
|
||||||
private string GetServerSaveFolder() => IOUtils.NormalizePath(Path.Combine(_profile.InstallDirectory, Config.Default.SavedFilesRelativePath));
|
private string GetServerSaveFolder() => IOUtils.NormalizePath(Path.Combine(_profile.InstallDirectory, Config.Default.SavedFilesRelativePath));
|
||||||
|
|
||||||
|
private string GetServerSaveGamesFolder() => IOUtils.NormalizePath(ServerProfile.GetProfileSaveGamesPath(_profile.InstallDirectory));
|
||||||
|
|
||||||
private string GetServerVersionFile() => IOUtils.NormalizePath(Path.Combine(_profile.InstallDirectory, Config.Default.ServerBinaryRelativePath, Config.Default.ServerExeFile));
|
private string GetServerVersionFile() => IOUtils.NormalizePath(Path.Combine(_profile.InstallDirectory, Config.Default.ServerBinaryRelativePath, Config.Default.ServerExeFile));
|
||||||
|
|
||||||
public static Version GetServerVersion(string versionFile)
|
public static Version GetServerVersion(string versionFile)
|
||||||
|
|
|
||||||
|
|
@ -1320,7 +1320,7 @@ namespace ServerManagerTool.Lib
|
||||||
return JsonUtils.Serialize<ServerProfile>(this);
|
return JsonUtils.Serialize<ServerProfile>(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int RestoreSaveFiles(string restoreFile, bool isArchiveFile)
|
public int RestoreSaveFiles(string restoreFile, bool isArchiveFile, bool restoreAll)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(restoreFile) || !File.Exists(restoreFile))
|
if (string.IsNullOrWhiteSpace(restoreFile) || !File.Exists(restoreFile))
|
||||||
{
|
{
|
||||||
|
|
@ -1336,6 +1336,7 @@ namespace ServerManagerTool.Lib
|
||||||
}
|
}
|
||||||
|
|
||||||
var worldFileName = ServerMapSaveFileName;
|
var worldFileName = ServerMapSaveFileName;
|
||||||
|
var saveGamesFolder = GetProfileSaveGamesPath(this);
|
||||||
|
|
||||||
// check if the archive file contains the world save file at minimum
|
// check if the archive file contains the world save file at minimum
|
||||||
if (isArchiveFile)
|
if (isArchiveFile)
|
||||||
|
|
@ -1365,12 +1366,23 @@ namespace ServerManagerTool.Lib
|
||||||
if (isArchiveFile)
|
if (isArchiveFile)
|
||||||
{
|
{
|
||||||
// create a list of files to be deleted
|
// create a list of files to be deleted
|
||||||
var files = new List<string>();
|
var directories = new List<string>();
|
||||||
// add the current world save file
|
var files = new List<string>
|
||||||
files.Add(worldFile);
|
{
|
||||||
|
worldFile,
|
||||||
|
};
|
||||||
|
|
||||||
// add the world save support files
|
// add the world save support files
|
||||||
files.AddRange(Directory.GetFiles(saveFolder, $"{worldFileName}-*"));
|
files.AddRange(Directory.GetFiles(saveFolder, $"{worldFileName}-*"));
|
||||||
|
|
||||||
|
if (restoreAll)
|
||||||
|
{
|
||||||
|
if (Directory.Exists(saveGamesFolder) && ZipUtils.DoesFolderExist(restoreFile, Config.Default.SaveGamesRelativePath))
|
||||||
|
{
|
||||||
|
directories.Add(saveGamesFolder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// delete the selected files
|
// delete the selected files
|
||||||
foreach (var file in files)
|
foreach (var file in files)
|
||||||
{
|
{
|
||||||
|
|
@ -1384,8 +1396,33 @@ namespace ServerManagerTool.Lib
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// restore the files from the backup
|
foreach (var directory in directories)
|
||||||
restoredFileCount = ZipUtils.ExtractAFile(restoreFile, worldFileName, saveFolder);
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Directory.Delete(directory, true);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// if unable to delete, do not bother
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (restoreAll)
|
||||||
|
{
|
||||||
|
// restore the files from the backup
|
||||||
|
restoredFileCount += ZipUtils.ExtractFiles(restoreFile, saveFolder, sourceFolder: "", recurseFolders: false);
|
||||||
|
|
||||||
|
if (ZipUtils.DoesFolderExist(restoreFile, Config.Default.SaveGamesRelativePath))
|
||||||
|
{
|
||||||
|
var rootSaveFolder = Path.GetDirectoryName(saveGamesFolder);
|
||||||
|
restoredFileCount += ZipUtils.ExtractFiles(restoreFile, rootSaveFolder, Config.Default.SaveGamesRelativePath, recurseFolders: true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
restoredFileCount += ZipUtils.ExtractAFile(restoreFile, worldFileName, saveFolder);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -1768,6 +1805,16 @@ namespace ServerManagerTool.Lib
|
||||||
return ModUtils.GetMapName(serverMap);
|
return ModUtils.GetMapName(serverMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static string GetProfileSaveGamesPath(ServerProfile profile)
|
||||||
|
{
|
||||||
|
return GetProfileSaveGamesPath(profile?.InstallDirectory);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string GetProfileSaveGamesPath(string installDirectory)
|
||||||
|
{
|
||||||
|
return Path.Combine(installDirectory ?? string.Empty, Config.Default.SavedRelativePath, Config.Default.SaveGamesRelativePath);
|
||||||
|
}
|
||||||
|
|
||||||
public static string GetProfileSavePath(ServerProfile profile)
|
public static string GetProfileSavePath(ServerProfile profile)
|
||||||
{
|
{
|
||||||
return GetProfileSavePath(profile?.InstallDirectory);
|
return GetProfileSavePath(profile?.InstallDirectory);
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,31 @@
|
||||||
<title>Conan Server Manager Version Feed</title>
|
<title>Conan Server Manager Version Feed</title>
|
||||||
<subtitle>This is the Conan Server Manager release version feed.</subtitle>
|
<subtitle>This is the Conan Server Manager release version feed.</subtitle>
|
||||||
<link href="http://servermanagers.freeforums.net/" />
|
<link href="http://servermanagers.freeforums.net/" />
|
||||||
<updated>2022-04-23T00:00:00Z</updated>
|
<updated>2022-05-02T00:00:00Z</updated>
|
||||||
|
|
||||||
|
<entry>
|
||||||
|
<id>urn:uuid:FF2C83B2-6D10-4217-A021-5B5F090FC480</id>
|
||||||
|
<title>1.1.68 (1.1.68.1)</title>
|
||||||
|
<summary>1.1.68.1</summary>
|
||||||
|
<link href="" />
|
||||||
|
<updated>2022-05-02T00:00:00Z</updated>
|
||||||
|
<content type="xhtml">
|
||||||
|
<div xmlns="http://www.w3.org/1999/xhtml" style="font-family: Arial, Verdana, Helvetica, Sans-Serif;font-size: .8em;">
|
||||||
|
<p>
|
||||||
|
<u style="font-size: .9em;">CHANGE</u>
|
||||||
|
<br/>
|
||||||
|
<ul>
|
||||||
|
<li>World Save Backup - added the SaveGames folder to the to the backup zip file.</li>
|
||||||
|
<li>World Save Restore - now restores the SaveGames folder.</li>
|
||||||
|
</ul>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</content>
|
||||||
|
<author>
|
||||||
|
<name>bletch</name>
|
||||||
|
<email>bletch1971@hotmail.com</email>
|
||||||
|
</author>
|
||||||
|
</entry>
|
||||||
|
|
||||||
<entry>
|
<entry>
|
||||||
<id>urn:uuid:E482A8A4-88C3-4517-A4DD-B954811F4F13</id>
|
<id>urn:uuid:E482A8A4-88C3-4517-A4DD-B954811F4F13</id>
|
||||||
|
|
|
||||||
|
|
@ -5,26 +5,22 @@
|
||||||
<title>Conan Server Manager Version Feed</title>
|
<title>Conan Server Manager Version Feed</title>
|
||||||
<subtitle>This is the Conan Server Manager beta version feed.</subtitle>
|
<subtitle>This is the Conan Server Manager beta version feed.</subtitle>
|
||||||
<link href="http://servermanagers.freeforums.net/" />
|
<link href="http://servermanagers.freeforums.net/" />
|
||||||
<updated>2022-04-23T00:00:00Z</updated>
|
<updated>2022-05-02T00:00:00Z</updated>
|
||||||
|
|
||||||
<entry>
|
<entry>
|
||||||
<id>urn:uuid:E482A8A4-88C3-4517-A4DD-B954811F4F13</id>
|
<id>urn:uuid:FF2C83B2-6D10-4217-A021-5B5F090FC480</id>
|
||||||
<title>1.1.67 (1.1.67.1)</title>
|
<title>1.1.68 (1.1.68.1)</title>
|
||||||
<summary>1.1.67.1</summary>
|
<summary>1.1.68.1</summary>
|
||||||
<link href="" />
|
<link href="" />
|
||||||
<updated>2022-04-23T00:00:00Z</updated>
|
<updated>2022-05-02T00:00:00Z</updated>
|
||||||
<content type="xhtml">
|
<content type="xhtml">
|
||||||
<div xmlns="http://www.w3.org/1999/xhtml" style="font-family: Arial, Verdana, Helvetica, Sans-Serif;font-size: .8em;">
|
<div xmlns="http://www.w3.org/1999/xhtml" style="font-family: Arial, Verdana, Helvetica, Sans-Serif;font-size: .8em;">
|
||||||
<p>
|
<p>
|
||||||
<u style="font-size: .9em;">BUGFIX</u>
|
<u style="font-size: .9em;">CHANGE</u>
|
||||||
<br/>
|
<br/>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Fixed the discord bot Info command, to release the profile once the command has finished running.</li>
|
<li>World Save Backup - added the SaveGames folder to the to the backup zip file.</li>
|
||||||
</ul>
|
<li>World Save Restore - now restores the SaveGames folder.</li>
|
||||||
<u style="font-size: .9em;">NEW</u>
|
|
||||||
<br/>
|
|
||||||
<ul>
|
|
||||||
<li>ru-RU Translation file added.</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -220,7 +220,7 @@ namespace ServerManagerTool
|
||||||
Application.Current.Dispatcher.Invoke(() => this.Cursor = System.Windows.Input.Cursors.Wait);
|
Application.Current.Dispatcher.Invoke(() => this.Cursor = System.Windows.Input.Cursors.Wait);
|
||||||
await Task.Delay(500);
|
await Task.Delay(500);
|
||||||
|
|
||||||
var restoredFileCount = _profile.RestoreSaveFiles(item.File, item.IsArchiveFile);
|
var restoredFileCount = _profile.RestoreSaveFiles(item.File, item.IsArchiveFile, true);
|
||||||
|
|
||||||
var successMessage = _globalizer.GetResourceString("WorldSaveRestore_RestoreSuccessLabel");
|
var successMessage = _globalizer.GetResourceString("WorldSaveRestore_RestoreSuccessLabel");
|
||||||
successMessage = successMessage.Replace("{fileCount}", restoredFileCount.ToString());
|
successMessage = successMessage.Replace("{fileCount}", restoredFileCount.ToString());
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Plugin.Discord.UnitTests",
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ServerManager.Discord", "ServerManager.Discord\ServerManager.Discord.csproj", "{C4C8000D-5E45-497C-A218-B95A1567010E}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ServerManager.Discord", "ServerManager.Discord\ServerManager.Discord.csproj", "{C4C8000D-5E45-497C-A218-B95A1567010E}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UnitTests", "UnitTests", "{A7B846EF-9884-44DB-AF8F-3173DF1B3B66}"
|
||||||
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ServerManager.Common.UnitTests", "ServerManager.Common.UnitTests\ServerManager.Common.UnitTests.csproj", "{18271A4E-6135-466A-BCF8-80E25446F454}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug - AutoBackup|Any CPU = Debug - AutoBackup|Any CPU
|
Debug - AutoBackup|Any CPU = Debug - AutoBackup|Any CPU
|
||||||
|
|
@ -260,6 +264,18 @@ Global
|
||||||
{C4C8000D-5E45-497C-A218-B95A1567010E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{C4C8000D-5E45-497C-A218-B95A1567010E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{C4C8000D-5E45-497C-A218-B95A1567010E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{C4C8000D-5E45-497C-A218-B95A1567010E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{C4C8000D-5E45-497C-A218-B95A1567010E}.Release|Any CPU.Build.0 = Release|Any CPU
|
{C4C8000D-5E45-497C-A218-B95A1567010E}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{18271A4E-6135-466A-BCF8-80E25446F454}.Debug - AutoBackup|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{18271A4E-6135-466A-BCF8-80E25446F454}.Debug - AutoBackup|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{18271A4E-6135-466A-BCF8-80E25446F454}.Debug - AutoShutdown|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{18271A4E-6135-466A-BCF8-80E25446F454}.Debug - AutoShutdown|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{18271A4E-6135-466A-BCF8-80E25446F454}.Debug - AutoUpdate|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{18271A4E-6135-466A-BCF8-80E25446F454}.Debug - AutoUpdate|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{18271A4E-6135-466A-BCF8-80E25446F454}.Debug - Beta|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{18271A4E-6135-466A-BCF8-80E25446F454}.Debug - Beta|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{18271A4E-6135-466A-BCF8-80E25446F454}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{18271A4E-6135-466A-BCF8-80E25446F454}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{18271A4E-6135-466A-BCF8-80E25446F454}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{18271A4E-6135-466A-BCF8-80E25446F454}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|
@ -274,6 +290,7 @@ Global
|
||||||
{4CA9C894-518F-42D7-BBE2-CFDFE7A03F8A} = {44D8A1A2-01FF-4DD3-A201-AD9A26F7798D}
|
{4CA9C894-518F-42D7-BBE2-CFDFE7A03F8A} = {44D8A1A2-01FF-4DD3-A201-AD9A26F7798D}
|
||||||
{A8BFC452-5BE8-41E7-BD1D-C29B944185CE} = {F8DBCE70-4658-47CB-A508-B3951125F0ED}
|
{A8BFC452-5BE8-41E7-BD1D-C29B944185CE} = {F8DBCE70-4658-47CB-A508-B3951125F0ED}
|
||||||
{1434D87A-E9FC-48B9-BEC9-E5A3003F1F2E} = {F8DBCE70-4658-47CB-A508-B3951125F0ED}
|
{1434D87A-E9FC-48B9-BEC9-E5A3003F1F2E} = {F8DBCE70-4658-47CB-A508-B3951125F0ED}
|
||||||
|
{18271A4E-6135-466A-BCF8-80E25446F454} = {A7B846EF-9884-44DB-AF8F-3173DF1B3B66}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
SolutionGuid = {4201246C-6E53-4209-883D-A4F084C19187}
|
SolutionGuid = {4201246C-6E53-4209-883D-A4F084C19187}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net462</TargetFramework>
|
||||||
|
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
|
||||||
|
<RootNamespace>ServerManager.Common.UnitTests</RootNamespace>
|
||||||
|
<AssemblyName>ServerManager.Common.UnitTests</AssemblyName>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||||
|
<DebugType>none</DebugType>
|
||||||
|
<DebugSymbols>false</DebugSymbols>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Remove="ServerManager.Common.UnitTests.csproj.vspscc" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="MSTest.TestAdapter" Version="2.1.2" />
|
||||||
|
<PackageReference Include="MSTest.TestFramework" Version="2.1.2" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\ServerManager.Common\ServerManager.Common.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
50
src/ServerManager.Common.UnitTests/ZipUtilsUnitTest.cs
Normal file
50
src/ServerManager.Common.UnitTests/ZipUtilsUnitTest.cs
Normal file
|
|
@ -0,0 +1,50 @@
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||||
|
using ServerManagerTool.Common.Utils;
|
||||||
|
|
||||||
|
namespace ServerManager.Common.Tests
|
||||||
|
{
|
||||||
|
[TestClass]
|
||||||
|
public class ZipUtilsUnitTest
|
||||||
|
{
|
||||||
|
[TestMethod]
|
||||||
|
public void ZipUtils_()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var zipFile = FetchZipFile();
|
||||||
|
var destinationPath = Path.Combine(@"D:\_smtest", Path.GetFileNameWithoutExtension(zipFile));
|
||||||
|
var destinationPath1 = Path.Combine(destinationPath, "SavedArks");
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var count = ZipUtils.ExtractFiles(zipFile, destinationPath1, recurseFolders: false);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(3, count);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var exists = ZipUtils.DoesFolderExist(zipFile, "SaveGames");
|
||||||
|
// Assert
|
||||||
|
Assert.IsTrue(exists);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
count = ZipUtils.ExtractFiles(zipFile, destinationPath, sourceFolder: "SaveGames", recurseFolders: true);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(6, count);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
exists = ZipUtils.DoesFolderExist(zipFile, "AwesomeTeleporters");
|
||||||
|
// Assert
|
||||||
|
Assert.IsTrue(exists);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
count = ZipUtils.ExtractFiles(zipFile, destinationPath, sourceFolder: "AwesomeTeleporters", recurseFolders: true);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(1, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
private string FetchZipFile()
|
||||||
|
{
|
||||||
|
return @"D:\_smtest\new_theisland_20220501_221004.zip";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -21,7 +21,25 @@ namespace ServerManagerTool.Common.Utils
|
||||||
|
|
||||||
using (var zip = ZipFile.Read(zipFile))
|
using (var zip = ZipFile.Read(zipFile))
|
||||||
{
|
{
|
||||||
return zip.Entries.Any(e => Path.GetFileName(e.FileName).Equals(entryName, StringComparison.OrdinalIgnoreCase));
|
return zip.Entries.Any(e => !e.IsDirectory && Path.GetFileName(e.FileName).Equals(entryName, StringComparison.OrdinalIgnoreCase));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool DoesFolderExist(string zipFile, string folderName)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(zipFile))
|
||||||
|
throw new ArgumentNullException(nameof(zipFile));
|
||||||
|
if (string.IsNullOrWhiteSpace(folderName))
|
||||||
|
throw new ArgumentNullException(nameof(folderName));
|
||||||
|
|
||||||
|
if (!File.Exists(zipFile))
|
||||||
|
throw new FileNotFoundException();
|
||||||
|
|
||||||
|
using (var zip = ZipFile.Read(zipFile))
|
||||||
|
{
|
||||||
|
return zip.Entries.Any(e => e.IsDirectory && e.FileName.EndsWith($"{folderName}/", StringComparison.OrdinalIgnoreCase))
|
||||||
|
? true
|
||||||
|
: zip.Entries.Any(e => !e.IsDirectory && (e.FileName.StartsWith($"{folderName.ToLower()}/", StringComparison.OrdinalIgnoreCase) || e.FileName.ToLower().Contains($"/{folderName.ToLower()}/")));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -41,14 +59,14 @@ namespace ServerManagerTool.Common.Utils
|
||||||
|
|
||||||
using (var zip = ZipFile.Read(zipFile))
|
using (var zip = ZipFile.Read(zipFile))
|
||||||
{
|
{
|
||||||
var selection = zip.Entries.Where(e => Path.GetFileName(e.FileName).Equals(entryName, StringComparison.OrdinalIgnoreCase));
|
var selection = zip.Entries.Where(e => Path.GetFileName(e.FileName).Equals(entryName, StringComparison.OrdinalIgnoreCase)).ToList();
|
||||||
|
|
||||||
foreach (var entry in selection)
|
foreach (var entry in selection)
|
||||||
{
|
{
|
||||||
entry.Extract(destinationPath, ExtractExistingFileAction.OverwriteSilently);
|
entry.Extract(destinationPath, ExtractExistingFileAction.OverwriteSilently);
|
||||||
}
|
}
|
||||||
|
|
||||||
return selection.Count();
|
return selection.Count;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -70,6 +88,39 @@ namespace ServerManagerTool.Common.Utils
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int ExtractFiles(string zipFile, string destinationPath, string sourceFolder = "", bool recurseFolders = false)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(zipFile))
|
||||||
|
throw new ArgumentNullException(nameof(zipFile));
|
||||||
|
if (string.IsNullOrWhiteSpace(destinationPath))
|
||||||
|
throw new ArgumentNullException(nameof(destinationPath));
|
||||||
|
|
||||||
|
if (!Directory.Exists(destinationPath))
|
||||||
|
Directory.CreateDirectory(destinationPath);
|
||||||
|
|
||||||
|
if (sourceFolder is null)
|
||||||
|
sourceFolder = string.Empty;
|
||||||
|
if (sourceFolder.EndsWith("/"))
|
||||||
|
sourceFolder = sourceFolder.TrimEnd('/');
|
||||||
|
|
||||||
|
using (var zip = ZipFile.Read(zipFile))
|
||||||
|
{
|
||||||
|
var selection = new List<ZipEntry>();
|
||||||
|
|
||||||
|
if (recurseFolders)
|
||||||
|
selection.AddRange(zip.Entries.Where(e => !e.IsDirectory && (e.FileName.StartsWith($"{sourceFolder.ToLower()}/", StringComparison.OrdinalIgnoreCase) || e.FileName.ToLower().Contains($"/{sourceFolder.ToLower()}/"))));
|
||||||
|
else
|
||||||
|
selection.AddRange(zip.Entries.Where(e => !e.IsDirectory && Path.GetDirectoryName(e.FileName).Equals(sourceFolder, StringComparison.OrdinalIgnoreCase)));
|
||||||
|
|
||||||
|
foreach (var entry in selection)
|
||||||
|
{
|
||||||
|
entry.Extract(destinationPath, ExtractExistingFileAction.OverwriteSilently);
|
||||||
|
}
|
||||||
|
|
||||||
|
return selection.Count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void UpdateFiles(string zipFile, IEnumerable<string> filesToZip, string comment = "", bool preserveDirHierarchy = true, string directoryPathInArchive = "")
|
public static void UpdateFiles(string zipFile, IEnumerable<string> filesToZip, string comment = "", bool preserveDirHierarchy = true, string directoryPathInArchive = "")
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(zipFile))
|
if (string.IsNullOrWhiteSpace(zipFile))
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue