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()); } }