Plugin Updater
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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}"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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>();
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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>
|
||||||
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