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));
}