using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using Artemis.Core.JsonConverters;
using Newtonsoft.Json;
namespace Artemis.Core;
///
/// Represents basic info about a plugin and contains a reference to the instance of said plugin
///
[JsonObject(MemberSerialization.OptIn)]
public class PluginInfo : CorePropertyChanged, IPrerequisitesSubject
{
private Version? _api;
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;
internal PluginInfo()
{
}
///
/// The plugins GUID
///
[JsonProperty(Required = Required.Always)]
public Guid Guid
{
get => _guid;
internal set => SetAndNotify(ref _guid, value);
}
///
/// The name of the plugin
///
[JsonProperty(Required = Required.Always)]
public string Name
{
get => _name;
internal set => SetAndNotify(ref _name, value);
}
///
/// A short description of the plugin
///
[JsonProperty]
public string? Description
{
get => _description;
set => SetAndNotify(ref _description, value);
}
///
/// Gets or sets the author of this plugin
///
[JsonProperty]
public string? Author
{
get => _author;
set => SetAndNotify(ref _author, value);
}
///
/// Gets or sets the website of this plugin or its author
///
[JsonProperty]
public Uri? Website
{
get => _website;
set => SetAndNotify(ref _website, value);
}
///
/// Gets or sets the repository of this plugin
///
[JsonProperty]
public Uri? Repository
{
get => _repository;
set => SetAndNotify(ref _repository, value);
}
///
/// The plugins display icon that's shown in the settings see for
/// available icons
///
[JsonProperty]
public string? Icon
{
get => _icon;
set => SetAndNotify(ref _icon, value);
}
///
/// The version of the plugin
///
[JsonProperty(Required = Required.Always)]
public string Version
{
get => _version;
internal set => SetAndNotify(ref _version, value);
}
///
/// The main entry DLL, should contain a class implementing Plugin
///
[JsonProperty(Required = Required.Always)]
public string Main
{
get => _main;
internal set => SetAndNotify(ref _main, value);
}
///
/// Gets or sets a boolean indicating whether this plugin should automatically enable all its features when it is first
/// loaded
///
[DefaultValue(true)]
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
public bool AutoEnableFeatures
{
get => _autoEnableFeatures;
set => SetAndNotify(ref _autoEnableFeatures, value);
}
///
/// Gets a boolean indicating whether this plugin requires elevated admin privileges
///
[JsonProperty]
public bool RequiresAdmin
{
get => _requiresAdmin;
internal set => SetAndNotify(ref _requiresAdmin, value);
}
///
/// Gets
///
[JsonProperty]
public PluginPlatform? Platforms
{
get => _platforms;
internal set => SetAndNotify(ref _platforms, value);
}
///
/// Gets the API version the plugin was built for
///
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
[JsonConverter(typeof(ForgivingVersionConverter))]
public Version? Api
{
get => _api;
internal set => SetAndNotify(ref _api, value);
}
///
/// Gets the plugin this info is associated with
///
public Plugin Plugin
{
get => _plugin;
internal set => SetAndNotify(ref _plugin, value);
}
///
/// Gets a string representing either a full path pointing to an svg or the markdown icon
///
public string? ResolvedIcon
{
get
{
if (Icon == null)
return null;
return Icon.Contains('.') ? Plugin.ResolveRelativePath(Icon) : Icon;
}
}
[JsonProperty]
internal List HelpPages { get; set; } = new();
///
/// Gets a boolean indicating whether this plugin is compatible with the current operating system and API version
///
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)}";
///
public override string ToString()
{
return $"{Name} v{Version} - {Guid}";
}
///
public List Prerequisites { get; } = new();
///
public IEnumerable PlatformPrerequisites => Prerequisites.Where(p => p.AppliesToPlatform());
///
public bool ArePrerequisitesMet()
{
return PlatformPrerequisites.All(p => p.IsMet());
}
}