[FEATURE] Implement MiddlewareBaseMessageLoop

This commit is contained in:
AmirAbbas 2023-11-01 12:37:33 +03:30
parent 92335ec7c7
commit 585fa8cd50

View File

@ -0,0 +1,77 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using TelegramBotBase.Args;
using TelegramBotBase.Base;
using TelegramBotBase.Interfaces;
using TelegramBotBase.Sessions;
namespace TelegramBotBase.MessageLoops;
/// <summary>
/// This message loop based on middleware pattern
/// </summary>
public sealed class MiddlewareBaseMessageLoop : IMessageLoopFactory
{
private List<Func<MessageContainer, Func<Task>, Task>> Middlewares = new();
public event EventHandler<UnhandledCallEventArgs> UnhandledCall;
public async Task MessageLoop(BotBase bot, DeviceSession session, UpdateResult ur, MessageResult mr)
{
ur.Device = session;
mr.Device = session;
var messageContainer = new MessageContainer(bot, session, ur, mr);
if (Middlewares.Any())
{
int middlewareIndex = 0;
await InvokeMiddleware(messageContainer, middlewareIndex);
}
}
/// <summary>
/// Invokes middleware with index
/// </summary>
private async Task InvokeMiddleware(MessageContainer messageContainer, int middlewareIndex)
{
await Middlewares[middlewareIndex]
.Invoke(messageContainer, async () =>
{
int nextMiddlewareIndex = middlewareIndex + 1;
if (nextMiddlewareIndex < Middlewares.Count)
{
await InvokeMiddleware(messageContainer, nextMiddlewareIndex);
}
});
}
/// <summary>
/// Adds a new middleware
/// </summary>
public void AddMiddleware(Func<MessageContainer, Func<Task>, Task> middleware)
{
Middlewares.Add(middleware);
}
}
public struct MessageContainer
{
public BotBase BotBase { get; private set; }
public DeviceSession DeviceSession { get; private set; }
public UpdateResult UpdateResult { get; private set; }
public MessageResult MessageResult { get; private set; }
public MessageContainer(BotBase botBase, DeviceSession deviceSession, UpdateResult updateResult, MessageResult messageResult)
{
BotBase = botBase;
DeviceSession = deviceSession;
UpdateResult = updateResult;
MessageResult = messageResult;
}
}