Plugin Updater

This commit is contained in:
2024-02-27 19:42:59 +02:00
parent 8c06df9110
commit a2179787b9
9 changed files with 127 additions and 24 deletions

View File

@@ -1,8 +1,5 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
using DiscordBot.Utilities;
using PluginManager;
@@ -10,7 +7,6 @@ using PluginManager.Interfaces;
using PluginManager.Loaders;
using PluginManager.Online;
using PluginManager.Others;
using PluginManager.Plugin;
using Spectre.Console;
namespace DiscordBot.Bot.Actions.Extra;
@@ -75,6 +71,7 @@ internal static class PluginMethods
if (!pluginData.HasDependencies)
{
await manager.AppendPluginToDatabase(pluginName, pluginData.Version);
Console.WriteLine("Finished installing " + pluginName + " successfully");
await RefreshPlugins(false);
return;
@@ -129,7 +126,7 @@ internal static class PluginMethods
}
);
await manager.AppendPluginToDatabase(pluginName, pluginData.Version);
await RefreshPlugins(false);
}
@@ -197,7 +194,7 @@ internal static class PluginMethods
Console.ForegroundColor = cc;
};
await loader.LoadPlugins();
await loader. LoadPlugins();
Console.ForegroundColor = cc;
return true;
}

View File

@@ -34,14 +34,6 @@ public class Plugin: ICommandAction
return;
}
var manager =
#if !DEBUG
new PluginsManager("releases");
#else
// new PluginsManager("tests");
new PluginsManager("releases");
#endif
switch (args[0])
{
case "refresh":
@@ -49,7 +41,7 @@ public class Plugin: ICommandAction
break;
case "list":
await PluginMethods.List(manager);
await PluginMethods.List(Config.PluginsManager);
break;
case "load":
if (pluginsLoaded)
@@ -81,7 +73,7 @@ public class Plugin: ICommandAction
}
}
await PluginMethods.DownloadPlugin(manager, pluginName);
await PluginMethods.DownloadPlugin(Config.PluginsManager, pluginName);
break;
}
}

View File

@@ -1,9 +1,12 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using PluginManager.Bot;
using PluginManager.Online;
using PluginManager.Others;
using PluginManager.Others.Logger;
using PluginManager.Plugin;
using OperatingSystem = System.OperatingSystem;
namespace PluginManager;
@@ -14,6 +17,8 @@ public class Config
public static Logger Logger;
public static SettingsDictionary<string, string> AppSettings;
public static PluginsManager PluginsManager;
internal static Boot? DiscordBotClient;
public static Boot? DiscordBot => DiscordBotClient;
@@ -32,6 +37,14 @@ public class Config
AppSettings["LogFolder"] = "./Data/Logs";
AppSettings["PluginFolder"] = "./Data/Plugins";
AppSettings["ArchiveFolder"] = "./Data/Archives";
AppSettings["PluginDatabase"] = "./Data/Resources/plugins.json";
if (!File.Exists(AppSettings["PluginDatabase"]))
{
List<PluginInfo> plugins = new();
await JsonManager.SaveToJsonFile(AppSettings["PluginDatabase"], plugins);
}
if (OperatingSystem.IsLinux())
{
@@ -54,10 +67,12 @@ public class Config
UX.UxHandler.Init();
_isLoaded = true;
PluginsManager = new PluginsManager("releases");
await PluginsManager.CheckForUpdates();
Logger.Log("Config initialized", typeof(Config));
}
}

View File

@@ -43,7 +43,7 @@ internal class Loader
}
catch
{
OnFileLoadedException?.Invoke(new FileLoaderResult(file, "Failed to load file"));
OnFileLoadedException?.Invoke(new FileLoaderResult(file, $"Failed to load file {file}"));
}
}

View File

@@ -3,6 +3,7 @@ using System.Threading.Tasks;
using Discord.WebSocket;
using PluginManager.Interfaces;
using PluginManager.Others;
using PluginManager.Updater.Plugins;
namespace PluginManager.Loaders;
@@ -31,13 +32,12 @@ public class PluginLoader
public async Task LoadPlugins()
{
Commands = new List<DBCommand>();
Events = new List<DBEvent>();
SlashCommands = new List<DBSlashCommand>();
Config.Logger.Log("Loading plugins...", typeof(PluginLoader));
var loader = new Loader(Config.AppSettings["PluginFolder"], "dll");
loader.OnFileLoadedException += FileLoadedException;

View File

@@ -1,9 +1,11 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using PluginManager.Online.Helpers;
using PluginManager.Others;
using PluginManager.Plugin;
using PluginManager.Updater.Plugins;
namespace PluginManager.Online;
@@ -57,6 +59,43 @@ public class PluginsManager
return result;
}
public async Task RemovePluginFromDatabase(string pluginName)
{
List<PluginInfo> installedPlugins = await JsonManager.ConvertFromJson<List<PluginInfo>>(await File.ReadAllTextAsync(Config.AppSettings["PluginDatabase"]));
installedPlugins.RemoveAll(p => p.PluginName == pluginName);
await JsonManager.SaveToJsonFile( Config.AppSettings["PluginDatabase"],installedPlugins);
}
public async Task AppendPluginToDatabase(string pluginName, PluginVersion version)
{
List<PluginInfo> installedPlugins = await JsonManager.ConvertFromJson<List<PluginInfo>>(await File.ReadAllTextAsync(Config.AppSettings["PluginDatabase"]));
installedPlugins.Add(new PluginInfo(pluginName, version));
await JsonManager.SaveToJsonFile( Config.AppSettings["PluginDatabase"],installedPlugins);
}
public async Task<List<PluginInfo>> GetInstalledPlugins()
{
return await JsonManager.ConvertFromJson<List<PluginInfo>>(await File.ReadAllTextAsync(Config.AppSettings["PluginDatabase"]));
}
public async Task CheckForUpdates()
{
var pluginUpdater = new PluginUpdater(this);
List<PluginInfo> installedPlugins = await GetInstalledPlugins();
foreach (var plugin in installedPlugins)
{
if (await pluginUpdater.HasUpdate(plugin.PluginName))
{
Console.WriteLine($"Updating {plugin.PluginName}...");
await pluginUpdater.UpdatePlugin(plugin.PluginName);
}
}
}
}

View File

@@ -1,20 +1,21 @@
using System.IO;
using PluginManager.Interfaces.Updater;
using PluginManager.Online.Helpers;
namespace PluginManager.Plugin;
public class PluginInfo
{
public string PluginName { get; private set; }
public IVersion PluginVersion { get; private set; }
public FileInfo FileData { get; private set; }
public PluginVersion PluginVersion { get; private set; }
public string FilePath { get; private set; }
public PluginInfo(string pluginName, IVersion pluginVersion)
public PluginInfo(string pluginName, PluginVersion pluginVersion)
{
PluginName = pluginName;
PluginVersion = pluginVersion;
FileData = new FileInfo($"{Config.AppSettings["PluginFolder"]}/{pluginName}.dll");
FilePath = $"{Config.AppSettings["PluginFolder"]}/{pluginName}.dll";
}
public static PluginInfo FromOnlineInfo(PluginOnlineInfo onlineInfo)

View File

@@ -25,4 +25,7 @@
<HintPath>..\..\..\.nuget\packages\spectre.console\0.47.0\lib\net7.0\Spectre.Console.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Folder Include="Updater\Application\" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,56 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using PluginManager.Online;
using PluginManager.Plugin;
namespace PluginManager.Updater.Plugins;
public class PluginUpdater
{
private readonly PluginsManager _PluginManager;
public PluginUpdater(PluginsManager pluginManager)
{
_PluginManager = pluginManager;
}
public async Task<PluginOnlineInfo> GetPluginInfo(string pluginName)
{
var result = await _PluginManager.GetPluginDataByName(pluginName);
return result;
}
public async Task<PluginInfo> GetLocalPluginInfo(string pluginName)
{
string pluginsDatabase = File.ReadAllText(Config.AppSettings["PluginDatabase"]);
List<PluginInfo> installedPlugins = await JsonManager.ConvertFromJson<List<PluginInfo>>(pluginsDatabase);
var result = installedPlugins.Find(p => p.PluginName == pluginName);
return result;
}
public async Task UpdatePlugin(string pluginName, IProgress<float>? progressMeter = null)
{
PluginOnlineInfo pluginInfo = await GetPluginInfo(pluginName);
await ServerCom.DownloadFileAsync(pluginInfo.DownLoadLink, $"{Config.AppSettings["PluginFolder"]}/{pluginName}.dll", progressMeter);
foreach(OnlineDependencyInfo dependency in pluginInfo.Dependencies)
await ServerCom.DownloadFileAsync(dependency.DownloadLocation, dependency.DownloadLocation, progressMeter);
await _PluginManager.RemovePluginFromDatabase(pluginName);
await _PluginManager.AppendPluginToDatabase(pluginName, pluginInfo.Version);
}
public async Task<bool> HasUpdate(string pluginName)
{
var localPluginInfo = await GetLocalPluginInfo(pluginName);
var pluginInfo = await GetPluginInfo(pluginName);
return pluginInfo.Version.IsNewerThan(localPluginInfo.PluginVersion);
}
}