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;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using DiscordBot.Utilities; using DiscordBot.Utilities;
using PluginManager; using PluginManager;
@@ -10,7 +7,6 @@ using PluginManager.Interfaces;
using PluginManager.Loaders; using PluginManager.Loaders;
using PluginManager.Online; using PluginManager.Online;
using PluginManager.Others; using PluginManager.Others;
using PluginManager.Plugin;
using Spectre.Console; using Spectre.Console;
namespace DiscordBot.Bot.Actions.Extra; namespace DiscordBot.Bot.Actions.Extra;
@@ -75,6 +71,7 @@ internal static class PluginMethods
if (!pluginData.HasDependencies) if (!pluginData.HasDependencies)
{ {
await manager.AppendPluginToDatabase(pluginName, pluginData.Version);
Console.WriteLine("Finished installing " + pluginName + " successfully"); Console.WriteLine("Finished installing " + pluginName + " successfully");
await RefreshPlugins(false); await RefreshPlugins(false);
return; return;
@@ -129,7 +126,7 @@ internal static class PluginMethods
} }
); );
await manager.AppendPluginToDatabase(pluginName, pluginData.Version);
await RefreshPlugins(false); await RefreshPlugins(false);
} }

View File

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

View File

@@ -1,9 +1,12 @@
using System; using System;
using System.Collections.Generic;
using System.IO; using System.IO;
using System.Threading.Tasks; using System.Threading.Tasks;
using PluginManager.Bot; using PluginManager.Bot;
using PluginManager.Online;
using PluginManager.Others; using PluginManager.Others;
using PluginManager.Others.Logger; using PluginManager.Others.Logger;
using PluginManager.Plugin;
using OperatingSystem = System.OperatingSystem; using OperatingSystem = System.OperatingSystem;
namespace PluginManager; namespace PluginManager;
@@ -14,6 +17,8 @@ public class Config
public static Logger Logger; public static Logger Logger;
public static SettingsDictionary<string, string> AppSettings; public static SettingsDictionary<string, string> AppSettings;
public static PluginsManager PluginsManager;
internal static Boot? DiscordBotClient; internal static Boot? DiscordBotClient;
public static Boot? DiscordBot => DiscordBotClient; public static Boot? DiscordBot => DiscordBotClient;
@@ -33,6 +38,14 @@ public class Config
AppSettings["PluginFolder"] = "./Data/Plugins"; AppSettings["PluginFolder"] = "./Data/Plugins";
AppSettings["ArchiveFolder"] = "./Data/Archives"; 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()) if (OperatingSystem.IsLinux())
{ {
var windowManager = Environment.GetEnvironmentVariable("XDG_CURRENT_DESKTOP"); var windowManager = Environment.GetEnvironmentVariable("XDG_CURRENT_DESKTOP");
@@ -54,10 +67,12 @@ public class Config
UX.UxHandler.Init(); UX.UxHandler.Init();
_isLoaded = true; _isLoaded = true;
PluginsManager = new PluginsManager("releases");
await PluginsManager.CheckForUpdates();
Logger.Log("Config initialized", typeof(Config)); Logger.Log("Config initialized", typeof(Config));
} }
} }

View File

@@ -43,7 +43,7 @@ internal class Loader
} }
catch 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 Discord.WebSocket;
using PluginManager.Interfaces; using PluginManager.Interfaces;
using PluginManager.Others; using PluginManager.Others;
using PluginManager.Updater.Plugins;
namespace PluginManager.Loaders; namespace PluginManager.Loaders;
@@ -31,7 +32,6 @@ public class PluginLoader
public async Task LoadPlugins() public async Task LoadPlugins()
{ {
Commands = new List<DBCommand>(); Commands = new List<DBCommand>();
Events = new List<DBEvent>(); Events = new List<DBEvent>();
SlashCommands = new List<DBSlashCommand>(); SlashCommands = new List<DBSlashCommand>();

View File

@@ -1,9 +1,11 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks; using System.Threading.Tasks;
using PluginManager.Online.Helpers; using PluginManager.Online.Helpers;
using PluginManager.Others; using PluginManager.Others;
using PluginManager.Plugin; using PluginManager.Plugin;
using PluginManager.Updater.Plugins;
namespace PluginManager.Online; namespace PluginManager.Online;
@@ -58,5 +60,42 @@ public class PluginsManager
return result; 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 System.IO;
using PluginManager.Interfaces.Updater; using PluginManager.Interfaces.Updater;
using PluginManager.Online.Helpers;
namespace PluginManager.Plugin; namespace PluginManager.Plugin;
public class PluginInfo public class PluginInfo
{ {
public string PluginName { get; private set; } public string PluginName { get; private set; }
public IVersion PluginVersion { get; private set; } public PluginVersion PluginVersion { get; private set; }
public FileInfo FileData { get; private set; } public string FilePath { get; private set; }
public PluginInfo(string pluginName, IVersion pluginVersion) public PluginInfo(string pluginName, PluginVersion pluginVersion)
{ {
PluginName = pluginName; PluginName = pluginName;
PluginVersion = pluginVersion; PluginVersion = pluginVersion;
FileData = new FileInfo($"{Config.AppSettings["PluginFolder"]}/{pluginName}.dll"); FilePath = $"{Config.AppSettings["PluginFolder"]}/{pluginName}.dll";
} }
public static PluginInfo FromOnlineInfo(PluginOnlineInfo onlineInfo) 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> <HintPath>..\..\..\.nuget\packages\spectre.console\0.47.0\lib\net7.0\Spectre.Console.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup>
<Folder Include="Updater\Application\" />
</ItemGroup>
</Project> </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);
}
}