diff --git a/Telegrator.Hosting/TelegramBotHost.cs b/Telegrator.Hosting/TelegramBotHost.cs index 079ce47..cb5fca1 100644 --- a/Telegrator.Hosting/TelegramBotHost.cs +++ b/Telegrator.Hosting/TelegramBotHost.cs @@ -127,12 +127,13 @@ namespace Telegrator.Hosting foreach (UpdateType updateType in handlers.Keys) { HandlerDescriptorList descriptors = handlers[updateType]; - logBuilder.AppendLine("\n\tUpdateType." + updateType + " :"); + logBuilder.Append("\n\tUpdateType." + updateType + " :"); foreach (HandlerDescriptor descriptor in descriptors.Reverse()) { - string indexerString = descriptor.Indexer.ToString(); - logBuilder.AppendLine("* " + indexerString + " " + (descriptor.DisplayString ?? descriptor.HandlerType.Name)); + logBuilder.AppendFormat("\n\t* {0} - {1}", + descriptor.Indexer.ToString(), + descriptor.ToString()); } } diff --git a/Telegrator.Hosting/TelegramBotHostBuilder.cs b/Telegrator.Hosting/TelegramBotHostBuilder.cs index 2edb5a0..80cc490 100644 --- a/Telegrator.Hosting/TelegramBotHostBuilder.cs +++ b/Telegrator.Hosting/TelegramBotHostBuilder.cs @@ -49,6 +49,8 @@ namespace Telegrator.Hosting _settings = settings ?? new TelegramBotHostBuilderSettings(); _handlers = new HostHandlersCollection(Services, _settings); + _innerBuilder.Logging.ClearProviders(); + Services.Configure(Configuration.GetSection(nameof(TelegramBotOptions))); Services.Configure(Configuration.GetSection(nameof(ReceiverOptions))); Services.Configure(Configuration.GetSection(nameof(TelegramBotClientOptions)), new TelegramBotClientOptionsProxy()); diff --git a/Telegrator.Hosting/Telegrator.Hosting.csproj b/Telegrator.Hosting/Telegrator.Hosting.csproj index 4eca130..733b92c 100644 --- a/Telegrator.Hosting/Telegrator.Hosting.csproj +++ b/Telegrator.Hosting/Telegrator.Hosting.csproj @@ -15,7 +15,7 @@ True True LICENSE - 1.0.3 + 1.0.5 diff --git a/Telegrator/Attributes/Components/UpdateFilterAttributeBase.cs b/Telegrator/Attributes/Components/UpdateFilterAttributeBase.cs index 069a2ec..f2dec42 100644 --- a/Telegrator/Attributes/Components/UpdateFilterAttributeBase.cs +++ b/Telegrator/Attributes/Components/UpdateFilterAttributeBase.cs @@ -1,6 +1,5 @@ using Telegram.Bot.Types; using Telegram.Bot.Types.Enums; -using Telegrator.Attributes; using Telegrator.Filters; using Telegrator.Filters.Components; using Telegrator.Handlers.Components; diff --git a/Telegrator/Filters/CallbackQueryFilters.cs b/Telegrator/Filters/CallbackQueryFilters.cs index e49ec6c..9b22a74 100644 --- a/Telegrator/Filters/CallbackQueryFilters.cs +++ b/Telegrator/Filters/CallbackQueryFilters.cs @@ -1,4 +1,5 @@ -using Telegram.Bot.Types; +using System.Text.RegularExpressions; +using Telegram.Bot.Types; using Telegrator.Filters.Components; namespace Telegrator.Filters @@ -48,4 +49,25 @@ namespace Telegrator.Filters return context.Input.InlineMessageId == _inlineMessageId; } } + + /// + /// Filters callback queries by matching their data with a regular expression. + /// + public class CallbackRegexFilter : RegexFilterBase + { + /// + /// Initializes a new instance of the class with a pattern and options. + /// + /// The regex pattern. + /// The regex options. + public CallbackRegexFilter(string pattern, RegexOptions regexOptions = default) + : base(clb => clb.Data, pattern, regexOptions) { } + + /// + /// Initializes a new instance of the class with a regex object. + /// + /// The regex object. + public CallbackRegexFilter(Regex regex) + : base(clb => clb.Data, regex) { } + } } diff --git a/Telegrator/Filters/MentionedFilter.cs b/Telegrator/Filters/MentionedFilter.cs index c9dd56e..e3351cc 100644 --- a/Telegrator/Filters/MentionedFilter.cs +++ b/Telegrator/Filters/MentionedFilter.cs @@ -45,8 +45,8 @@ namespace Telegrator.Filters return false; string userName = Mention ?? context.BotInfo.User.Username ?? throw new ArgumentNullException(nameof(context), "MentionedFilter requires BotInfo to be initialized"); - MessageHasEntityFilter entityFilter = context.CompletedFilters.Get(0); - return entityFilter.FoundEntities.Any(ent => Target.Text.Substring(ent.Offset + 1, ent.Length - 1) == userName); + IEnumerable entityFilter = context.CompletedFilters.Get(); + return entityFilter.Any(fltr => fltr.FoundEntities.Any(ent => Target.Text.Substring(ent.Offset + 1, ent.Length - 1) == userName)); } } } diff --git a/Telegrator/Filters/MessageFilters.cs b/Telegrator/Filters/MessageFilters.cs index 90616c6..cadd02c 100644 --- a/Telegrator/Filters/MessageFilters.cs +++ b/Telegrator/Filters/MessageFilters.cs @@ -16,10 +16,23 @@ namespace Telegrator.Filters protected Message Target { get; private set; } = null!; /// - public override bool CanPass(FilterExecutionContext context) + protected virtual bool CanPassBase(FilterExecutionContext context) { FromReplyChainFilter? repliedFilter = context.CompletedFilters.Get().SingleOrDefault(); Target = repliedFilter?.Reply ?? context.Input; + + if (Target is not { Id: > 0 }) + return false; + + return true; + } + + /// + public override bool CanPass(FilterExecutionContext context) + { + if (!CanPassBase(context)) + return false; + return CanPassNext(context); } diff --git a/Telegrator/Filters/MessageSenderFilters.cs b/Telegrator/Filters/MessageSenderFilters.cs index 108573e..9769154 100644 --- a/Telegrator/Filters/MessageSenderFilters.cs +++ b/Telegrator/Filters/MessageSenderFilters.cs @@ -22,7 +22,7 @@ namespace Telegrator.Filters /// True if the message has a valid sender; otherwise, false. public override bool CanPass(FilterExecutionContext context) { - if (!base.CanPass(context)) + if (!base.CanPassBase(context)) return false; User = Target.From!; diff --git a/Telegrator/Filters/MessageTextFilters.cs b/Telegrator/Filters/MessageTextFilters.cs index 2c7f6f3..bb29042 100644 --- a/Telegrator/Filters/MessageTextFilters.cs +++ b/Telegrator/Filters/MessageTextFilters.cs @@ -1,6 +1,4 @@ -using System; -using System.Linq; -using Telegram.Bot.Types; +using Telegram.Bot.Types; using Telegrator.Filters.Components; namespace Telegrator.Filters @@ -15,7 +13,7 @@ namespace Telegrator.Filters /// Gets the current message being processed by the filter. /// public Message Message { get; private set; } = null!; - + /// /// Gets the extracted text content from the current message. /// @@ -29,14 +27,13 @@ namespace Telegrator.Filters /// True if the message is valid and can be processed further; otherwise, false. public override bool CanPass(FilterExecutionContext context) { - if (!base.CanPass(context)) + if (!base.CanPassBase(context)) return false; - Message = context.Input!; - if (Message is not { Id: > 0 }) + if (Target is not { Id: > 0, Text.Length: > 0 }) return false; - Text = Message.Text ?? string.Empty; + Text = Target.Text; return CanPassNext(context); } } diff --git a/Telegrator/MadiatorCore/Descriptors/DescriptorIndexer.cs b/Telegrator/MadiatorCore/Descriptors/DescriptorIndexer.cs index 2573819..23b1add 100644 --- a/Telegrator/MadiatorCore/Descriptors/DescriptorIndexer.cs +++ b/Telegrator/MadiatorCore/Descriptors/DescriptorIndexer.cs @@ -82,7 +82,7 @@ namespace Telegrator.MadiatorCore.Descriptors /// A string in the format (C:importance, P:priority). public override string ToString() { - return string.Format("(I:{0}, C:{1}, P:{2})", RouterIndex, Importance, Priority); + return string.Format("(Ix: {0,2}, Im: {1,2}, Pr: {2,2})", RouterIndex, Importance, Priority); } } } diff --git a/Telegrator/MadiatorCore/Descriptors/HandlerDescriptorList.cs b/Telegrator/MadiatorCore/Descriptors/HandlerDescriptorList.cs index 5c0303b..660deae 100644 --- a/Telegrator/MadiatorCore/Descriptors/HandlerDescriptorList.cs +++ b/Telegrator/MadiatorCore/Descriptors/HandlerDescriptorList.cs @@ -77,15 +77,7 @@ namespace Telegrator.MadiatorCore.Descriptors if (_handlingType != UpdateType.Unknown && descriptor.UpdateType != _handlingType) throw new InvalidOperationException(); - while (_innerCollection.TryGetValue(descriptor.Indexer, out HandlerDescriptor? conflictDescriptor)) - { - int newIndex = count++; - if (_options?.DescendDescriptorIndex ?? false) - newIndex += -1; - - descriptor.Indexer = descriptor.Indexer.UpdateIndex(count); - } - + descriptor.Indexer = descriptor.Indexer.UpdateIndex(count++); _innerCollection.Add(descriptor.Indexer, descriptor); } } diff --git a/Telegrator/Providers/HandlersProvider.cs b/Telegrator/Providers/HandlersProvider.cs index b613919..73dbf79 100644 --- a/Telegrator/Providers/HandlersProvider.cs +++ b/Telegrator/Providers/HandlersProvider.cs @@ -67,14 +67,14 @@ namespace Telegrator.Providers { return descriptor.SingletonInstance ??= (descriptor.InstanceFactory != null ? descriptor.SingletonInstance = descriptor.InstanceFactory.Invoke() - : descriptor.SingletonInstance = (UpdateHandlerBase)Activator.CreateInstance(descriptor.HandlerType, [descriptor.UpdateType])); + : descriptor.SingletonInstance = (UpdateHandlerBase)Activator.CreateInstance(descriptor.HandlerType)); } case DescriptorType.Keyed: case DescriptorType.General: { return descriptor.InstanceFactory == null - ? (UpdateHandlerBase)Activator.CreateInstance(descriptor.HandlerType, [descriptor.UpdateType]) + ? (UpdateHandlerBase)Activator.CreateInstance(descriptor.HandlerType) : descriptor.InstanceFactory.Invoke(); } diff --git a/Telegrator/Telegrator.csproj b/Telegrator/Telegrator.csproj index 36281d2..5d01bc6 100644 --- a/Telegrator/Telegrator.csproj +++ b/Telegrator/Telegrator.csproj @@ -17,7 +17,7 @@ True True LICENSE - 1.0.3 + 1.0.5 diff --git a/Telegrator/TypesExtensions.cs b/Telegrator/TypesExtensions.cs index 193387c..428a5fe 100644 --- a/Telegrator/TypesExtensions.cs +++ b/Telegrator/TypesExtensions.cs @@ -194,7 +194,7 @@ namespace Telegrator /// public static partial class HandlersCollectionExtensions { - private static readonly string[] skippingAssemblies = ["System", "Microsoft", "Telegrator"]; + private static readonly string[] skippingAssemblies = ["System.", "Microsoft."]; /// /// Collects all handlers from the current app domain. @@ -206,7 +206,8 @@ namespace Telegrator { AppDomain.CurrentDomain .GetAssemblies() - .Where(ass => skippingAssemblies.All(skip => !ass.FullName.Contains(skip))) + .Where(ass => ass.GetName().Name != "Telegrator") + .Where(ass => skippingAssemblies.All(skip => !ass.FullName.StartsWith(skip))) .SelectMany(ass => ass.GetExportedTypes()) .Where(type => type.GetCustomAttribute() == null) .Where(type => type.IsHandlerRealization())