Skip to content

Commit

Permalink
feat: dirty hacks for Camo
Browse files Browse the repository at this point in the history
  • Loading branch information
Rast1234 committed Oct 23, 2022
1 parent 9dd4c4b commit 4c7a88f
Show file tree
Hide file tree
Showing 4 changed files with 103 additions and 5 deletions.
6 changes: 6 additions & 0 deletions SyncFaction.Core/Services/FactionFiles/FfClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,12 @@ public async Task<bool> DownloadAndUnpackMod(IDirectoryInfo modDir, IMod mod, Ca
log.LogDebug($"Downloading mod: {mod.Name} ({(double)mod.Size/1024/1024:F2} MiB)");
if (modDir.Exists)
{
if (modDir.EnumerateFiles().Any(x => !x.Name.StartsWith(".mod")))
{
// skip DL and unpack if something is upnacked. this does not account for previous failures but will be here until next version
return true;
}

// clear directory except for original downloaded file
foreach (var file in modDir.EnumerateFiles().Where(x => !x.Name.StartsWith(".mod")))
{
Expand Down
19 changes: 19 additions & 0 deletions SyncFaction.Core/Services/FactionFiles/LocalMod.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using System.Text.Json.Serialization;

namespace SyncFaction.Core.Services.FactionFiles;

public class LocalMod : IMod
{
public string Name { get; init; }
public long Size { get; init; }
public string? ImageUrl { get; set; }
public string DownloadUrl { get; init; }
public string IdString => $"{Name}";
public string BrowserUrl => string.Empty;
public DateTime CreatedAt => DateTime.MinValue;
public string? ImagePath => null;
public string Markdown => @$"# **{Name}**
Local mod folder in `data/.syncfaction`";
public override string ToString() => $"{Name}";
}
78 changes: 75 additions & 3 deletions SyncFaction.Core/Services/UiCommands.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,49 @@ public async Task<bool> PopulateData(IStorage storage, CancellationToken token)
return true;
}

// add local mods to list unconditionally
AddLocalMods(storage);


if (stateProvider.State.DevMode)
{
log.LogWarning($"Skipped reading mods and news from FactionFiles because DevMode is enabled");
return true;
}

// populate mod list
await Connect(token);
await Connect(storage, token);
return true;
}

private void AddLocalMods(IStorage storage)
{
items.Add(new SeparatorItem("▷ Local Mods ◁"));
List<IMod> mods = new ();
foreach (var dir in storage.App.EnumerateDirectories())
{
if (dir.Name.StartsWith("."))
{
continue;
}

if (dir.Name.StartsWith("Mod_") && dir.Name.Substring(4).All(char.IsDigit))
{
continue;
}

var mod = new LocalMod()
{
Name = dir.Name,
Size = 0,
DownloadUrl = null,
ImageUrl = null
};
mods.Add(mod);
}
items.AddRange(mods);
}

public async Task ApplySelectedAndRun(IStorage storage, IMod? mod, CancellationToken token)
{
var applied = await ApplySelected(storage, mod, token);
Expand Down Expand Up @@ -102,6 +140,11 @@ public async Task CheckCommunityUpdates(IStorage storage, CancellationToken toke
log.LogInformation("Reading current state...");
stateProvider.State = storage.LoadState() ?? new State();
log.LogInformation($"Installed community patch and updates: **{stateProvider.State.GetHumanReadableCommunityVersion()}**");
if (stateProvider.State.DevMode)
{
log.LogWarning($"Skipped online update check because DevMode is enabled");
return;
}
patchId = await ffClient.GetCommunityPatchId(token);
updateIds = await ffClient.GetCommunityUpdateIds(token);
if (stateProvider.State.CommunityPatch != patchId || !stateProvider.State.CommunityUpdates.SequenceEqual(updateIds))
Expand Down Expand Up @@ -149,11 +192,13 @@ public async Task Restore(IStorage storage, bool toVanilla, CancellationToken to
}
}

public async Task Connect(CancellationToken token)
public async Task Connect(IStorage storage, CancellationToken token)
{
log.LogDebug($"Downloading map lists from FactionFiles...");
items.Clear();

AddLocalMods(storage);

// upd list
await AddNonEmptyCategoryItems(Category.MapPacks, "▷ Map Packs ◁", token);
await AddNonEmptyCategoryItems(Category.MpMaps, "▷ MP Maps ◁", token);
Expand Down Expand Up @@ -196,6 +241,30 @@ public async Task<string> Detect(CancellationToken token)

public async Task<bool> UpdateCommunityPatch(IStorage storage, CancellationToken token)
{
if (!newCommunityVersion || patchId == 0 || updateIds == null)
{
patchId = await ffClient.GetCommunityPatchId(token);
updateIds = await ffClient.GetCommunityUpdateIds(token);
if (stateProvider.State.CommunityPatch != patchId || !stateProvider.State.CommunityUpdates.SequenceEqual(updateIds))
{
log.LogInformation($"* [Community patch base (id {patchId})]({FormatUrl(patchId)})");
var i = 1;
foreach (var update in updateIds)
{
log.LogInformation($"* [Community patch update {i} (id {update})]({FormatUrl(update)})");
i++;
}
newCommunityVersion = true;
}
else
{
newCommunityVersion = false;
}

string FormatUrl(long x) => string.Format(Constants.BrowserUrlTemplate, x);
}

// try again
if (!newCommunityVersion || patchId == 0 || updateIds == null)
{
log.LogError($"Install community patch failed. please contact developer. `newCommunityVersion=[{newCommunityVersion}], patch=[{patchId}], update count=[{updateIds?.Count}]`");
Expand Down Expand Up @@ -262,7 +331,10 @@ private async Task<bool> UpdateInternal(Mod patch, IEnumerable<Mod> allUpdates,
private async Task<bool> InstallMod(IStorage storage, IMod mod, CancellationToken token)
{
var modDir = storage.GetModDir(mod);
await ffClient.DownloadAndUnpackMod(modDir, mod, token);
if (mod is not LocalMod)
{
await ffClient.DownloadAndUnpackMod(modDir, mod, token);
}

var files = string.Join(", ", modDir.GetFiles().Select(x => $"`{x.Name}`"));
log.LogDebug($"Mod contents: {files}");
Expand Down
5 changes: 3 additions & 2 deletions SyncFaction/MainWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@ private async void connect_Click(object sender, RoutedEventArgs e)
{
remoteList.UnselectAll();
render.Clear();
await Task.Run(async () => { await uiCommands.Connect(token); }, token);
var storage = new Storage(directory.Text, fileSystem);
await Task.Run(async () => { await uiCommands.Connect(storage, token); }, token);
remoteList.Items.Clear();
foreach (var x in uiCommands.items)
{
Expand Down Expand Up @@ -130,7 +131,7 @@ private async void update_Click(object sender, RoutedEventArgs e)
// same as "connect" action: get mod list and news page
remoteList.UnselectAll();
render.Clear();
await Task.Run(async () => { await uiCommands.Connect(token); }, token);
await Task.Run(async () => { await uiCommands.Connect(filesystem, token); }, token);
remoteList.Items.Clear();
foreach (var x in uiCommands.items)
{
Expand Down

0 comments on commit 4c7a88f

Please sign in to comment.