Merge branch 'main' into net8.0
commit
c37095d4c4
|
@ -13,6 +13,7 @@ using System.IO;
|
|||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using YamlDotNet.Serialization;
|
||||
using YamlDotNet.Serialization.NamingConventions;
|
||||
|
||||
|
@ -60,40 +61,35 @@ namespace LANCommander.SDK
|
|||
|
||||
ExtractFilesFromZip(tempFile, tempLocation);
|
||||
|
||||
var deserializer = new DeserializerBuilder()
|
||||
.WithNamingConvention(new PascalCaseNamingConvention())
|
||||
.Build();
|
||||
|
||||
#region Move files
|
||||
foreach (var savePath in manifest.SavePaths.Where(sp => sp.Type == "File"))
|
||||
{
|
||||
bool inInstallDir = savePath.Path.StartsWith("{InstallDir}");
|
||||
string tempSavePath = Path.Combine(tempLocation, savePath.Id.ToString());
|
||||
|
||||
var tempSavePathFile = Path.Combine(tempSavePath, savePath.Path.Replace('/', '\\').Replace("{InstallDir}\\", ""));
|
||||
|
||||
destination = Environment.ExpandEnvironmentVariables(savePath.Path.Replace('/', '\\').Replace("{InstallDir}", installDirectory));
|
||||
|
||||
if (File.Exists(tempSavePathFile))
|
||||
foreach (var entry in savePath.Entries)
|
||||
{
|
||||
// Is file, move file
|
||||
if (File.Exists(destination))
|
||||
File.Delete(destination);
|
||||
var tempSavePathFile = Path.Combine(tempSavePath, entry.ArchivePath);
|
||||
|
||||
File.Move(tempSavePathFile, destination);
|
||||
}
|
||||
else if (Directory.Exists(tempSavePath))
|
||||
{
|
||||
var files = Directory.GetFiles(tempSavePath, "*", SearchOption.AllDirectories);
|
||||
destination = Environment.ExpandEnvironmentVariables(entry.ActualPath).Replace("{InstallDir}", installDirectory);
|
||||
|
||||
if (inInstallDir)
|
||||
if (File.Exists(tempSavePathFile))
|
||||
{
|
||||
if (File.Exists(destination))
|
||||
File.Delete(destination);
|
||||
|
||||
File.Move(tempSavePathFile, destination);
|
||||
}
|
||||
else if (Directory.Exists(tempSavePath))
|
||||
{
|
||||
var files = Directory.GetFiles(tempSavePath, "*", SearchOption.AllDirectories);
|
||||
|
||||
foreach (var file in files)
|
||||
{
|
||||
if (inInstallDir)
|
||||
{
|
||||
// Files are in the game's install directory. Move them there from the save path.
|
||||
destination = file.Replace(tempSavePath, savePath.Path.Replace('/', '\\').TrimEnd('\\').Replace("{InstallDir}", installDirectory));
|
||||
destination = file.Replace(tempSavePath, savePath.Path.Replace('/', Path.DirectorySeparatorChar).TrimEnd(Path.DirectorySeparatorChar).Replace("{InstallDir}", installDirectory));
|
||||
|
||||
if (File.Exists(destination))
|
||||
File.Delete(destination);
|
||||
|
@ -103,7 +99,7 @@ namespace LANCommander.SDK
|
|||
else
|
||||
{
|
||||
// Specified path is probably an absolute path, maybe with environment variables.
|
||||
destination = Environment.ExpandEnvironmentVariables(file.Replace(tempSavePathFile, savePath.Path.Replace('/', '\\')));
|
||||
destination = Environment.ExpandEnvironmentVariables(file.Replace(tempSavePathFile, savePath.Path.Replace('/', Path.DirectorySeparatorChar)));
|
||||
|
||||
if (File.Exists(destination))
|
||||
File.Delete(destination);
|
||||
|
@ -112,10 +108,6 @@ namespace LANCommander.SDK
|
|||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
@ -163,31 +155,42 @@ namespace LANCommander.SDK
|
|||
#region Add files from defined paths
|
||||
foreach (var savePath in manifest.SavePaths.Where(sp => sp.Type == "File"))
|
||||
{
|
||||
var localPath = Environment.ExpandEnvironmentVariables(savePath.Path.Replace('/', '\\').Replace("{InstallDir}", installDirectory));
|
||||
IEnumerable<string> localPaths;
|
||||
|
||||
if (Directory.Exists(localPath))
|
||||
if (savePath.IsRegex)
|
||||
{
|
||||
AddDirectoryToZip(archive, localPath, localPath, savePath.Id);
|
||||
}
|
||||
else if (File.Exists(localPath))
|
||||
{
|
||||
archive.AddEntry(Path.Combine(savePath.Id.ToString(), savePath.Path.Replace("{InstallDir}/", "")), localPath);
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
var regex = new Regex(Environment.ExpandEnvironmentVariables(savePath.Path.Replace('/', '\\').Replace("{InstallDir}", installDirectory)));
|
||||
|
||||
#region Add files from defined paths
|
||||
foreach (var savePath in manifest.SavePaths.Where(sp => sp.Type == "File"))
|
||||
{
|
||||
var localPath = Environment.ExpandEnvironmentVariables(savePath.Path.Replace('/', '\\').Replace("{InstallDir}", installDirectory));
|
||||
|
||||
if (Directory.Exists(localPath))
|
||||
{
|
||||
AddDirectoryToZip(archive, localPath, localPath, savePath.Id);
|
||||
localPaths = Directory.GetFiles(installDirectory, "*", SearchOption.AllDirectories)
|
||||
.Where(p => regex.IsMatch(p))
|
||||
.ToList();
|
||||
}
|
||||
else if (File.Exists(localPath))
|
||||
else
|
||||
localPaths = new string[] { savePath.Path };
|
||||
|
||||
var entries = new List<SavePathEntry>();
|
||||
|
||||
foreach (var localPath in localPaths)
|
||||
{
|
||||
archive.AddEntry(Path.Combine(savePath.Id.ToString(), savePath.Path.Replace("{InstallDir}/", "")), localPath);
|
||||
var actualPath = Environment.ExpandEnvironmentVariables(savePath.Path.Replace('/', Path.DirectorySeparatorChar).Replace("{InstallDir}", installDirectory));
|
||||
var relativePath = actualPath.Replace(installDirectory + Path.DirectorySeparatorChar, "");
|
||||
|
||||
if (Directory.Exists(actualPath))
|
||||
{
|
||||
AddDirectoryToZip(archive, relativePath, actualPath, savePath.Id);
|
||||
}
|
||||
else if (File.Exists(actualPath))
|
||||
{
|
||||
archive.AddEntry(Path.Combine(savePath.Id.ToString(), relativePath), actualPath);
|
||||
}
|
||||
|
||||
entries.Add(new SavePathEntry
|
||||
{
|
||||
ArchivePath = relativePath,
|
||||
ActualPath = actualPath.Replace(installDirectory, "{InstallDir}")
|
||||
});
|
||||
|
||||
savePath.Entries = entries;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
@ -225,7 +228,11 @@ namespace LANCommander.SDK
|
|||
}
|
||||
#endregion
|
||||
|
||||
archive.AddEntry("_manifest.yml", ManifestHelper.GetPath(installDirectory));
|
||||
var tempManifest = Path.GetTempFileName();
|
||||
|
||||
File.WriteAllText(tempManifest, ManifestHelper.Serialize(manifest));
|
||||
|
||||
archive.AddEntry("_manifest.yml", tempManifest);
|
||||
|
||||
using (var ms = new MemoryStream())
|
||||
{
|
||||
|
|
|
@ -43,13 +43,7 @@ namespace LANCommander.SDK.Helpers
|
|||
|
||||
Logger?.LogTrace("Attempting to write manifest to path {Destination}", destination);
|
||||
|
||||
var serializer = new SerializerBuilder()
|
||||
.WithNamingConvention(new PascalCaseNamingConvention())
|
||||
.Build();
|
||||
|
||||
Logger?.LogTrace("Serializing manifest");
|
||||
|
||||
var yaml = serializer.Serialize(manifest);
|
||||
var yaml = Serialize(manifest);
|
||||
|
||||
Logger?.LogTrace("Writing manifest file");
|
||||
|
||||
|
@ -58,6 +52,19 @@ namespace LANCommander.SDK.Helpers
|
|||
return destination;
|
||||
}
|
||||
|
||||
public static string Serialize(GameManifest manifest)
|
||||
{
|
||||
var serializer = new SerializerBuilder()
|
||||
.WithNamingConvention(new PascalCaseNamingConvention())
|
||||
.Build();
|
||||
|
||||
Logger?.LogTrace("Serializing manifest");
|
||||
|
||||
var yaml = serializer.Serialize(manifest);
|
||||
|
||||
return yaml;
|
||||
}
|
||||
|
||||
public static string GetPath(string installDirectory)
|
||||
{
|
||||
return Path.Combine(installDirectory, ManifestFilename);
|
||||
|
|
|
@ -47,5 +47,13 @@ namespace LANCommander.SDK
|
|||
public Guid Id { get; set; }
|
||||
public string Type { get; set; }
|
||||
public string Path { get; set; }
|
||||
public bool IsRegex { get; set; }
|
||||
public IEnumerable<SavePathEntry> Entries { get; set; }
|
||||
}
|
||||
|
||||
public class SavePathEntry
|
||||
{
|
||||
public string ArchivePath { get; set; }
|
||||
public string ActualPath { get; set; }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@ namespace LANCommander.SDK.Models
|
|||
{
|
||||
public SavePathType Type { get; set; }
|
||||
public string Path { get; set; }
|
||||
public bool IsRegex { get; set; }
|
||||
public virtual Game Game { get; set; }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -58,11 +58,18 @@
|
|||
ICollection<Script> Scripts { get; set; } = new List<Script>();
|
||||
|
||||
protected override async Task OnParametersSetAsync()
|
||||
{
|
||||
await LoadData();
|
||||
}
|
||||
|
||||
private async Task LoadData()
|
||||
{
|
||||
if (GameId != Guid.Empty)
|
||||
Scripts = await ScriptService.Get(s => s.GameId == GameId).ToListAsync();
|
||||
else if (RedistributableId != Guid.Empty)
|
||||
Scripts = await ScriptService.Get(s => s.RedistributableId == RedistributableId).ToListAsync();
|
||||
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
private async void Edit(Guid? scriptId = null)
|
||||
|
@ -89,10 +96,8 @@
|
|||
|
||||
modalRef.OnOk = async (script) =>
|
||||
{
|
||||
|
||||
await LoadData();
|
||||
};
|
||||
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
private async void Delete(Script script = null)
|
||||
|
|
|
@ -85,6 +85,16 @@
|
|||
{
|
||||
if (Options.ScriptId != Guid.Empty)
|
||||
Script = await ScriptService.Get(Options.ScriptId);
|
||||
else if (Options.GameId != Guid.Empty)
|
||||
Script = new Script()
|
||||
{
|
||||
GameId = Options.GameId
|
||||
};
|
||||
else if (Options.RedistributableId != Guid.Empty)
|
||||
Script = new Script()
|
||||
{
|
||||
RedistributableId = Options.RedistributableId
|
||||
};
|
||||
|
||||
Snippets = ScriptService.GetSnippets();
|
||||
}
|
||||
|
@ -162,15 +172,24 @@
|
|||
|
||||
private async Task Save()
|
||||
{
|
||||
var value = await Editor.GetValue();
|
||||
try
|
||||
{
|
||||
var value = await Editor.GetValue();
|
||||
|
||||
Script.Contents = value;
|
||||
Script.Contents = value;
|
||||
|
||||
if (Script.Id == Guid.Empty)
|
||||
Script = await ScriptService.Add(Script);
|
||||
else
|
||||
Script = await ScriptService.Update(Script);
|
||||
if (Script.Id == Guid.Empty)
|
||||
Script = await ScriptService.Add(Script);
|
||||
else
|
||||
Script = await ScriptService.Update(Script);
|
||||
|
||||
await MessageService.Success("Script saved!");
|
||||
MessageService.Success("Script saved!");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageService.Error("Script could not be saved!");
|
||||
|
||||
throw ex;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -30,7 +30,7 @@ namespace LANCommander.Controllers
|
|||
if (!System.IO.File.Exists(filename))
|
||||
return NotFound();
|
||||
|
||||
return File(new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read), "application/zip", $"{save.User?.UserName} - {save.Game?.Title} - {save.CreatedOn.ToString("MM-dd-yyyy.hh-mm")}");
|
||||
return File(new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read), "application/zip", $"{save.User?.UserName} - {(save.Game == null ? "Unknown" : save.Game?.Title)} - {save.CreatedOn.ToString("MM-dd-yyyy.hh-mm")}.zip");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,6 +10,7 @@ namespace LANCommander.Data.Models
|
|||
{
|
||||
public SavePathType Type { get; set; }
|
||||
public string Path { get; set; }
|
||||
public bool IsRegex { get; set; }
|
||||
|
||||
public Guid? GameId { get; set; }
|
||||
[JsonIgnore]
|
||||
|
|
1694
LANCommander/Migrations/20231106061719_AddRegexFlagToSavePath.Designer.cs
generated
Normal file
1694
LANCommander/Migrations/20231106061719_AddRegexFlagToSavePath.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,29 @@
|
|||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace LANCommander.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class AddRegexFlagToSavePath : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.AddColumn<bool>(
|
||||
name: "IsRegex",
|
||||
table: "SavePaths",
|
||||
type: "INTEGER",
|
||||
nullable: false,
|
||||
defaultValue: false);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropColumn(
|
||||
name: "IsRegex",
|
||||
table: "SavePaths");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -692,6 +692,9 @@ namespace LANCommander.Migrations
|
|||
b.Property<Guid?>("GameId")
|
||||
.HasColumnType("TEXT");
|
||||
|
||||
b.Property<bool>("IsRegex")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<string>("Path")
|
||||
.IsRequired()
|
||||
.HasColumnType("TEXT");
|
||||
|
|
|
@ -17,6 +17,9 @@
|
|||
<FilePicker @bind-Value="context.Path" ArchiveId="@ArchiveId" AllowDirectories="true" />
|
||||
}
|
||||
</PropertyColumn>
|
||||
<PropertyColumn Property="p => p.IsRegex" Title="Regex">
|
||||
<Checkbox @bind-Checked="context.IsRegex" />
|
||||
</PropertyColumn>
|
||||
<ActionColumn>
|
||||
<Space Style="display: flex; justify-content: end">
|
||||
<SpaceItem>
|
||||
|
|
|
@ -44,7 +44,7 @@ namespace LANCommander.Services
|
|||
|
||||
public string GetSavePath(GameSave save)
|
||||
{
|
||||
return Path.Combine(Settings.UserSaves.StoragePath, save.UserId.ToString(), $"{save.Id}.zip");
|
||||
return Path.Combine(Settings.UserSaves.StoragePath, save.UserId.ToString(), $"{save.Id}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -114,6 +114,7 @@ namespace LANCommander.Services
|
|||
{
|
||||
Id = p.Id,
|
||||
Path = p.Path,
|
||||
IsRegex = p.IsRegex,
|
||||
Type = p.Type.ToString()
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue