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;
///
/// This message loop based on middleware pattern
///
public sealed class MiddlewareBaseMessageLoop : IMessageLoopFactory
{
private List, Task>> Middlewares = new();
public event EventHandler 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);
}
}
///
/// Invokes middleware with index
///
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);
}
});
}
///
/// Adds a new middleware
///
public void AddMiddleware(Func, 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;
}
}