From 585fa8cd505e805c3bc17a6f73e4812771191513 Mon Sep 17 00:00:00 2001 From: AmirAbbas Date: Wed, 1 Nov 2023 12:37:33 +0330 Subject: [PATCH] [FEATURE] Implement MiddlewareBaseMessageLoop --- .../MessageLoops/MiddlewareBaseMessageLoop.cs | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 TelegramBotBase/MessageLoops/MiddlewareBaseMessageLoop.cs diff --git a/TelegramBotBase/MessageLoops/MiddlewareBaseMessageLoop.cs b/TelegramBotBase/MessageLoops/MiddlewareBaseMessageLoop.cs new file mode 100644 index 0000000..13c19f7 --- /dev/null +++ b/TelegramBotBase/MessageLoops/MiddlewareBaseMessageLoop.cs @@ -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; + +/// +/// 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; + } +} \ No newline at end of file