Files
Telegrator/Telegrator/Handlers/InlineQueryHandler.cs
T

109 lines
4.5 KiB
C#
Raw Normal View History

using Telegram.Bot.Types;
using Telegram.Bot.Types.Enums;
using Telegram.Bot.Types.InlineQueryResults;
using Telegrator.Attributes;
using Telegrator.Filters.Components;
using Telegrator.Handlers.Components;
namespace Telegrator.Handlers
{
2025-08-12 00:42:43 +04:00
/// <summary>
/// Attribute that marks a handler to process inline queries.
/// IMPORTANT! You can have only ONE instance of this handler.
2025-08-12 00:42:43 +04:00
/// </summary>
public class InlineQueryHandlerAttribute(int importance = 0) : UpdateHandlerAttribute<InlineQueryHandler>(UpdateType.InlineQuery, importance)
{
2025-08-12 00:42:43 +04:00
/// <inheritdoc/>
public override bool CanPass(FilterExecutionContext<Update> context) => context.Input.InlineQuery is { } | context.Input.ChosenInlineResult is { };
}
2025-08-12 00:42:43 +04:00
/// <summary>
/// Abstract base class for handlers that process inline queries.
/// IMPORTANT! You can have only ONE instance of this handler.
2025-08-12 00:42:43 +04:00
/// </summary>
public abstract class InlineQueryHandler() : AbstractUpdateHandler<Update>(UpdateType.InlineQuery)
{
2025-08-12 00:42:43 +04:00
/// <summary>
/// Handler container for the current <see cref="InlineQuery"/> update.
/// </summary>
2026-02-27 19:18:18 +04:00
protected IHandlerContainer<InlineQuery> QueryContainer { get; private set; } = null!;
2025-08-12 00:42:43 +04:00
/// <summary>
/// Handler container for the current <see cref="ChosenInlineResult"/> update.
/// </summary>
2026-02-27 19:18:18 +04:00
protected IHandlerContainer<ChosenInlineResult> ChosenContainer { get; private set; } = null!;
2025-08-12 00:42:43 +04:00
/// <summary>
/// Incoming update of type <see cref="InlineQuery"/>.
/// </summary>
protected InlineQuery InputQuery { get; private set; } = null!;
2025-08-12 00:42:43 +04:00
/// <summary>
/// Incoming update of type <see cref="ChosenInlineResult"/>.
/// </summary>
protected ChosenInlineResult InputChosen { get; private set; } = null!;
2025-08-12 00:42:43 +04:00
/// <inheritdoc/>
2026-02-27 19:18:18 +04:00
public override async Task<Result> Execute(IHandlerContainer<Update> container, CancellationToken cancellation)
{
switch (container.HandlingUpdate.Type)
{
case UpdateType.InlineQuery:
{
2026-02-27 19:18:18 +04:00
QueryContainer = HandlerContainer<InlineQuery>.From(container);
InputQuery = QueryContainer.ActualUpdate;
2025-08-12 00:42:43 +04:00
return await Requested(QueryContainer, cancellation).ConfigureAwait(false);
}
case UpdateType.ChosenInlineResult:
{
2026-02-27 19:18:18 +04:00
ChosenContainer = HandlerContainer<ChosenInlineResult>.From(container);
InputChosen = ChosenContainer.ActualUpdate;
2025-08-12 00:42:43 +04:00
return await Chosen(ChosenContainer, cancellation).ConfigureAwait(false);
}
default:
throw new NotImplementedException();
}
}
2025-08-12 00:42:43 +04:00
/// <summary>
/// Executes handler logic if received update is <see cref="UpdateType.InlineQuery"/>
/// </summary>
/// <param name="container"></param>
/// <param name="cancellation"></param>
/// <returns></returns>
2026-02-27 19:18:18 +04:00
public abstract Task<Result> Requested(IHandlerContainer<InlineQuery> container, CancellationToken cancellation);
2025-08-12 00:42:43 +04:00
/// <summary>
/// Executes handler logic if received update is <see cref="UpdateType.ChosenInlineResult"/>
/// </summary>
/// <param name="container"></param>
/// <param name="cancellation"></param>
/// <returns></returns>
2026-02-27 19:18:18 +04:00
public abstract Task<Result> Chosen(IHandlerContainer<ChosenInlineResult> container, CancellationToken cancellation);
2025-08-12 00:42:43 +04:00
/// <summary>
/// Answers inline query
/// </summary>
/// <param name="results"></param>
/// <param name="cacheTime"></param>
/// <param name="isPersonal"></param>
/// <param name="nextOffset"></param>
/// <param name="button"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
protected async Task Answer(
IEnumerable<InlineQueryResult> results,
int? cacheTime = null,
bool isPersonal = false,
string? nextOffset = null,
InlineQueryResultsButton? button = null,
CancellationToken cancellationToken = default)
=> await QueryContainer.AnswerInlineQuery(
results, cacheTime,
isPersonal, nextOffset,
button, cancellationToken);
}
}