[FEATURE] Implement MiddlewareBaseMessageLoopExtensions
This commit is contained in:
parent
585fa8cd50
commit
c0276366a5
@ -0,0 +1,310 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Telegram.Bot.Types;
|
||||
using Telegram.Bot.Types.Enums;
|
||||
using TelegramBotBase.Args;
|
||||
using TelegramBotBase.Base;
|
||||
using static System.Collections.Specialized.BitVector32;
|
||||
|
||||
namespace TelegramBotBase.MessageLoops.Extensions;
|
||||
|
||||
public static class MiddlewareBaseMessageLoopExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Adds middleware to the message loop then returns the message loop
|
||||
/// </summary>
|
||||
public static MiddlewareBaseMessageLoop Use(this MiddlewareBaseMessageLoop messageLoop, Func<MessageContainer, Func<Task>, Task> middleware)
|
||||
{
|
||||
messageLoop.AddMiddleware(middleware);
|
||||
|
||||
return messageLoop;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds update type validator middleware to the message loop then returns message loop
|
||||
/// </summary>
|
||||
public static MiddlewareBaseMessageLoop UseValidUpdateTypes(this MiddlewareBaseMessageLoop messageLoop, params UpdateType[] updateTypes)
|
||||
{
|
||||
messageLoop.Use(async (container, next) =>
|
||||
{
|
||||
var updateType = container.UpdateResult.RawData.Type;
|
||||
|
||||
if (updateTypes.Contains(updateType))
|
||||
{
|
||||
await next();
|
||||
}
|
||||
});
|
||||
|
||||
return messageLoop;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds bot commands handler middleware to the message loop then returns message loop
|
||||
/// </summary>
|
||||
public static MiddlewareBaseMessageLoop UseBotCommands(this MiddlewareBaseMessageLoop messageLoop)
|
||||
{
|
||||
messageLoop.Use(async (container, next) =>
|
||||
{
|
||||
var botBase = container.BotBase;
|
||||
var messageResult = container.MessageResult;
|
||||
|
||||
if (messageResult.IsFirstHandler &&
|
||||
messageResult.IsBotCommand &&
|
||||
botBase.IsKnownBotCommand(messageResult.BotCommand))
|
||||
{
|
||||
var deviceSession = container.DeviceSession;
|
||||
|
||||
var sce =
|
||||
new BotCommandEventArgs(messageResult.BotCommand,
|
||||
messageResult.BotCommandParameters,
|
||||
messageResult.Message,
|
||||
deviceSession.DeviceId,
|
||||
deviceSession);
|
||||
|
||||
await botBase.OnBotCommand(sce);
|
||||
|
||||
if (sce.Handled)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
await next();
|
||||
});
|
||||
|
||||
return messageLoop;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds forms handler middleware to the message loop then returns message loop
|
||||
/// </summary>
|
||||
public static MiddlewareBaseMessageLoop UseForms(this MiddlewareBaseMessageLoop messageLoop)
|
||||
{
|
||||
messageLoop.Use(async (container, next) =>
|
||||
{
|
||||
var activeForm = container.DeviceSession.ActiveForm;
|
||||
var messageResult = container.MessageResult;
|
||||
|
||||
//Pre Loading Event
|
||||
await activeForm.PreLoad(messageResult);
|
||||
|
||||
//Send Load event to controls
|
||||
await activeForm.LoadControls(messageResult);
|
||||
|
||||
//Loading Event
|
||||
await activeForm.Load(messageResult);
|
||||
|
||||
var updateType = container.UpdateResult.RawData.Type;
|
||||
|
||||
//Is Attachment ? (Photo, Audio, Video, Contact, Location, Document) (Ignore Callback Queries)
|
||||
if (updateType == UpdateType.Message)
|
||||
{
|
||||
if ((messageResult.MessageType == MessageType.Contact)
|
||||
| (messageResult.MessageType == MessageType.Document)
|
||||
| (messageResult.MessageType == MessageType.Location)
|
||||
| (messageResult.MessageType == MessageType.Photo)
|
||||
| (messageResult.MessageType == MessageType.Video)
|
||||
| (messageResult.MessageType == MessageType.Audio))
|
||||
{
|
||||
var updateResult = container.UpdateResult;
|
||||
|
||||
await activeForm.SentData(new DataResult(updateResult));
|
||||
}
|
||||
}
|
||||
|
||||
var deviceSession = container.DeviceSession;
|
||||
|
||||
//Action Event
|
||||
if (!deviceSession.FormSwitched && messageResult.IsAction)
|
||||
{
|
||||
//Send Action event to controls
|
||||
await activeForm.ActionControls(messageResult);
|
||||
|
||||
//Send Action event to form itself
|
||||
await activeForm.Action(messageResult);
|
||||
|
||||
if (!messageResult.Handled)
|
||||
{
|
||||
messageResult.Handled = true;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!deviceSession.FormSwitched)
|
||||
{
|
||||
//Render Event
|
||||
await activeForm.RenderControls(messageResult);
|
||||
|
||||
await activeForm.Render(messageResult);
|
||||
}
|
||||
|
||||
await next();
|
||||
});
|
||||
|
||||
return messageLoop;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds forms pre loads handler middleware to the message loop then returns message loop
|
||||
/// </summary>
|
||||
public static MiddlewareBaseMessageLoop UsePreLoad(this MiddlewareBaseMessageLoop messageLoop)
|
||||
{
|
||||
messageLoop.Use(async (container, next) =>
|
||||
{
|
||||
var activeForm = container.DeviceSession.ActiveForm;
|
||||
var messageResult = container.MessageResult;
|
||||
|
||||
await activeForm.PreLoad(messageResult);
|
||||
|
||||
await next();
|
||||
});
|
||||
|
||||
return messageLoop;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds forms loads handler middleware to the message loop then returns message loop
|
||||
/// </summary>
|
||||
public static MiddlewareBaseMessageLoop UseLoad(this MiddlewareBaseMessageLoop messageLoop)
|
||||
{
|
||||
messageLoop.Use(async (container, next) =>
|
||||
{
|
||||
var activeForm = container.DeviceSession.ActiveForm;
|
||||
var messageResult = container.MessageResult;
|
||||
|
||||
await activeForm.LoadControls(messageResult);
|
||||
await activeForm.Load(messageResult);
|
||||
|
||||
await next();
|
||||
});
|
||||
|
||||
return messageLoop;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds forms custom attachments handler middleware to the message loop then returns message loop
|
||||
/// </summary>
|
||||
public static MiddlewareBaseMessageLoop UseAttachments(this MiddlewareBaseMessageLoop messageLoop, params MessageType[] validAttachments)
|
||||
{
|
||||
messageLoop.Use(async (container, next) =>
|
||||
{
|
||||
var activeForm = container.DeviceSession.ActiveForm;
|
||||
var messageResult = container.MessageResult;
|
||||
var updateType = container.UpdateResult.RawData.Type;
|
||||
|
||||
//Is Attachment ? (Photo, Audio, Video, Contact, Location, Document) (Ignore Callback Queries)
|
||||
if (updateType == UpdateType.Message)
|
||||
{
|
||||
if ((messageResult.MessageType == MessageType.Contact)
|
||||
| (messageResult.MessageType == MessageType.Document)
|
||||
| (messageResult.MessageType == MessageType.Location)
|
||||
| (messageResult.MessageType == MessageType.Photo)
|
||||
| (messageResult.MessageType == MessageType.Video)
|
||||
| (messageResult.MessageType == MessageType.Audio))
|
||||
{
|
||||
if (validAttachments.Contains(messageResult.MessageType))
|
||||
{
|
||||
var updateResult = container.UpdateResult;
|
||||
|
||||
await activeForm.SentData(new DataResult(updateResult));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
await next();
|
||||
});
|
||||
|
||||
return messageLoop;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds forms all attachments handler middleware to the message loop then returns message loop
|
||||
/// </summary>
|
||||
public static MiddlewareBaseMessageLoop UseAllAttachments(this MiddlewareBaseMessageLoop messageLoop)
|
||||
{
|
||||
messageLoop.Use(async (container, next) =>
|
||||
{
|
||||
var activeForm = container.DeviceSession.ActiveForm;
|
||||
var messageResult = container.MessageResult;
|
||||
var updateType = container.UpdateResult.RawData.Type;
|
||||
|
||||
//Is Attachment ? (Photo, Audio, Video, Contact, Location, Document) (Ignore Callback Queries)
|
||||
if (updateType == UpdateType.Message)
|
||||
{
|
||||
if ((messageResult.MessageType == MessageType.Contact)
|
||||
| (messageResult.MessageType == MessageType.Document)
|
||||
| (messageResult.MessageType == MessageType.Location)
|
||||
| (messageResult.MessageType == MessageType.Photo)
|
||||
| (messageResult.MessageType == MessageType.Video)
|
||||
| (messageResult.MessageType == MessageType.Audio))
|
||||
{
|
||||
var updateResult = container.UpdateResult;
|
||||
|
||||
await activeForm.SentData(new DataResult(updateResult));
|
||||
}
|
||||
}
|
||||
|
||||
await next();
|
||||
});
|
||||
|
||||
return messageLoop;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds forms actions handler middleware to the message loop then returns message loop
|
||||
/// </summary>
|
||||
public static MiddlewareBaseMessageLoop UseActions(this MiddlewareBaseMessageLoop messageLoop)
|
||||
{
|
||||
messageLoop.Use(async (container, next) =>
|
||||
{
|
||||
var messageResult = container.MessageResult;
|
||||
var deviceSession = container.DeviceSession;
|
||||
var activeForm = deviceSession.ActiveForm;
|
||||
|
||||
//Action Event
|
||||
if (!deviceSession.FormSwitched && messageResult.IsAction)
|
||||
{
|
||||
//Send Action event to controls
|
||||
await activeForm.ActionControls(messageResult);
|
||||
|
||||
//Send Action event to form itself
|
||||
await activeForm.Action(messageResult);
|
||||
|
||||
if (!messageResult.Handled)
|
||||
{
|
||||
messageResult.Handled = true;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
await next();
|
||||
});
|
||||
|
||||
return messageLoop;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds forms renders handler middleware to the message loop then returns message loop
|
||||
/// </summary>
|
||||
public static MiddlewareBaseMessageLoop UseRender(this MiddlewareBaseMessageLoop messageLoop)
|
||||
{
|
||||
messageLoop.Use(async (container, next) =>
|
||||
{
|
||||
var messageResult = container.MessageResult;
|
||||
var deviceSession = container.DeviceSession;
|
||||
var activeForm = deviceSession.ActiveForm;
|
||||
|
||||
if (!deviceSession.FormSwitched)
|
||||
{
|
||||
await activeForm.RenderControls(messageResult);
|
||||
|
||||
await activeForm.Render(messageResult);
|
||||
}
|
||||
|
||||
await next();
|
||||
});
|
||||
|
||||
return messageLoop;
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user