mirror of
https://github.com/Artemis-RGB/Artemis
synced 2025-12-12 13:28:33 +00:00
Core - Simplify PluginInfo and PluginFeatureInfo
This commit is contained in:
parent
baae4af153
commit
ba3838489f
@ -9,13 +9,8 @@ namespace Artemis.Core;
|
||||
/// <summary>
|
||||
/// Represents basic info about a plugin feature and contains a reference to the instance of said feature
|
||||
/// </summary>
|
||||
public class PluginFeatureInfo : CorePropertyChanged, IPrerequisitesSubject
|
||||
public class PluginFeatureInfo : IPrerequisitesSubject
|
||||
{
|
||||
private string? _description;
|
||||
private PluginFeature? _instance;
|
||||
private Exception? _loadException;
|
||||
private string _name = null!;
|
||||
|
||||
internal PluginFeatureInfo(Plugin plugin, Type featureType, PluginFeatureEntity pluginFeatureEntity, PluginFeatureAttribute? attribute)
|
||||
{
|
||||
Plugin = plugin ?? throw new ArgumentNullException(nameof(plugin));
|
||||
@ -53,29 +48,17 @@ public class PluginFeatureInfo : CorePropertyChanged, IPrerequisitesSubject
|
||||
/// <summary>
|
||||
/// Gets the exception thrown while loading
|
||||
/// </summary>
|
||||
public Exception? LoadException
|
||||
{
|
||||
get => _loadException;
|
||||
internal set => SetAndNotify(ref _loadException, value);
|
||||
}
|
||||
public Exception? LoadException { get; internal set; }
|
||||
|
||||
/// <summary>
|
||||
/// The name of the feature
|
||||
/// </summary>
|
||||
public string Name
|
||||
{
|
||||
get => _name;
|
||||
internal set => SetAndNotify(ref _name, value);
|
||||
}
|
||||
public string Name { get; }
|
||||
|
||||
/// <summary>
|
||||
/// A short description of the feature
|
||||
/// </summary>
|
||||
public string? Description
|
||||
{
|
||||
get => _description;
|
||||
set => SetAndNotify(ref _description, value);
|
||||
}
|
||||
public string? Description { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Marks the feature to always be enabled as long as the plugin is enabled and cannot be disabled.
|
||||
@ -92,19 +75,7 @@ public class PluginFeatureInfo : CorePropertyChanged, IPrerequisitesSubject
|
||||
/// Gets the feature this info is associated with
|
||||
/// <para>Note: <see langword="null" /> if the associated <see cref="Plugin" /> is disabled</para>
|
||||
/// </summary>
|
||||
public PluginFeature? Instance
|
||||
{
|
||||
get => _instance;
|
||||
internal set => SetAndNotify(ref _instance, value);
|
||||
}
|
||||
|
||||
internal PluginFeatureEntity Entity { get; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public override string ToString()
|
||||
{
|
||||
return Instance?.Id ?? "Uninitialized feature";
|
||||
}
|
||||
public PluginFeature? Instance { get; internal set; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public List<PluginPrerequisite> Prerequisites { get; } = new();
|
||||
@ -117,4 +88,12 @@ public class PluginFeatureInfo : CorePropertyChanged, IPrerequisitesSubject
|
||||
{
|
||||
return PlatformPrerequisites.All(p => p.IsMet());
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override string ToString()
|
||||
{
|
||||
return Instance?.Id ?? "Uninitialized feature";
|
||||
}
|
||||
|
||||
internal PluginFeatureEntity Entity { get; }
|
||||
}
|
||||
@ -6,237 +6,134 @@ using System.Text.Json.Serialization;
|
||||
namespace Artemis.Core;
|
||||
|
||||
/// <summary>
|
||||
/// Represents basic info about a plugin and contains a reference to the instance of said plugin
|
||||
/// Represents basic info about a plugin and contains a reference to the instance of said plugin
|
||||
/// </summary>
|
||||
public class PluginInfo : CorePropertyChanged, IPrerequisitesSubject
|
||||
public class PluginInfo : IPrerequisitesSubject
|
||||
{
|
||||
private Version? _api = new(1, 0, 0);
|
||||
private string? _author;
|
||||
private bool _autoEnableFeatures = true;
|
||||
private string? _description;
|
||||
private Guid _guid;
|
||||
private string? _icon;
|
||||
private string _main = null!;
|
||||
private string _name = null!;
|
||||
private PluginPlatform? _platforms;
|
||||
private Plugin _plugin = null!;
|
||||
private Uri? _repository;
|
||||
private bool _requiresAdmin;
|
||||
private string _version = null!;
|
||||
private Uri? _website;
|
||||
private Uri? _helpPage;
|
||||
private bool _hotReloadSupported = true;
|
||||
private Uri? _license;
|
||||
private string? _licenseName;
|
||||
|
||||
[JsonConstructor]
|
||||
internal PluginInfo()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The plugins GUID
|
||||
/// The plugins GUID
|
||||
/// </summary>
|
||||
[JsonRequired]
|
||||
[JsonInclude]
|
||||
public Guid Guid
|
||||
{
|
||||
get => _guid;
|
||||
internal set => SetAndNotify(ref _guid, value);
|
||||
}
|
||||
public Guid Guid { get; internal init; }
|
||||
|
||||
/// <summary>
|
||||
/// The name of the plugin
|
||||
/// The name of the plugin
|
||||
/// </summary>
|
||||
[JsonRequired]
|
||||
[JsonInclude]
|
||||
public string Name
|
||||
{
|
||||
get => _name;
|
||||
internal set => SetAndNotify(ref _name, value);
|
||||
}
|
||||
public string Name { get; internal init; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// A short description of the plugin
|
||||
/// </summary>
|
||||
public string? Description
|
||||
{
|
||||
get => _description;
|
||||
set => SetAndNotify(ref _description, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the author of this plugin
|
||||
/// </summary>
|
||||
public string? Author
|
||||
{
|
||||
get => _author;
|
||||
set => SetAndNotify(ref _author, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the website of this plugin or its author
|
||||
/// </summary>
|
||||
public Uri? Website
|
||||
{
|
||||
get => _website;
|
||||
set => SetAndNotify(ref _website, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the repository of this plugin
|
||||
/// </summary>
|
||||
public Uri? Repository
|
||||
{
|
||||
get => _repository;
|
||||
set => SetAndNotify(ref _repository, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the help page of this plugin
|
||||
/// </summary>
|
||||
public Uri? HelpPage
|
||||
{
|
||||
get => _helpPage;
|
||||
set => SetAndNotify(ref _helpPage, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the help page of this plugin
|
||||
/// </summary>
|
||||
public Uri? License
|
||||
{
|
||||
get => _license;
|
||||
set => SetAndNotify(ref _license, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the author of this plugin
|
||||
/// </summary>
|
||||
public string? LicenseName
|
||||
{
|
||||
get => _licenseName;
|
||||
set => SetAndNotify(ref _licenseName, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The plugins display icon that's shown in the settings see <see href="https://materialdesignicons.com" /> for
|
||||
/// available icons
|
||||
/// </summary>
|
||||
public string? Icon
|
||||
{
|
||||
get => _icon;
|
||||
set => SetAndNotify(ref _icon, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The version of the plugin
|
||||
/// The version of the plugin
|
||||
/// </summary>
|
||||
[JsonRequired]
|
||||
[JsonInclude]
|
||||
public string Version
|
||||
{
|
||||
get => _version;
|
||||
internal set => SetAndNotify(ref _version, value);
|
||||
}
|
||||
public string Version { get; internal init; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// The main entry DLL, should contain a class implementing Plugin
|
||||
/// The main entry DLL, should contain a class implementing Plugin
|
||||
/// </summary>
|
||||
[JsonRequired]
|
||||
[JsonInclude]
|
||||
public string Main
|
||||
{
|
||||
get => _main;
|
||||
internal set => SetAndNotify(ref _main, value);
|
||||
}
|
||||
public string Main { get; internal init; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a boolean indicating whether this plugin should automatically enable all its features when it is first
|
||||
/// loaded
|
||||
/// </summary>
|
||||
public bool AutoEnableFeatures
|
||||
{
|
||||
get => _autoEnableFeatures;
|
||||
set => SetAndNotify(ref _autoEnableFeatures, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a boolean indicating whether this plugin requires elevated admin privileges
|
||||
/// A short description of the plugin
|
||||
/// </summary>
|
||||
[JsonInclude]
|
||||
public bool RequiresAdmin
|
||||
{
|
||||
get => _requiresAdmin;
|
||||
internal set => SetAndNotify(ref _requiresAdmin, value);
|
||||
}
|
||||
public string? Description { get; internal init; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the author of this plugin
|
||||
/// </summary>
|
||||
[JsonInclude]
|
||||
public string? Author { get; internal init; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the website of this plugin or its author
|
||||
/// </summary>
|
||||
[JsonInclude]
|
||||
public Uri? Website { get; internal init; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the repository of this plugin
|
||||
/// </summary>
|
||||
[JsonInclude]
|
||||
public Uri? Repository { get; internal init; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the help page of this plugin
|
||||
/// </summary>
|
||||
[JsonInclude]
|
||||
public Uri? HelpPage { get; internal init; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the help page of this plugin
|
||||
/// </summary>
|
||||
[JsonInclude]
|
||||
public Uri? License { get; internal init; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the author of this plugin
|
||||
/// </summary>
|
||||
[JsonInclude]
|
||||
public string? LicenseName { get; internal init; }
|
||||
|
||||
/// <summary>
|
||||
/// The plugins display icon that's shown in the settings see <see href="https://materialdesignicons.com" /> for
|
||||
/// available icons
|
||||
/// </summary>
|
||||
[JsonInclude]
|
||||
public string? Icon { get; internal init; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets a boolean indicating whether this plugin requires elevated admin privileges
|
||||
/// </summary>
|
||||
[JsonInclude]
|
||||
public bool RequiresAdmin { get; internal init; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a boolean indicating whether hot reloading this plugin is supported
|
||||
/// </summary>
|
||||
public bool HotReloadSupported
|
||||
{
|
||||
get => _hotReloadSupported;
|
||||
set => SetAndNotify(ref _hotReloadSupported, value);
|
||||
}
|
||||
[JsonInclude]
|
||||
public bool HotReloadSupported { get; internal init; } = true;
|
||||
|
||||
/// <summary>
|
||||
/// Gets
|
||||
/// Gets
|
||||
/// </summary>
|
||||
[JsonInclude]
|
||||
public PluginPlatform? Platforms
|
||||
{
|
||||
get => _platforms;
|
||||
internal set => SetAndNotify(ref _platforms, value);
|
||||
}
|
||||
public PluginPlatform? Platforms { get; internal init; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the API version the plugin was built for
|
||||
/// Gets the API version the plugin was built for
|
||||
/// </summary>
|
||||
[JsonInclude]
|
||||
public Version? Api
|
||||
{
|
||||
get => _api;
|
||||
internal set => SetAndNotify(ref _api, value);
|
||||
}
|
||||
public Version? Api { get; internal init; } = new(1, 0, 0);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the plugin this info is associated with
|
||||
/// Gets the plugin this info is associated with
|
||||
/// </summary>
|
||||
[JsonIgnore]
|
||||
public Plugin Plugin
|
||||
{
|
||||
get => _plugin;
|
||||
internal set => SetAndNotify(ref _plugin, value);
|
||||
}
|
||||
public Plugin Plugin { get; internal set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// Gets a string representing either a full path pointing to an svg or the markdown icon
|
||||
/// Gets a string representing either a full path pointing to an svg or the markdown icon
|
||||
/// </summary>
|
||||
[JsonIgnore]
|
||||
public string? ResolvedIcon
|
||||
{
|
||||
get
|
||||
{
|
||||
if (Icon == null)
|
||||
return null;
|
||||
return Icon.Contains('.') ? Plugin.ResolveRelativePath(Icon) : Icon;
|
||||
}
|
||||
}
|
||||
public string? ResolvedIcon => Icon == null ? null : Icon.Contains('.') ? Plugin.ResolveRelativePath(Icon) : Icon;
|
||||
|
||||
/// <summary>
|
||||
/// Gets a boolean indicating whether this plugin is compatible with the current operating system and API version
|
||||
/// Gets a boolean indicating whether this plugin is compatible with the current operating system and API version
|
||||
/// </summary>
|
||||
[JsonIgnore]
|
||||
public bool IsCompatible => Platforms.MatchesCurrentOperatingSystem() && Api != null && Api.Major >= Constants.PluginApiVersion;
|
||||
|
||||
internal string PreferredPluginDirectory => $"{Main.Split(".dll")[0].Replace("/", "").Replace("\\", "")}-{Guid.ToString().Substring(0, 8)}";
|
||||
|
||||
/// <inheritdoc />
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{Name} v{Version} - {Guid}";
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[JsonIgnore]
|
||||
public List<PluginPrerequisite> Prerequisites { get; } = new();
|
||||
@ -245,9 +142,18 @@ public class PluginInfo : CorePropertyChanged, IPrerequisitesSubject
|
||||
[JsonIgnore]
|
||||
public IEnumerable<PluginPrerequisite> PlatformPrerequisites => Prerequisites.Where(p => p.AppliesToPlatform());
|
||||
|
||||
[JsonIgnore]
|
||||
internal string PreferredPluginDirectory => $"{Main.Split(".dll")[0].Replace("/", "").Replace("\\", "")}-{Guid.ToString().Substring(0, 8)}";
|
||||
|
||||
/// <inheritdoc />
|
||||
public bool ArePrerequisitesMet()
|
||||
{
|
||||
return PlatformPrerequisites.All(p => p.IsMet());
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{Name} v{Version} - {Guid}";
|
||||
}
|
||||
}
|
||||
@ -2,6 +2,7 @@ using System;
|
||||
using System.Linq;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Nodes;
|
||||
using Serilog;
|
||||
|
||||
namespace Artemis.Storage.Migrations.Profile
|
||||
{
|
||||
@ -11,6 +12,13 @@ namespace Artemis.Storage.Migrations.Profile
|
||||
/// </summary>
|
||||
internal class M0004NodeStorage : IProfileMigration
|
||||
{
|
||||
private readonly ILogger _logger;
|
||||
|
||||
public M0004NodeStorage(ILogger logger)
|
||||
{
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public int Version => 4;
|
||||
|
||||
@ -89,11 +97,11 @@ namespace Artemis.Storage.Migrations.Profile
|
||||
continue;
|
||||
|
||||
JsonObject nodeObject = jsonNode.AsObject();
|
||||
nodeObject["Storage"] = MigrateNodeStorageJson(nodeObject["Storage"]?.GetValue<string>());
|
||||
nodeObject["Storage"] = MigrateNodeStorageJson(nodeObject["Storage"]?.GetValue<string>(), _logger);
|
||||
}
|
||||
}
|
||||
|
||||
internal static string? MigrateNodeStorageJson(string? json)
|
||||
internal static string? MigrateNodeStorageJson(string? json, ILogger logger)
|
||||
{
|
||||
if (string.IsNullOrEmpty(json))
|
||||
return json;
|
||||
@ -131,6 +139,7 @@ namespace Artemis.Storage.Migrations.Profile
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
logger.Error(e, "Failed to migrate node storage JSON");
|
||||
return json;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,11 +1,18 @@
|
||||
using System.Collections.Generic;
|
||||
using Artemis.Storage.Migrations.Profile;
|
||||
using LiteDB;
|
||||
using Serilog;
|
||||
|
||||
namespace Artemis.Storage.Migrations.Storage;
|
||||
|
||||
public class M0026NodeStorage : IStorageMigration
|
||||
{
|
||||
private readonly ILogger _logger;
|
||||
|
||||
public M0026NodeStorage(ILogger logger)
|
||||
{
|
||||
_logger = logger;
|
||||
}
|
||||
public int UserVersion => 26;
|
||||
|
||||
public void Apply(LiteRepository repository)
|
||||
@ -106,7 +113,7 @@ public class M0026NodeStorage : IStorageMigration
|
||||
foreach (BsonValue node in nodes)
|
||||
{
|
||||
// Migrate the storage of the node
|
||||
node["Storage"] = M0004NodeStorage.MigrateNodeStorageJson(node.AsDocument["Storage"]?.AsString);
|
||||
node["Storage"] = M0004NodeStorage.MigrateNodeStorageJson(node.AsDocument["Storage"]?.AsString, _logger);
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user