Files
ZuneModdingHelper/ZuneModCore/Mod.cs
T

113 lines
3.2 KiB
C#
Raw Normal View History

2021-04-25 22:59:36 -05:00
using OwlCore.AbstractUI.Models;
using System;
using System.Collections.Generic;
using System.IO;
2022-03-01 14:14:11 -06:00
using System.Linq;
2021-04-25 22:59:36 -05:00
using System.Threading.Tasks;
using ZuneModCore.Mods;
namespace ZuneModCore
{
public abstract class Mod
{
public abstract string Id { get; }
public abstract string Title { get; }
public abstract string Description { get; }
2021-04-26 18:05:19 -05:00
public abstract string Author { get; }
2021-11-10 21:21:25 -06:00
public virtual AbstractUICollection? GetDefaultOptionsUI() => null;
2021-08-05 20:45:26 -05:00
2021-04-25 22:59:36 -05:00
public virtual Task Init() => Task.CompletedTask;
public abstract Task<string?> Apply();
2021-04-25 22:59:36 -05:00
public abstract Task<string?> Reset();
2021-04-25 22:59:36 -05:00
2021-11-10 21:21:25 -06:00
private AbstractUICollection? _OptionsUI;
public AbstractUICollection? OptionsUI
2021-08-05 20:45:26 -05:00
{
get
{
if (_OptionsUI == null)
_OptionsUI = GetDefaultOptionsUI();
return _OptionsUI;
}
set => _OptionsUI = value;
}
2021-04-25 22:59:36 -05:00
public string StorageDirectory
{
get
{
2022-03-01 14:14:11 -06:00
string dir = Path.Combine(ModManager.CoreStorageDir, Id);
// Create the directory just in case the consumer assumes the folder exists already
Directory.CreateDirectory(dir);
return dir;
}
}
2021-04-25 22:59:36 -05:00
2022-03-01 14:14:11 -06:00
public abstract IReadOnlyList<ModDependency>? DependentMods { get; }
/// <summary>
/// Initializes any missing depedencies.
/// </summary>
public Task InitDependencies() => ForAllDependencies(async mod =>
{
bool isDepApplied = await mod.CheckApplied();
if (!isDepApplied)
await mod.Init();
});
/// <summary>
/// Applies any missing depedencies.
/// </summary>
/// <remarks>
/// Make sure to call <see cref="InitDependencies"/> first.
/// </remarks>
public Task ApplyDependencies() => ForAllDependencies(async mod =>
{
bool isDepApplied = await mod.CheckApplied();
if (!isDepApplied)
await mod.Apply();
});
public Task<bool> CheckApplied() => TrueForAllDependencies(mod => mod.CheckApplied());
private async Task ForAllDependencies(Func<Mod, Task> asyncAction)
{
// Check if there are any dependencies
if (DependentMods == null)
return;
foreach (var dep in DependentMods)
{
var depMod = ModManager.AvailableMods.First(m => m.Id == dep.Id);
if (depMod != null)
await asyncAction(depMod);
}
}
private async Task<bool> TrueForAllDependencies(Func<Mod, Task<bool>> asyncAction)
{
// Check if there are any dependencies
if (DependentMods == null)
return true;
foreach (var dep in DependentMods)
{
var depMod = ModManager.AvailableMods.First(m => m.Id == dep.Id);
if (depMod != null)
if (!await asyncAction(depMod))
return false;
}
return true;
}
public override string ToString() => Title;
2021-04-25 22:59:36 -05:00
}
}