btcpayserver/BTCPayServer/Plugins/PluginHookService.cs
Andrew Camilleri b8da6847b9
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>
2021-01-07 14:49:53 +01:00

63 lines
2.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using BTCPayServer.Abstractions.Contracts;
using Microsoft.Extensions.Logging;
namespace BTCPayServer.Plugins
{
public class PluginHookService : IPluginHookService
{
private readonly IEnumerable<IPluginHookAction> _actions;
private readonly IEnumerable<IPluginHookFilter> _filters;
private readonly ILogger<PluginHookService> _logger;
public PluginHookService(IEnumerable<IPluginHookAction> actions, IEnumerable<IPluginHookFilter> filters,
ILogger<PluginHookService> logger)
{
_actions = actions;
_filters = filters;
_logger = logger;
}
// Trigger simple action hook for registered plugins
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)
{
try
{
await pluginHookFilter.Execute(args);
}
catch (Exception e)
{
_logger.LogError(e, $"Action on hook {hook} failed");
}
}
}
// Trigger hook on which registered plugins can optionally return modified args or new object back
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)
{
try
{
args = await pluginHookFilter.Execute(args);
}
catch (Exception e)
{
_logger.LogError(e, $"Filter on hook {hook} failed");
}
}
return args;
}
}
}