using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.IO; using System.Linq; using System.Threading.Tasks; using PluginManager.Online.Helpers; using PluginManager.Others; using PluginManager.Plugin; using PluginManager.Updater.Plugins; namespace PluginManager.Online; public class PluginsManager { private static readonly string _DefaultBranch = "releases"; private static readonly string _DefaultBaseUrl = "https://raw.githubusercontent.com/andreitdr/SethPlugins"; private static readonly string _DefaultPluginsLink = "PluginsList.json"; public string Branch { get; init; } public string BaseUrl { get; init; } private string PluginsLink => $"{BaseUrl}/{Branch}/{_DefaultPluginsLink}"; public PluginsManager(Uri baseUrl, string branch) { BaseUrl = baseUrl.ToString(); Branch = branch; } public PluginsManager(string branch) { BaseUrl = _DefaultBaseUrl; Branch = branch; } public PluginsManager() { BaseUrl = _DefaultBaseUrl; Branch = _DefaultBranch; } public async Task> GetPluginsList() { var jsonText = await ServerCom.GetAllTextFromUrl(PluginsLink); List result = await JsonManager.ConvertFromJson>(jsonText); var currentOS = OperatingSystem.IsWindows() ? OSType.WINDOWS : OperatingSystem.IsLinux() ? OSType.LINUX : OSType.MACOSX; return result.FindAll(pl => (pl.SupportedOS & currentOS) != 0); } public async Task GetPluginDataByName(string pluginName) { List plugins = await GetPluginsList(); var result = plugins.Find(p => p.Name == pluginName); return result; } public async Task RemovePluginFromDatabase(string pluginName) { List installedPlugins = await JsonManager.ConvertFromJson>(await File.ReadAllTextAsync(Config.AppSettings["PluginDatabase"])); installedPlugins.RemoveAll(p => p.PluginName == pluginName); await JsonManager.SaveToJsonFile( Config.AppSettings["PluginDatabase"],installedPlugins); } public async Task AppendPluginToDatabase(PluginInfo pluginData) { List installedPlugins = await JsonManager.ConvertFromJson>(await File.ReadAllTextAsync(Config.AppSettings["PluginDatabase"])); installedPlugins.Add(pluginData); await JsonManager.SaveToJsonFile( Config.AppSettings["PluginDatabase"],installedPlugins); } public async Task> GetInstalledPlugins() { return await JsonManager.ConvertFromJson>(await File.ReadAllTextAsync(Config.AppSettings["PluginDatabase"])); } public async Task CheckForUpdates() { var pluginUpdater = new PluginUpdater(this); List installedPlugins = await GetInstalledPlugins(); foreach (var plugin in installedPlugins) { if (await pluginUpdater.HasUpdate(plugin.PluginName)) { Console.WriteLine($"Updating {plugin.PluginName}..."); await pluginUpdater.UpdatePlugin(plugin.PluginName); } } } public async Task MarkPluginToUninstall(string pluginName) { List installedPlugins = await GetInstalledPlugins(); PluginInfo? info = installedPlugins.Find(info => info.PluginName == pluginName); if(info == null) return false; await RemovePluginFromDatabase(pluginName); info.IsMarkedToUninstall = true; await AppendPluginToDatabase(info); return true; } public async Task UninstallMarkedPlugins() { List installedPlugins = await GetInstalledPlugins(); foreach(PluginInfo plugin in installedPlugins) { if(!plugin.IsMarkedToUninstall) continue; await UninstallPlugin(plugin); } } private async Task UninstallPlugin(PluginInfo pluginInfo) { File.Delete(pluginInfo.FilePath); foreach(string dependency in pluginInfo.ListOfDependancies) File.Delete(dependency); await RemovePluginFromDatabase(pluginInfo.PluginName); } }