Skip to content

Commit

Permalink
Latest changes
Browse files Browse the repository at this point in the history
  • Loading branch information
halgari committed Jun 20, 2022
1 parent ebc81be commit fc5404e
Show file tree
Hide file tree
Showing 15 changed files with 328 additions and 24 deletions.
13 changes: 13 additions & 0 deletions .idea/.idea.cesi/.idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

19 changes: 19 additions & 0 deletions cesi.DTOs/Analyzed.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using CouchDB.Driver.Types;

namespace cesi.DTOs;

public class Analyzed : CouchDocument
{

public string xxHash64 { get; set; }
public string MD5 { get; set; }
public string SHA1 { get; set; }
public string SHA256 { get; set; }
public string SHA512 { get; set; }
public string CRC32 { get; set; }
public long Size { get; set; }
public Archive? Archive { get; set; }
public Plugin? Plugin { get; set; }
public DDS? DDS { get; set; }
public Source[]? Source { get; set; }
}
7 changes: 7 additions & 0 deletions cesi.DTOs/Archive.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace cesi.DTOs;

public class Archive
{
public string Type { get; set; }
public Dictionary<string, string> Entries { get; set; } = new();
}
9 changes: 9 additions & 0 deletions cesi.DTOs/DDS.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace cesi.DTOs;

public class DDS
{
public int Width { get; set; }
public int Height { get; set; }
public string Format { get; set; }
public string PHash { get; set; }
}
13 changes: 13 additions & 0 deletions cesi.DTOs/Plugin.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace cesi.DTOs;

public class Plugin
{
public string Name { get; set; }
public string Author { get; set; }
public string Description { get; set; }
public uint FormVersion { get; set; }
public string ModType { get; set; }
public bool IsMaster { get; set; }
public bool IsLightMaster { get; set; }
public string[] MasterReferences { get; set; } = Array.Empty<string>();
}
13 changes: 13 additions & 0 deletions cesi.DTOs/Source.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace cesi.DTOs;

public class Source
{
public NexusSource? Nexus { get; set; }
}

public class NexusSource
{
public string Game { get; set; }
public long ModId { get; set; }
public long FileId { get; set; }
}
13 changes: 13 additions & 0 deletions cesi.DTOs/cesi.DTOs.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="CouchDB.NET" Version="3.1.1" />
</ItemGroup>

</Project>
6 changes: 6 additions & 0 deletions cesi.sln
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
Microsoft Visual Studio Solution File, Format Version 12.00
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cesi", "cesi\cesi.csproj", "{02CC08F0-F89D-4EF1-B799-23B79F7677C5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cesi.DTOs", "cesi.DTOs\cesi.DTOs.csproj", "{CDEDE745-31CA-43D5-8FE5-797865DF8BC9}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand All @@ -12,5 +14,9 @@ Global
{02CC08F0-F89D-4EF1-B799-23B79F7677C5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{02CC08F0-F89D-4EF1-B799-23B79F7677C5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{02CC08F0-F89D-4EF1-B799-23B79F7677C5}.Release|Any CPU.Build.0 = Release|Any CPU
{CDEDE745-31CA-43D5-8FE5-797865DF8BC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CDEDE745-31CA-43D5-8FE5-797865DF8BC9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CDEDE745-31CA-43D5-8FE5-797865DF8BC9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CDEDE745-31CA-43D5-8FE5-797865DF8BC9}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal
2 changes: 1 addition & 1 deletion cesi/Analyzers/Archive.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public async Task Analyze(Utf8JsonWriter writer, JsonSerializerOptions options,
foreach (var file in tempPath.Path.EnumerateFiles())
{
var hash = await file.Hash();
writer.WriteString(file.RelativeTo(tempPath.Path).ToString(), hash.ToHex());
writer.WriteString(file.RelativeTo(tempPath.Path).ToString(), hash.ToCompatibleHex());
await analyzeSubFile(file);
}
writer.WriteEndObject();
Expand Down
33 changes: 33 additions & 0 deletions cesi/Analyzers/DDS.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
using System.Drawing;
using Shipwreck.Phash;
using Wabbajack.DTOs.Texture;
using Wabbajack.Hashing.PHash;
using Wabbajack.Hashing.xxHash64;
using Wabbajack.Paths;

namespace cesi.Analyzers;

public class DDS : Analyzer<cesi.DTOs.DDS>
{
protected override async Task<DTOs.DDS?> Analyze(Stream stream, Func<AbsolutePath, Task> analyzeSubFile, CancellationToken token)
{
try
{

var data = await ImageLoader.Load(stream);
return new DTOs.DDS
{
Width = data.Width,
Height = data.Height,
Format = data.Format.ToString(),
PHash = data.PerceptualHash.Data.ToHex()
};
}
catch (Exception ex)
{
return null;
}
}

public override string Name => "DDS";
}
50 changes: 50 additions & 0 deletions cesi/Analyzers/Plugin.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
using System.Text.Json;
using Mutagen.Bethesda.Fallout4;
using Mutagen.Bethesda.Plugins;
using Mutagen.Bethesda.Skyrim;
using Wabbajack.Common;
using Wabbajack.Common.FileSignatures;
using Wabbajack.Paths;

namespace cesi.Analyzers;

public class Plugin : IAnalyzer
{
public string Name => "Plugin";
public Type DTOType => throw new NotImplementedException();
public IEnumerable<FileType> LimitSignatures { get; }

private HashSet<Extension> Extensions = new() {Ext.Esp, Ext.Esm, new Extension(".esl")};
public async Task Analyze(Utf8JsonWriter writer, JsonSerializerOptions options, AbsolutePath path, Func<AbsolutePath, Task> analyzeSubFile,
CancellationToken token)
{
if (!Extensions.Contains(path.Extension)) return;

var file = SkyrimMod.CreateFromBinary(new ModPath(path.ToString()), SkyrimRelease.SkyrimSE);

writer.WritePropertyName("Plugin");
writer.WriteStartObject();
writer.WriteString("Name", file.ModKey.FileName);
writer.WriteString("Author", file.ModHeader.Author);
writer.WriteString("Description", file.ModHeader.Description);
writer.WriteNumber("FormVersion", file.ModHeader.FormVersion);
writer.WriteString("ModType", file.ModKey.Type.ToString());
writer.WriteBoolean("IsLightMaster", file.ModHeader.Flags.HasFlag(SkyrimModHeader.HeaderFlag.LightMaster));
writer.WriteBoolean("IsMaster", file.ModHeader.Flags.HasFlag(SkyrimModHeader.HeaderFlag.Master));
if (file.ModHeader.MasterReferences.Any())
{
writer.WritePropertyName("MasterReferences");
writer.WriteStartArray();
foreach (var master in file.ModHeader.MasterReferences)
{
writer.WriteStringValue(master.Master.FileName);
}
writer.WriteEndArray();
}

writer.WriteEndObject();

return;

}
}
80 changes: 80 additions & 0 deletions cesi/Analyzers/Source.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
using System.Text.Json;
using Wabbajack.Common;
using Wabbajack.Common.FileSignatures;
using Wabbajack.Downloaders;
using Wabbajack.DTOs;
using Wabbajack.DTOs.DownloadStates;
using Wabbajack.Installer;
using Wabbajack.Paths;
using Wabbajack.Paths.IO;

namespace cesi.Analyzers;

public class Source : IAnalyzer
{
private readonly DownloadDispatcher _dispatcher;
public string Name { get; }
public Type DTOType { get; }
public IEnumerable<FileType> LimitSignatures { get; }

public Source(DownloadDispatcher dispatcher)
{
_dispatcher = dispatcher;
}

public async Task Analyze(Utf8JsonWriter writer, JsonSerializerOptions options, AbsolutePath path, Func<AbsolutePath, Task> analyzeSubFile,
CancellationToken token)
{
var meta = path.WithExtension(Ext.Meta);
if (!meta.FileExists())
return;

var ini = await _dispatcher.ResolveArchive(meta.LoadIniFile()["General"]
.ToDictionary(d => d.KeyName, d => d.Value));
if (ini == null) return;

writer.WritePropertyName("Source");
writer.WriteStartArray();

writer.WriteStartObject();
switch (ini)
{
case Nexus n:
writer.WritePropertyName("Nexus");
writer.WriteStartObject();

writer.WriteString("Game", n.Game.MetaData().NexusName);
writer.WriteNumber("ModId", n.ModID);
writer.WriteNumber("Number", n.FileID);

writer.WriteEndObject();

break;
case GameFileSource g:
writer.WritePropertyName("GameFile");
writer.WriteStartObject();

writer.WriteString("Game", g.Game.ToString());
writer.WriteString("Version", g.GameVersion);
writer.WriteString("Path", g.GameFile.ToString());

writer.WriteEndObject();
break;
case Http h:
writer.WritePropertyName("Http");
writer.WriteStartObject();

writer.WriteString("Url", h.Url.ToString());

writer.WriteEndObject();
break;
default:
throw new NotImplementedException();

}

writer.WriteEndObject();
writer.WriteEndArray();

}
}
31 changes: 26 additions & 5 deletions cesi/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,23 @@
using cesi;
using cesi.Analyzers;
using cesi.Verbs;
using CouchDB.Driver;
using CouchDB.Driver.Options;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using NLog.Extensions.Logging;
using NLog.Targets;
using Wabbajack.Downloaders;
using Wabbajack.DTOs;
using Wabbajack.FileExtractor;
using Wabbajack.Networking.Http;
using Wabbajack.Networking.Http.Interfaces;
using Wabbajack.Paths;
using Wabbajack.Paths.IO;
using Wabbajack.RateLimiter;
using Wabbajack.Services.OSIntegrated;

TypeDescriptor.AddAttributes(typeof(AbsolutePath),
new TypeConverterAttribute(typeof(AbsolutePathTypeConverter)));
Expand All @@ -26,17 +31,29 @@
.ConfigureServices((host, services) =>
{
services.AddSingleton(new JsonSerializerOptions());

services.AddSingleton<IVerb, AnalyzeDirectory>();

services.AddSingleton<CommandLineBuilder>();
services.AddSingleton<IConsole, SystemConsole>();

/*
services.AddSingleton<HttpClient, HttpClient>();
services.AddSingleton<IHttpDownloader, SingleThreadedDownloader>();
services.AddSingleton<IConsole, SystemConsole>();
services.AddSingleton<CommandLineBuilder>();
services.AddSingleton<TemporaryFileManager>();
services.AddSingleton<FileExtractor>();
services.AddSingleton<IVerb, AnalyzeDirectory>();

services.AddSingleton<ParallelOptions>(s => new ParallelOptions());
services.AddAllSingleton<IResource, IResource<FileExtractor>>(s =>
new Resource<FileExtractor>("File Extractor", maxTasks:4));
*/

services.AddSingleton<CouchClient>(s => new CouchClient("http://localhost:15984", builder =>
{
builder.UseBasicAuthentication("cesi", "password");
builder.SetPropertyCase(PropertyCaseType.None);
builder.SetJsonNullValueHandling(NullValueHandling.Ignore);
}));

services.AddSingleton<IAnalyzer, MD5>();
services.AddSingleton<IAnalyzer, SHA1>();
Expand All @@ -46,10 +63,14 @@
services.AddSingleton<IAnalyzer, CRC32>();
services.AddSingleton<IAnalyzer, Size>();
services.AddSingleton<IAnalyzer, cesi.Analyzers.Archive>();
services.AddSingleton<IAnalyzer, Plugin>();
services.AddSingleton<IAnalyzer, DDS>();
services.AddSingleton<IAnalyzer, Source>();
services.AddOSIntegrated();

}).Build();

var service = host.Services.GetService<CommandLineBuilder>();
var service = host.Services.GetRequiredService<CommandLineBuilder>();
return await service!.Run(args);

void AddLogging(ILoggingBuilder loggingBuilder)
Expand Down
Loading

0 comments on commit fc5404e

Please sign in to comment.