diff --git a/BotPages.Core/Routing/CommandsRegistry.cs b/BotPages.Core/Routing/CommandsRegistry.cs index 6006a83..6435601 100644 --- a/BotPages.Core/Routing/CommandsRegistry.cs +++ b/BotPages.Core/Routing/CommandsRegistry.cs @@ -67,15 +67,25 @@ internal sealed class CommandsRegistry /// private static Regex ToRegex(string template) { - var escaped = Regex.Escape(template) - .Replace("\\{", "{").Replace("\\}", "}"); - - var pattern = "^" + Regex.Replace(escaped, @"\{(\w+)(\?)?\}", m => + // Заменяем все {name} и {name?} на регулярные группы + var pattern = "^" + Regex.Replace(template, @"\s*\{(\w+)(\?)?\}", m => { var name = m.Groups[1].Value; var optional = m.Groups[2].Success; - return optional ? $"(?<{name}>\\S+)?" : $"(?<{name}>\\S+)"; - }) + "$"; + + var argPattern = $"(?:\"(?<{name}>[^\"]+)\"|(?<{name}>\\S+))"; + + if (optional) + { + // необязательный параметр: пробел + значение целиком необязательны + return $"(?:\\s+{argPattern})?"; + } + else + { + // обязательный параметр: пробел обязателен + return $"\\s+{argPattern}"; + } + }) + "\\s*$"; // допускаем пробелы/переносы в конце return new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase); } diff --git a/BotPages.Telegram/TelegramAdapter.cs b/BotPages.Telegram/TelegramAdapter.cs index bff4419..482eb00 100644 --- a/BotPages.Telegram/TelegramAdapter.cs +++ b/BotPages.Telegram/TelegramAdapter.cs @@ -66,6 +66,10 @@ public sealed class TelegramAdapter : IMessangerAdapterSetup var mapped = TelegramUpdateMapper.Map(MessengerType, update, _client); if (mapped is not null) await onUpdate(mapped); + if (update.CallbackQuery is not null) + { + await _.AnswerCallbackQuery(update.CallbackQuery.Id); + } }, errorHandler: async (_, ex, ct2) => diff --git a/Demo/Pages/DetailsPage.cs b/Demo/Pages/DetailsPage.cs index e8559bd..3c5e0d5 100644 --- a/Demo/Pages/DetailsPage.cs +++ b/Demo/Pages/DetailsPage.cs @@ -54,8 +54,8 @@ public sealed class DetailsPage : StatefullPage await ctx.Navigation.GoToAsync(ctx, ct); } - internal static string Command => "/create_request {title}"; - internal static string CommandDescription => "создание заявки /create_request {title"; + internal static string Command => "/create_request {title?}"; + internal static string CommandDescription => "создание заявки /create_request {title}"; internal static CommandHandler CommandHandler = async (ctx, args, ct) => { string? title = "";