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; } }