using System; using System.Collections.Generic; using System.Data.Common; using System.Threading.Tasks; using PluginManager.Online.Helpers; using PluginManager.Others; using OperatingSystem = PluginManager.Others.OperatingSystem; namespace PluginManager.Online; public class PluginsManager { #if DEBUG /// /// The Plugin Manager constructor /// /// The link to the file where all plugins are stored /// The link to the file where all plugin versions are stored public PluginsManager(string plink, string vlink) { PluginsLink = plink; VersionsLink = vlink; } #endif /// /// The Plugin Manager constructor. It uses the default links and the default branch. /// /// The main branch from where the plugin manager gets its info public PluginsManager(string? branch = "releases") { PluginsLink = $"https://raw.githubusercontent.com/andreitdr/SethPlugins/{branch}/PluginsList"; VersionsLink = $"https://raw.githubusercontent.com/andreitdr/SethPlugins/{branch}/Versions"; } /// /// The URL of the server /// public string PluginsLink { get; } public string VersionsLink { get; } /// /// The method to load all plugins /// /// public async Task> GetAvailablePlugins() { // Config.Logger.Log("Got data from " + VersionsLink, this, LogLevel.INFO); try { var list = await ServerCom.ReadTextFromURL(PluginsLink); var lines = list.ToArray(); var data = new List(); var op = Functions.GetOperatingSystem(); var len = lines.Length; for (var i = 0; i < len; i++) { if (lines[i].Length <= 2) continue; var content = lines[i].Split(','); var display = new string[4]; // 4 columns if (op == OperatingSystem.WINDOWS) { if (content[4].Contains("Windows")) { display[0] = content[0]; display[1] = content[1]; display[2] = content[2]; display[3] = (await GetVersionOfPackageFromWeb(content[0]) ?? new VersionString("0.0.0")) .ToShortString(); data.Add(display); } } else if (op == OperatingSystem.LINUX) { if (content[4].Contains("Linux")) { display[0] = content[0]; display[1] = content[1]; display[2] = content[2]; display[3] = (await GetVersionOfPackageFromWeb(content[0]) ?? new VersionString("0.0.0")) .ToShortString(); data.Add(display); } } } return data; } catch (Exception exception) { Config.Logger.Log(message: "Failed to execute command: listplugs\nReason: " + exception.Message, source: typeof(PluginsManager), type: LogType.ERROR); } return null; } public async Task GetVersionOfPackageFromWeb(string pakName) { var data = await ServerCom.ReadTextFromURL(VersionsLink); foreach (var item in data) { if (item.StartsWith("#")) continue; var split = item.Split(','); if (split[0] == pakName) { // Config.Logger.Log("Searched for " + pakName + " and found " + split[1] + " as version.", LogLevel.INFO); return new VersionString(split[1]); } } return null; } /// /// The method to get plugin information by its name /// /// The plugin name /// public async Task GetPluginLinkByName(string name) { try { var list = await ServerCom.ReadTextFromURL(PluginsLink); var lines = list.ToArray(); var len = lines.Length; for (var i = 0; i < len; i++) { var contents = lines[i].Split(','); if (Functions.GetOperatingSystem() == OperatingSystem.WINDOWS && contents[4].Contains("Windows")) { if (contents[0].ToLowerInvariant() == name.ToLowerInvariant()) { if (contents.Length == 6) return new[] { contents[2], contents[3], contents[5] }; if (contents.Length == 5) return new[] { contents[2], contents[3], string.Empty }; throw new Exception("Failed to download plugin. Invalid Argument Length"); } } else if (Functions.GetOperatingSystem() == OperatingSystem.LINUX && contents[4].Contains("Linux")) { if (contents[0].ToLowerInvariant() == name.ToLowerInvariant()) { if (contents.Length == 6) return new[] { contents[2], contents[3], contents[5] }; if (contents.Length == 5) return new[] { contents[2], contents[3], string.Empty }; throw new Exception("Failed to download plugin. Invalid Argument Length"); } } } } catch (Exception exception) { Config.Logger.Log("Failed to execute command: plugin list\nReason: " + exception.Message, source: typeof(PluginsManager), type: LogType.ERROR); } return null; } }