Добавлены новые методы отправки сообщений
This commit is contained in:
@@ -1,50 +1,142 @@
|
||||
namespace BotPages.Core.Abstractions;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Реализация <see cref="IMessengerAdapterFactory"/>, позволяющая регистрировать и разрешать несколько адаптеров мессенджеров.
|
||||
/// Реализация <see cref="IMessengerAdapterFactory"/>, позволяющая регистрировать и разрешать несколько адаптеров.
|
||||
/// </summary>
|
||||
public sealed class MultiAdapterFactory : IMessengerAdapterFactory
|
||||
{
|
||||
private readonly Dictionary<string, IMessengerAdapterSetup> _adapters = new(StringComparer.OrdinalIgnoreCase);
|
||||
private readonly List<IMessengerAdapterSetup> _allAdapters = new();
|
||||
private readonly Dictionary<string, IMessengerAdapterSetup> _adaptersById = new(StringComparer.OrdinalIgnoreCase);
|
||||
private readonly Dictionary<string, List<IMessengerAdapterSetup>> _adaptersByType = new(StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
/// <summary>
|
||||
/// Список зарегистрированных адаптеров.
|
||||
/// Список всех зарегистрированных адаптеров.
|
||||
/// </summary>
|
||||
public Dictionary<string, IMessengerAdapterSetup> Adapters => _adapters;
|
||||
public IReadOnlyList<IMessengerAdapterSetup> AllAdapters => _allAdapters;
|
||||
|
||||
/// <summary>
|
||||
/// Зарегистрировать адаптер для указанного типа мессенджера.
|
||||
/// Зарегистрировать адаптер с уникальным идентификатором.
|
||||
/// </summary>
|
||||
/// <param name="messengerType">
|
||||
/// Тип мессенджера (например, "Telegram", "Slack", "VK").
|
||||
/// </param>
|
||||
/// <param name="adapter">
|
||||
/// Экземпляр адаптера, реализующий <see cref="IMessengerAdapter"/>.
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// Текущий экземпляр <see cref="MultiAdapterFactory"/> для цепочки вызовов.
|
||||
/// </returns>
|
||||
public IMessengerAdapterFactory Register(string messengerType, IMessengerAdapterSetup adapter)
|
||||
public IMessengerAdapterFactory Register(string adapterId, IMessengerAdapterSetup adapter)
|
||||
{
|
||||
_adapters[messengerType] = adapter;
|
||||
if (string.IsNullOrWhiteSpace(adapterId))
|
||||
throw new ArgumentException("Adapter ID cannot be null or empty", nameof(adapterId));
|
||||
|
||||
if (_adaptersById.ContainsKey(adapterId))
|
||||
throw new ArgumentException($"Adapter with ID '{adapterId}' is already registered", nameof(adapterId));
|
||||
|
||||
// Устанавливаем идентификатор в адаптер
|
||||
if (adapter is MessengerAdapterBase adapterBase)
|
||||
{
|
||||
adapterBase.AdapterId = adapterId;
|
||||
}
|
||||
|
||||
_allAdapters.Add(adapter);
|
||||
_adaptersById[adapterId] = adapter;
|
||||
|
||||
// Группируем по типу
|
||||
var adapterType = GetAdapterType(adapter);
|
||||
if (!_adaptersByType.TryGetValue(adapterType, out var typeList))
|
||||
{
|
||||
typeList = new List<IMessengerAdapterSetup>();
|
||||
_adaptersByType[adapterType] = typeList;
|
||||
}
|
||||
typeList.Add(adapter);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Получить адаптер для указанного мессенджера.
|
||||
/// Зарегистрировать адаптер с автоматически сгенерированным ID.
|
||||
/// </summary>
|
||||
/// <param name="messengerType">
|
||||
/// Тип мессенджера (например, "Telegram", "Slack", "VK").
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// Экземпляр <see cref="IMessengerAdapter"/>, зарегистрированный для данного типа мессенджера.
|
||||
/// </returns>
|
||||
/// <exception cref="InvalidOperationException">
|
||||
/// Выбрасывается, если адаптер для указанного типа не зарегистрирован.
|
||||
/// </exception>
|
||||
public IMessengerAdapter Resolve(string messengerType)
|
||||
=> _adapters.TryGetValue(messengerType, out var adapter)
|
||||
? adapter
|
||||
: throw new InvalidOperationException($"No adapter registered for {messengerType}");
|
||||
}
|
||||
public IMessengerAdapterFactory Register(IMessengerAdapterSetup adapter)
|
||||
{
|
||||
var adapterId = GenerateAdapterId(adapter);
|
||||
return Register(adapterId, adapter);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Получить адаптер по ID.
|
||||
/// </summary>
|
||||
public IMessengerAdapter Resolve(string adapterId)
|
||||
{
|
||||
if (_adaptersById.TryGetValue(adapterId, out var adapter))
|
||||
{
|
||||
return adapter;
|
||||
}
|
||||
|
||||
throw new InvalidOperationException($"No adapter registered with ID '{adapterId}'");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Попытаться получить адаптер по ID.
|
||||
/// </summary>
|
||||
public bool TryResolve(string adapterId, out IMessengerAdapter? adapter)
|
||||
{
|
||||
var result = _adaptersById.TryGetValue(adapterId, out var adapterSetup);
|
||||
adapter = adapterSetup;
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Получить все адаптеры определенного типа.
|
||||
/// </summary>
|
||||
public IReadOnlyList<IMessengerAdapter> GetAdaptersByType(string adapterType)
|
||||
{
|
||||
if (_adaptersByType.TryGetValue(adapterType, out var adapters))
|
||||
{
|
||||
return adapters.AsReadOnly();
|
||||
}
|
||||
|
||||
return Array.Empty<IMessengerAdapter>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Проверить, зарегистрирован ли адаптер с указанным ID.
|
||||
/// </summary>
|
||||
public bool Contains(string adapterId) => _adaptersById.ContainsKey(adapterId);
|
||||
|
||||
/// <summary>
|
||||
/// Удалить адаптер по ID.
|
||||
/// </summary>
|
||||
public bool Remove(string adapterId)
|
||||
{
|
||||
if (_adaptersById.TryGetValue(adapterId, out var adapter))
|
||||
{
|
||||
_allAdapters.Remove(adapter);
|
||||
_adaptersById.Remove(adapterId);
|
||||
|
||||
var adapterType = GetAdapterType(adapter);
|
||||
if (_adaptersByType.TryGetValue(adapterType, out var typeList))
|
||||
{
|
||||
typeList.Remove(adapter);
|
||||
if (typeList.Count == 0)
|
||||
{
|
||||
_adaptersByType.Remove(adapterType);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private static string GetAdapterType(IMessengerAdapter adapter)
|
||||
{
|
||||
if (adapter is MessengerAdapterBase adapterBase)
|
||||
{
|
||||
return adapterBase.AdapterType;
|
||||
}
|
||||
|
||||
// Для обратной совместимости
|
||||
return adapter.GetType().Name.Replace("Adapter", "");
|
||||
}
|
||||
|
||||
private static string GenerateAdapterId(IMessengerAdapter adapter)
|
||||
{
|
||||
var adapterType = GetAdapterType(adapter);
|
||||
var guid = Guid.NewGuid().ToString("N").Substring(0, 8);
|
||||
return $"{adapterType}_{guid}".ToLowerInvariant();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user