2025-08-12 00:09:45 +04:00
|
|
|
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.
|
2025-08-12 01:02:40 +04:00
|
|
|
/// IMPORTANT! You can have only ONE instance of this handler.
|
2025-08-12 00:42:43 +04:00
|
|
|
/// </summary>
|
2025-08-12 00:09:45 +04:00
|
|
|
public class InlineQueryHandlerAttribute(int importance = 0) : UpdateHandlerAttribute<InlineQueryHandler>(UpdateType.InlineQuery, importance)
|
|
|
|
|
{
|
2025-08-12 00:42:43 +04:00
|
|
|
/// <inheritdoc/>
|
2025-08-12 00:09:45 +04:00
|
|
|
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.
|
2025-08-12 01:02:40 +04:00
|
|
|
/// IMPORTANT! You can have only ONE instance of this handler.
|
2025-08-12 00:42:43 +04:00
|
|
|
/// </summary>
|
2025-08-12 00:09:45 +04:00
|
|
|
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>
|
2025-08-12 00:09:45 +04:00
|
|
|
protected IAbstractHandlerContainer<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>
|
2025-08-12 00:09:45 +04:00
|
|
|
protected IAbstractHandlerContainer<ChosenInlineResult> ChosenContainer { get; private set; } = null!;
|
|
|
|
|
|
2025-08-12 00:42:43 +04:00
|
|
|
/// <summary>
|
|
|
|
|
/// Incoming update of type <see cref="InlineQuery"/>.
|
|
|
|
|
/// </summary>
|
2025-08-12 00:09:45 +04:00
|
|
|
protected InlineQuery InputQuery { get; private set; } = null!;
|
|
|
|
|
|
2025-08-12 00:42:43 +04:00
|
|
|
/// <summary>
|
|
|
|
|
/// Incoming update of type <see cref="ChosenInlineResult"/>.
|
|
|
|
|
/// </summary>
|
2025-08-12 00:09:45 +04:00
|
|
|
protected ChosenInlineResult InputChosen { get; private set; } = null!;
|
|
|
|
|
|
2025-08-12 00:42:43 +04:00
|
|
|
/// <inheritdoc/>
|
2025-08-12 00:09:45 +04:00
|
|
|
public override async Task<Result> Execute(IAbstractHandlerContainer<Update> container, CancellationToken cancellation)
|
|
|
|
|
{
|
|
|
|
|
switch (container.HandlingUpdate.Type)
|
|
|
|
|
{
|
|
|
|
|
case UpdateType.InlineQuery:
|
|
|
|
|
{
|
|
|
|
|
QueryContainer = AbstractHandlerContainer<InlineQuery>.From(container);
|
|
|
|
|
InputQuery = QueryContainer.ActualUpdate;
|
2025-08-12 00:42:43 +04:00
|
|
|
return await Requested(QueryContainer, cancellation).ConfigureAwait(false);
|
2025-08-12 00:09:45 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case UpdateType.ChosenInlineResult:
|
|
|
|
|
{
|
|
|
|
|
ChosenContainer = AbstractHandlerContainer<ChosenInlineResult>.From(container);
|
|
|
|
|
InputChosen = ChosenContainer.ActualUpdate;
|
2025-08-12 00:42:43 +04:00
|
|
|
return await Chosen(ChosenContainer, cancellation).ConfigureAwait(false);
|
2025-08-12 00:09:45 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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>
|
2025-08-12 00:09:45 +04:00
|
|
|
public abstract Task<Result> Requested(IAbstractHandlerContainer<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>
|
2025-08-12 00:09:45 +04:00
|
|
|
public abstract Task<Result> Chosen(IAbstractHandlerContainer<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>
|
2025-08-12 00:09:45 +04:00
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|