diff --git a/dev/Telegrator.RoslynGenerators/ImplicitHandlerBuilderExtensionsGenerator.cs b/dev/Telegrator.RoslynGenerators/ImplicitHandlerBuilderExtensionsGenerator.cs index 6ace9a5..88ff995 100644 --- a/dev/Telegrator.RoslynGenerators/ImplicitHandlerBuilderExtensionsGenerator.cs +++ b/dev/Telegrator.RoslynGenerators/ImplicitHandlerBuilderExtensionsGenerator.cs @@ -148,6 +148,7 @@ public class ImplicitHandlerBuilderExtensionsGenerator : IIncrementalGenerator .AddMembers([.. targetters.Values, .. extensions]); NamespaceDeclarationSyntax namespaceDeclaration = SyntaxFactory.NamespaceDeclaration(SyntaxFactory.ParseName("Telegrator")) + .WithLeadingTrivia(SyntaxFactory.ParseLeadingTrivia("#pragma warning disable CS1591")) .WithMembers([extensionsClass]); CompilationUnitSyntax compilationUnit = SyntaxFactory.CompilationUnit() diff --git a/docs/Telegrator.Hosting.xml b/docs/Telegrator.Hosting.xml index 2431094..10761a7 100644 --- a/docs/Telegrator.Hosting.xml +++ b/docs/Telegrator.Hosting.xml @@ -221,7 +221,7 @@ - + @@ -239,7 +239,7 @@ - + @@ -274,6 +274,14 @@ Provides method to configure Telegram Bot Host + + + Registers service + + + + + Registers default services diff --git a/docs/Telegrator.xml b/docs/Telegrator.xml index 819efc1..2fe8be2 100644 --- a/docs/Telegrator.xml +++ b/docs/Telegrator.xml @@ -7161,6 +7161,11 @@ Provides extension methods for working with Telegram Update objects. + + + Extracts the IETF language tag of the user's client from the update. + + Selects from Update an object from which you can get the sender's ID diff --git a/src/Telegrator.Hosting.Web/GlobalSuppressions.cs b/src/Telegrator.Hosting.Web/GlobalSuppressions.cs index d8586fa..691de9c 100644 --- a/src/Telegrator.Hosting.Web/GlobalSuppressions.cs +++ b/src/Telegrator.Hosting.Web/GlobalSuppressions.cs @@ -9,3 +9,4 @@ using System.Diagnostics.CodeAnalysis; [assembly: SuppressMessage("Style", "IDE0090")] [assembly: SuppressMessage("Usage", "CA2254")] [assembly: SuppressMessage("Maintainability", "CA1510")] +[assembly: SuppressMessage("Style", "IDE0270")] diff --git a/src/Telegrator.Hosting/GlobalSuppressions.cs b/src/Telegrator.Hosting/GlobalSuppressions.cs index d8586fa..691de9c 100644 --- a/src/Telegrator.Hosting/GlobalSuppressions.cs +++ b/src/Telegrator.Hosting/GlobalSuppressions.cs @@ -9,3 +9,4 @@ using System.Diagnostics.CodeAnalysis; [assembly: SuppressMessage("Style", "IDE0090")] [assembly: SuppressMessage("Usage", "CA2254")] [assembly: SuppressMessage("Maintainability", "CA1510")] +[assembly: SuppressMessage("Style", "IDE0270")] diff --git a/src/Telegrator/GlobalSuppressions.cs b/src/Telegrator/GlobalSuppressions.cs index 79b8605..e18cf2d 100644 --- a/src/Telegrator/GlobalSuppressions.cs +++ b/src/Telegrator/GlobalSuppressions.cs @@ -8,3 +8,4 @@ using System.Diagnostics.CodeAnalysis; [assembly: SuppressMessage("Style", "IDE0290")] [assembly: SuppressMessage("Style", "IDE0090")] [assembly: SuppressMessage("Style", "IDE0057")] +[assembly: SuppressMessage("Style", "IDE0270")] diff --git a/src/Telegrator/Handlers/Building/TypesExtensions.cs b/src/Telegrator/Handlers/Building/TypesExtensions.cs index 575b393..0827096 100644 --- a/src/Telegrator/Handlers/Building/TypesExtensions.cs +++ b/src/Telegrator/Handlers/Building/TypesExtensions.cs @@ -58,7 +58,8 @@ public static partial class HandlerBuilderExtensions handlerBuilder.AddFilters(filters); return handlerBuilder; } - + +#pragma warning disable CS1574 /// public static TBuilder SetState(this TBuilder handlerBuilder, TValue? myState) where TBuilder : HandlerBuilderBase @@ -68,6 +69,7 @@ public static partial class HandlerBuilderExtensions handlerBuilder.SetState(myState); return handlerBuilder; } +#pragma warning restore CS1574 /// /// Adds a targeted filter for a specific filter target type. diff --git a/src/Telegrator/States/DefaultStateStorage.cs b/src/Telegrator/States/DefaultStateStorage.cs index 3133cf9..53a0b06 100644 --- a/src/Telegrator/States/DefaultStateStorage.cs +++ b/src/Telegrator/States/DefaultStateStorage.cs @@ -16,7 +16,7 @@ public class DefaultStateStorage : IStateStorage if (key is null) throw new ArgumentNullException(nameof(key)); - if (!storage.TryRemove(key, out object value)) + if (!storage.TryRemove(key, out _)) throw new Exception("Failed to remove key '" + key + "' from storage."); return Task.CompletedTask; diff --git a/src/Telegrator/States/EnumStateMachine.cs b/src/Telegrator/States/EnumStateMachine.cs index af0aa66..bffc38d 100644 --- a/src/Telegrator/States/EnumStateMachine.cs +++ b/src/Telegrator/States/EnumStateMachine.cs @@ -10,7 +10,7 @@ namespace Telegrator.States; public class EnumStateMachine : IStateMachine where TEnum : struct, Enum, IEquatable { private readonly TEnum[] _states = Enum.GetValues(typeof(TEnum)).Cast().ToArray(); - private TEnum _defaultState => _states.FirstOrDefault(); + private TEnum DefaultState => _states.FirstOrDefault(); /// public async Task Current(IStateStorage storage, string updateKey, CancellationToken cancellationToken = default) @@ -19,7 +19,7 @@ public class EnumStateMachine : IStateMachine where TEnum : struct TEnum state = await storage.GetAsync(key, cancellationToken); return EqualityComparer.Default.Equals(state, default) - ? _defaultState : state; + ? DefaultState : state; } /// @@ -54,7 +54,7 @@ public class EnumStateMachine : IStateMachine where TEnum : struct public async Task Reset(IStateStorage storage, string updateKey, CancellationToken cancellationToken = default) { string key = FormatKey(updateKey); - await storage.SetAsync(key, _defaultState, cancellationToken); + await storage.SetAsync(key, DefaultState, cancellationToken); } private static string FormatKey(string updateKey) diff --git a/src/Telegrator/Telegrator.csproj b/src/Telegrator/Telegrator.csproj index 229907f..037ca42 100644 --- a/src/Telegrator/Telegrator.csproj +++ b/src/Telegrator/Telegrator.csproj @@ -32,6 +32,7 @@ + diff --git a/src/Telegrator/TypesExtensions.cs b/src/Telegrator/TypesExtensions.cs index 915b964..59f4300 100644 --- a/src/Telegrator/TypesExtensions.cs +++ b/src/Telegrator/TypesExtensions.cs @@ -515,6 +515,21 @@ public static partial class HandlersCollectionExtensions /// public static partial class UpdateExtensions { + /// + /// Extracts the IETF language tag of the user's client from the update. + /// + public static string? GetUserLanguageCode(this Update update) => update switch + { + { Message.From: { } from } => from.LanguageCode, + { EditedMessage.From: { } from } => from.LanguageCode, + { CallbackQuery.From: { } from } => from.LanguageCode, + { InlineQuery.From: { } from } => from.LanguageCode, + { ChatJoinRequest.From: { } from } => from.LanguageCode, + { PreCheckoutQuery.From: { } from } => from.LanguageCode, + { ShippingQuery.From: { } from } => from.LanguageCode, + _ => null + }; + /// /// Selects from Update an object from which you can get the sender's ID /// diff --git a/tests/Telegrator.Tests/Collections/CollectionTests.cs b/tests/Telegrator.Tests/Collections/CollectionTests.cs index d28cec9..1096e24 100644 --- a/tests/Telegrator.Tests/Collections/CollectionTests.cs +++ b/tests/Telegrator.Tests/Collections/CollectionTests.cs @@ -44,7 +44,7 @@ public class CollectionTests { // Arrange var list = new HandlerDescriptorList(); - var descriptor = CreateTestDescriptor(UpdateType.Message); + var descriptor = CreateTestDescriptor(); // Act list.Add(descriptor); @@ -64,9 +64,9 @@ public class CollectionTests { // Arrange var list = new HandlerDescriptorList(); - var descriptor1 = CreateTestDescriptor(UpdateType.Message); - var descriptor2 = CreateTestDescriptor(UpdateType.CallbackQuery); - var descriptor3 = CreateTestDescriptor(UpdateType.InlineQuery); + var descriptor1 = CreateTestDescriptor(); + var descriptor2 = CreateTestDescriptor(); + var descriptor3 = CreateTestDescriptor(); // Act list.Add(descriptor1); @@ -89,7 +89,7 @@ public class CollectionTests public void HandlerDescriptorList_Indexer_ShouldReturnDescriptorAtIndex() { // Arrange - var descriptor = CreateTestDescriptor(UpdateType.Message); + var descriptor = CreateTestDescriptor(); var list = new HandlerDescriptorList { descriptor @@ -116,7 +116,7 @@ public class CollectionTests // Arrange var list = new HandlerDescriptorList { - CreateTestDescriptor(UpdateType.Message) + CreateTestDescriptor() }; // Act & Assert @@ -133,8 +133,8 @@ public class CollectionTests public void HandlerDescriptorList_ShouldBeEnumerable() { // Arrange - var descriptor1 = CreateTestDescriptor(UpdateType.Message); - var descriptor2 = CreateTestDescriptor(UpdateType.CallbackQuery); + var descriptor1 = CreateTestDescriptor(); + var descriptor2 = CreateTestDescriptor(); var list = new HandlerDescriptorList { descriptor1, @@ -161,8 +161,8 @@ public class CollectionTests // Arrange var list = new HandlerDescriptorList { - CreateTestDescriptor(UpdateType.Message), - CreateTestDescriptor(UpdateType.CallbackQuery) + CreateTestDescriptor(), + CreateTestDescriptor() }; // Act @@ -183,8 +183,8 @@ public class CollectionTests { // Arrange var list = new HandlerDescriptorList(); - var descriptor = CreateTestDescriptor(UpdateType.Message); - var nonExistentDescriptor = CreateTestDescriptor(UpdateType.CallbackQuery); + var descriptor = CreateTestDescriptor(); + var nonExistentDescriptor = CreateTestDescriptor(); // Act list.Add(descriptor); @@ -206,7 +206,7 @@ public class CollectionTests { // Arrange var list = new HandlerDescriptorList(); - var descriptor = CreateTestDescriptor(UpdateType.Message); + var descriptor = CreateTestDescriptor(); list.Add(descriptor); // Act @@ -228,7 +228,7 @@ public class CollectionTests { // Arrange var list = new HandlerDescriptorList(); - var nonExistentDescriptor = CreateTestDescriptor(UpdateType.CallbackQuery); + var nonExistentDescriptor = CreateTestDescriptor(); // Act var removed = list.Remove(nonExistentDescriptor); @@ -269,7 +269,7 @@ public class CollectionTests // Act for (int i = 0; i < itemsCount; i++) { - list.Add(CreateTestDescriptor(UpdateType.Message)); + list.Add(CreateTestDescriptor()); } // Assert @@ -295,7 +295,7 @@ public class CollectionTests { for (int j = 0; j < 10; j++) { - list.Add(CreateTestDescriptor(UpdateType.Message)); + list.Add(CreateTestDescriptor()); } })); } @@ -309,7 +309,7 @@ public class CollectionTests /// /// Вспомогательный метод для создания тестового дескриптора. /// - private static HandlerDescriptor CreateTestDescriptor(UpdateType updateType) + private static HandlerDescriptor CreateTestDescriptor() { return new HandlerDescriptor(DescriptorType.General, typeof(TestUpdateHandler)); }