Plugin Updater
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
@@ -33,6 +38,14 @@ public class Config
|
||||
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())
|
||||
{
|
||||
var windowManager = Environment.GetEnvironmentVariable("XDG_CURRENT_DESKTOP");
|
||||
@@ -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));
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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}"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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,7 +32,6 @@ public class PluginLoader
|
||||
|
||||
public async Task LoadPlugins()
|
||||
{
|
||||
|
||||
Commands = new List<DBCommand>();
|
||||
Events = new List<DBEvent>();
|
||||
SlashCommands = new List<DBSlashCommand>();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -58,5 +60,42 @@ 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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>
|
||||
56
PluginManager/Updater/Plugins/PluginUpdater.cs
Normal file
56
PluginManager/Updater/Plugins/PluginUpdater.cs
Normal 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);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user