mirror of
https://github.com/aljazceru/btcpayserver.git
synced 2025-12-18 06:24:24 +01:00
Plugins flexibility PR (#2129)
* Plugins flexibility PR * Makes the BTCPayServerOptions.LoadArgs async to support Plugin hooks and actions * relax the private set modifiers in the BTCPayNetwork * Separate IPluginHookService from PluginService to reduce dependencies on DI * fix some small bugs around image path * Fix bug with new dbreeze migration where data dir was incorrect * Update BTCPayServer/Plugins/PluginHookService.cs Co-authored-by: rockstardev <5191402+rockstardev@users.noreply.github.com> * Update BTCPayServer/Plugins/PluginHookService.cs Co-authored-by: rockstardev <5191402+rockstardev@users.noreply.github.com> Co-authored-by: rockstardev <5191402+rockstardev@users.noreply.github.com>
This commit is contained in:
@@ -16,23 +16,19 @@ using Newtonsoft.Json;
|
||||
|
||||
namespace BTCPayServer.Plugins
|
||||
{
|
||||
public class PluginService: IPluginHookService
|
||||
public class PluginService
|
||||
{
|
||||
private readonly IOptions<DataDirectories> _datadirs;
|
||||
private readonly BTCPayServerOptions _options;
|
||||
private readonly IOptions<DataDirectories> _dataDirectories;
|
||||
private readonly BTCPayServerOptions _btcPayServerOptions;
|
||||
private readonly HttpClient _githubClient;
|
||||
private readonly IEnumerable<IPluginHookAction> _actions;
|
||||
private readonly IEnumerable<IPluginHookFilter> _filters;
|
||||
public PluginService(IEnumerable<IBTCPayServerPlugin> btcPayServerPlugins,
|
||||
IHttpClientFactory httpClientFactory, IOptions<DataDirectories> datadirs, BTCPayServerOptions options, IEnumerable<IPluginHookAction> actions, IEnumerable<IPluginHookFilter> filters)
|
||||
IHttpClientFactory httpClientFactory, BTCPayServerOptions btcPayServerOptions, IOptions<DataDirectories> dataDirectories)
|
||||
{
|
||||
LoadedPlugins = btcPayServerPlugins;
|
||||
_githubClient = httpClientFactory.CreateClient();
|
||||
_githubClient.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("btcpayserver", "1"));
|
||||
_datadirs = datadirs;
|
||||
_options = options;
|
||||
_actions = actions;
|
||||
_filters = filters;
|
||||
_btcPayServerOptions = btcPayServerOptions;
|
||||
_dataDirectories = dataDirectories;
|
||||
}
|
||||
|
||||
public IEnumerable<IBTCPayServerPlugin> LoadedPlugins { get; }
|
||||
@@ -40,7 +36,7 @@ namespace BTCPayServer.Plugins
|
||||
public async Task<IEnumerable<AvailablePlugin>> GetRemotePlugins()
|
||||
{
|
||||
var resp = await _githubClient
|
||||
.GetStringAsync(new Uri($"https://api.github.com/repos/{_options.PluginRemote}/contents"));
|
||||
.GetStringAsync(new Uri($"https://api.github.com/repos/{_btcPayServerOptions.PluginRemote}/contents"));
|
||||
var files = JsonConvert.DeserializeObject<GithubFile[]>(resp);
|
||||
return await Task.WhenAll(files.Where(file => file.Name.EndsWith($"{PluginManager.BTCPayPluginSuffix}.json", StringComparison.InvariantCulture)).Select(async file =>
|
||||
{
|
||||
@@ -51,9 +47,9 @@ namespace BTCPayServer.Plugins
|
||||
|
||||
public async Task DownloadRemotePlugin(string plugin)
|
||||
{
|
||||
var dest = _datadirs.Value.PluginDir;
|
||||
var dest = _dataDirectories.Value.PluginDir;
|
||||
var resp = await _githubClient
|
||||
.GetStringAsync(new Uri($"https://api.github.com/repos/{_options.PluginRemote}/contents"));
|
||||
.GetStringAsync(new Uri($"https://api.github.com/repos/{_btcPayServerOptions.PluginRemote}/contents"));
|
||||
var files = JsonConvert.DeserializeObject<GithubFile[]>(resp);
|
||||
var ext = files.SingleOrDefault(file => file.Name == $"{plugin}{PluginManager.BTCPayPluginSuffix}");
|
||||
if (ext is null)
|
||||
@@ -68,19 +64,19 @@ namespace BTCPayServer.Plugins
|
||||
|
||||
public void InstallPlugin(string plugin)
|
||||
{
|
||||
var dest = _datadirs.Value.PluginDir;
|
||||
var dest = _dataDirectories.Value.PluginDir;
|
||||
UninstallPlugin(plugin);
|
||||
PluginManager.QueueCommands(dest, ("install", plugin));
|
||||
}
|
||||
public void UpdatePlugin(string plugin)
|
||||
{
|
||||
var dest = _datadirs.Value.PluginDir;
|
||||
var dest = _dataDirectories.Value.PluginDir;
|
||||
PluginManager.QueueCommands(dest, ("update", plugin));
|
||||
}
|
||||
|
||||
public async Task UploadPlugin(IFormFile plugin)
|
||||
{
|
||||
var dest = _datadirs.Value.PluginDir;
|
||||
var dest = _dataDirectories.Value.PluginDir;
|
||||
var filedest = Path.Combine(dest, plugin.FileName);
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(filedest));
|
||||
if (Path.GetExtension(filedest) == PluginManager.BTCPayPluginSuffix)
|
||||
@@ -92,7 +88,7 @@ namespace BTCPayServer.Plugins
|
||||
|
||||
public void UninstallPlugin(string plugin)
|
||||
{
|
||||
var dest = _datadirs.Value.PluginDir;
|
||||
var dest = _dataDirectories.Value.PluginDir;
|
||||
PluginManager.QueueCommands(dest, ("delete", plugin));
|
||||
}
|
||||
|
||||
@@ -127,34 +123,12 @@ namespace BTCPayServer.Plugins
|
||||
|
||||
public (string command, string plugin)[] GetPendingCommands()
|
||||
{
|
||||
return PluginManager.GetPendingCommands(_datadirs.Value.PluginDir);
|
||||
return PluginManager.GetPendingCommands(_dataDirectories.Value.PluginDir);
|
||||
}
|
||||
|
||||
public void CancelCommands(string plugin)
|
||||
{
|
||||
PluginManager.CancelCommands(_datadirs.Value.PluginDir, plugin);
|
||||
}
|
||||
|
||||
public async Task ApplyAction(string hook, object args)
|
||||
{
|
||||
var filters = _actions
|
||||
.Where(filter => filter.Hook.Equals(hook, StringComparison.InvariantCultureIgnoreCase)).ToList();
|
||||
foreach (IPluginHookAction pluginHookFilter in filters)
|
||||
{
|
||||
await pluginHookFilter.Execute(args);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<object> ApplyFilter(string hook, object args)
|
||||
{
|
||||
var filters = _filters
|
||||
.Where(filter => filter.Hook.Equals(hook, StringComparison.InvariantCultureIgnoreCase)).ToList();
|
||||
foreach (IPluginHookFilter pluginHookFilter in filters)
|
||||
{
|
||||
args = await pluginHookFilter.Execute(args);
|
||||
}
|
||||
|
||||
return args;
|
||||
PluginManager.CancelCommands(_dataDirectories.Value.PluginDir, plugin);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user