Compare commits
19 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0dedd3c0f4 | |||
| 79d5df8291 | |||
| 899243c62b | |||
| 5f9c640930 | |||
| 0e445dd586 | |||
| da090627ff | |||
| 88bd12aadd | |||
| 162d4a1d05 | |||
| e28cc2b8da | |||
| c6cda703ef | |||
| 401c8d02aa | |||
| 2cf4910abd | |||
| 81da5e0bc7 | |||
| b42e03fe06 | |||
| 4b14751c8d | |||
| 3fe0cc3b7c | |||
| ff2060e250 | |||
| 7df9e1e952 | |||
| a3fd6a6007 |
+2
-2
@@ -361,5 +361,5 @@ MigrationBackup/
|
|||||||
|
|
||||||
# Fody - auto-generated XML schema
|
# Fody - auto-generated XML schema
|
||||||
FodyWeavers.xsd
|
FodyWeavers.xsd
|
||||||
/GETTING_STARTED.md
|
|
||||||
/ANNOTATION_OVERVIEW.md
|
.aider*
|
||||||
|
|||||||
@@ -1,14 +1,10 @@
|
|||||||
# Telegrator
|
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
> **A modern reactive framework for Telegram bots in C# with aspect-oriented design, mediator-based dispatching, and flexible architecture.**
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🚀 About Telegrator
|
## 🚀 About Telegrator
|
||||||
|
|
||||||
Telegrator is a next-generation framework for building Telegram bots in C#, inspired by AOP (Aspect-Oriented Programming) and the mediator pattern. It enables decentralized, easily extensible, and maintainable bot logic without traditional state machines or monolithic handlers.
|
Telegrator is a modern C# framework for building Telegram bots, inspired by AOP (Aspect-Oriented Programming) and the mediator pattern. It enables decentralized, easily extensible, and maintainable bot logic without traditional state machines or monolithic handlers.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -55,7 +51,7 @@ using Telegrator.Annotations;
|
|||||||
[MessageHandler]
|
[MessageHandler]
|
||||||
public class HelloHandler : MessageHandler
|
public class HelloHandler : MessageHandler
|
||||||
{
|
{
|
||||||
public override async Task<Result> Execute(IAbstractHandlerContainer<Message> container, CancellationToken cancellation)
|
public override async Task<Result> Execute(IHandlerContainer<Message> container, CancellationToken cancellation)
|
||||||
{
|
{
|
||||||
await Reply("Hello, world!", cancellationToken: cancellation);
|
await Reply("Hello, world!", cancellationToken: cancellation);
|
||||||
return Result.Ok();
|
return Result.Ok();
|
||||||
@@ -75,10 +71,10 @@ using Telegram.Bot.Types.Enums;
|
|||||||
using Telegrator.Handlers;
|
using Telegrator.Handlers;
|
||||||
using Telegrator.Annotations;
|
using Telegrator.Annotations;
|
||||||
|
|
||||||
[CommandHandler, CommandAllias("start", "hello"), ChatType(ChatType.Private)]
|
[CommandHandler, CommandAlias("start", "hello"), ChatType(ChatType.Private)]
|
||||||
public class StartCommandHandler : CommandHandler
|
public class StartCommandHandler : CommandHandler
|
||||||
{
|
{
|
||||||
public override async Task<Result> Execute(IAbstractHandlerContainer<Message> container, CancellationToken cancellation)
|
public override async Task<Result> Execute(IHandlerContainer<Message> container, CancellationToken cancellation)
|
||||||
{
|
{
|
||||||
await Responce("Welcome!", cancellationToken: cancellation);
|
await Responce("Welcome!", cancellationToken: cancellation);
|
||||||
return Result.Ok();
|
return Result.Ok();
|
||||||
@@ -95,13 +91,12 @@ bot.Handlers.AddHandler<StartCommandHandler>();
|
|||||||
using Telegrator.Handlers;
|
using Telegrator.Handlers;
|
||||||
using Telegrator.Annotations;
|
using Telegrator.Annotations;
|
||||||
|
|
||||||
[CommandHandler, CommandAllias("first"), NumericState(SpecialState.NoState)]
|
[CommandHandler, CommandAlias("first"), State<SetupWizard>(null)]
|
||||||
public class StateKeepFirst : CommandHandler
|
public class StateKeepFirst : CommandHandler
|
||||||
{
|
{
|
||||||
public override async Task<Result> Execute(IAbstractHandlerContainer<Message> container, CancellationToken cancellation)
|
public override async Task<Result> Execute(IHandlerContainer<Message> container, CancellationToken cancellation)
|
||||||
{
|
{
|
||||||
container.CreateNumericState();
|
StateStorage.GetStateMachine<SetupWizard>().BysenderId().Advance();
|
||||||
container.ForwardNumericState();
|
|
||||||
await Reply("first state moved (1)", cancellationToken: cancellation);
|
await Reply("first state moved (1)", cancellationToken: cancellation);
|
||||||
return Result.Ok();
|
return Result.Ok();
|
||||||
}
|
}
|
||||||
@@ -126,7 +121,7 @@ bot.Handlers.AddHandler<StateKeepFirst>();
|
|||||||
## 📚 Documentation & Examples
|
## 📚 Documentation & Examples
|
||||||
|
|
||||||
- [Documentation](https://github.com/Rikitav/Telegrator/wiki/)
|
- [Documentation](https://github.com/Rikitav/Telegrator/wiki/)
|
||||||
- [Usage examples (WIP)](https://github.com/Rikitav/Telegrator/tree/master/Examples)
|
- [Usage examples (WIP)](https://github.com/Rikitav/Telegrator/tree/master/examples)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
<Solution>
|
<Solution>
|
||||||
<Project Path="dev/Telegrator.RoslynGenerators/Telegrator.RoslynGenerators.csproj" />
|
<Project Path="dev/Telegrator.RoslynGenerators/Telegrator.RoslynGenerators.csproj" />
|
||||||
|
<Project Path="src/Telegartor.RedisStateStorage/Telegartor.RedisStateStorage.csproj" />
|
||||||
<Project Path="src/Telegrator.Analyzers/Telegrator.Analyzers.csproj" />
|
<Project Path="src/Telegrator.Analyzers/Telegrator.Analyzers.csproj" />
|
||||||
<Project Path="src/Telegrator.Hosting.Web/Telegrator.Hosting.Web.csproj" />
|
<Project Path="src/Telegrator.Hosting.Web/Telegrator.Hosting.Web.csproj" />
|
||||||
<Project Path="src/Telegrator.Hosting/Telegrator.Hosting.csproj" />
|
<Project Path="src/Telegrator.Hosting/Telegrator.Hosting.csproj" />
|
||||||
|
|||||||
@@ -5,10 +5,6 @@ using System.Collections.Immutable;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using Telegrator.RoslynGenerators.RoslynExtensions;
|
using Telegrator.RoslynGenerators.RoslynExtensions;
|
||||||
|
|
||||||
#if DEBUG
|
|
||||||
using System.Diagnostics;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace Telegrator.RoslynGenerators;
|
namespace Telegrator.RoslynGenerators;
|
||||||
|
|
||||||
[Generator(LanguageNames.CSharp)]
|
[Generator(LanguageNames.CSharp)]
|
||||||
@@ -72,6 +68,9 @@ public class ImplicitHandlerBuilderExtensionsGenerator : IIncrementalGenerator
|
|||||||
if (className == "FilterAnnotation")
|
if (className == "FilterAnnotation")
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (className == "StateAttribute")
|
||||||
|
continue;
|
||||||
|
|
||||||
MethodDeclarationSyntax? targeter = classDeclaration.Members.OfType<MethodDeclarationSyntax>().SingleOrDefault(IsTargeterMethod);
|
MethodDeclarationSyntax? targeter = classDeclaration.Members.OfType<MethodDeclarationSyntax>().SingleOrDefault(IsTargeterMethod);
|
||||||
if (targeter != null)
|
if (targeter != null)
|
||||||
{
|
{
|
||||||
@@ -101,7 +100,13 @@ public class ImplicitHandlerBuilderExtensionsGenerator : IIncrementalGenerator
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
usings.UnionAdd(classDeclaration.FindAncestor<CompilationUnitSyntax>().Usings, UsingEqualityComparer);
|
usings.UnionAdd(classDeclaration.FindAncestor<CompilationUnitSyntax>().Usings, UsingEqualityComparer);
|
||||||
MethodDeclarationSyntax targeter = FindTargetterMethod(targetters, classDeclaration);
|
MethodDeclarationSyntax? targeter = FindTargetterMethod(targetters, classDeclaration);
|
||||||
|
|
||||||
|
if (targeter == null)
|
||||||
|
{
|
||||||
|
debugExport.AppendLine("Targetter not found");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (classDeclaration.ParameterList != null && classDeclaration.BaseList != null)
|
if (classDeclaration.ParameterList != null && classDeclaration.BaseList != null)
|
||||||
{
|
{
|
||||||
@@ -140,16 +145,16 @@ public class ImplicitHandlerBuilderExtensionsGenerator : IIncrementalGenerator
|
|||||||
{
|
{
|
||||||
ClassDeclarationSyntax extensionsClass = SyntaxFactory.ClassDeclaration("HandlerBuilderExtensions")
|
ClassDeclarationSyntax extensionsClass = SyntaxFactory.ClassDeclaration("HandlerBuilderExtensions")
|
||||||
.WithModifiers(Modifiers(SyntaxKind.PublicKeyword, SyntaxKind.StaticKeyword, SyntaxKind.PartialKeyword))
|
.WithModifiers(Modifiers(SyntaxKind.PublicKeyword, SyntaxKind.StaticKeyword, SyntaxKind.PartialKeyword))
|
||||||
.AddMembers([.. targetters.Values, .. extensions])
|
.AddMembers([.. targetters.Values, .. extensions]);
|
||||||
.DecorateType(1);
|
|
||||||
|
|
||||||
NamespaceDeclarationSyntax namespaceDeclaration = SyntaxFactory.NamespaceDeclaration(SyntaxFactory.ParseName("Telegrator"))
|
NamespaceDeclarationSyntax namespaceDeclaration = SyntaxFactory.NamespaceDeclaration(SyntaxFactory.ParseName("Telegrator"))
|
||||||
.WithMembers([extensionsClass])
|
.WithLeadingTrivia(SyntaxFactory.ParseLeadingTrivia("#pragma warning disable CS1591"))
|
||||||
.Decorate();
|
.WithMembers([extensionsClass]);
|
||||||
|
|
||||||
CompilationUnitSyntax compilationUnit = SyntaxFactory.CompilationUnit()
|
CompilationUnitSyntax compilationUnit = SyntaxFactory.CompilationUnit()
|
||||||
.WithUsings([.. usings])
|
.WithUsings([.. usings])
|
||||||
.WithMembers([namespaceDeclaration]);
|
.WithMembers([namespaceDeclaration])
|
||||||
|
.NormalizeWhitespace();
|
||||||
|
|
||||||
context.AddSource("GeneratedHandlerBuilderExtensions.cs", compilationUnit.ToFullString());
|
context.AddSource("GeneratedHandlerBuilderExtensions.cs", compilationUnit.ToFullString());
|
||||||
}
|
}
|
||||||
@@ -175,7 +180,7 @@ public class ImplicitHandlerBuilderExtensionsGenerator : IIncrementalGenerator
|
|||||||
if (targetterMethod.ExpressionBody != null)
|
if (targetterMethod.ExpressionBody != null)
|
||||||
method = method.WithExpressionBody(targetterMethod.ExpressionBody).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken));
|
method = method.WithExpressionBody(targetterMethod.ExpressionBody).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken));
|
||||||
|
|
||||||
return method.DecorateMember(2);
|
return method;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static MethodDeclarationSyntax GeneratedExtensionsMethod(ClassDeclarationSyntax classDeclaration, ParameterListSyntax methodParameters, ArgumentListSyntax invokerArguments, MethodDeclarationSyntax targetterMethod)
|
private static MethodDeclarationSyntax GeneratedExtensionsMethod(ClassDeclarationSyntax classDeclaration, ParameterListSyntax methodParameters, ArgumentListSyntax invokerArguments, MethodDeclarationSyntax targetterMethod)
|
||||||
@@ -204,11 +209,10 @@ public class ImplicitHandlerBuilderExtensionsGenerator : IIncrementalGenerator
|
|||||||
|
|
||||||
MethodDeclarationSyntax method = SyntaxFactory.MethodDeclaration(returnType, identifier)
|
MethodDeclarationSyntax method = SyntaxFactory.MethodDeclaration(returnType, identifier)
|
||||||
.WithParameterList(parameters)
|
.WithParameterList(parameters)
|
||||||
.WithBody(body.DecorateBlock(2))
|
.WithBody(body)
|
||||||
.WithTypeParameterList(typeParameters)
|
.WithTypeParameterList(typeParameters)
|
||||||
.WithModifiers(Modifiers(SyntaxKind.PublicKeyword, SyntaxKind.StaticKeyword))
|
.WithModifiers(Modifiers(SyntaxKind.PublicKeyword, SyntaxKind.StaticKeyword))
|
||||||
.WithConstraintClauses([typeParameterConstraint])
|
.WithConstraintClauses([typeParameterConstraint])
|
||||||
.DecorateMember(2)
|
|
||||||
.WithLeadingTrivia(xmlDoc);
|
.WithLeadingTrivia(xmlDoc);
|
||||||
|
|
||||||
return method;
|
return method;
|
||||||
@@ -230,7 +234,7 @@ public class ImplicitHandlerBuilderExtensionsGenerator : IIncrementalGenerator
|
|||||||
private static IEnumerable<ConstructorDeclarationSyntax> GetConstructors(ClassDeclarationSyntax classDeclaration)
|
private static IEnumerable<ConstructorDeclarationSyntax> GetConstructors(ClassDeclarationSyntax classDeclaration)
|
||||||
=> classDeclaration.Members.OfType<ConstructorDeclarationSyntax>().Where(ctor => ctor.Modifiers.HasModifiers("public"));
|
=> classDeclaration.Members.OfType<ConstructorDeclarationSyntax>().Where(ctor => ctor.Modifiers.HasModifiers("public"));
|
||||||
|
|
||||||
private static MethodDeclarationSyntax FindTargetterMethod(Dictionary<string, MethodDeclarationSyntax> targeters, ClassDeclarationSyntax classDeclaration)
|
private static MethodDeclarationSyntax? FindTargetterMethod(Dictionary<string, MethodDeclarationSyntax> targeters, ClassDeclarationSyntax classDeclaration)
|
||||||
{
|
{
|
||||||
if (targeters.TryGetValue(classDeclaration.Identifier.ValueText, out MethodDeclarationSyntax targeter))
|
if (targeters.TryGetValue(classDeclaration.Identifier.ValueText, out MethodDeclarationSyntax targeter))
|
||||||
return targeter;
|
return targeter;
|
||||||
@@ -238,7 +242,7 @@ public class ImplicitHandlerBuilderExtensionsGenerator : IIncrementalGenerator
|
|||||||
if (classDeclaration.BaseList != null && targeters.TryGetValue(classDeclaration.BaseList.Types.ElementAt(0).Type.ToString(), out targeter))
|
if (classDeclaration.BaseList != null && targeters.TryGetValue(classDeclaration.BaseList.Types.ElementAt(0).Type.ToString(), out targeter))
|
||||||
return targeter;
|
return targeter;
|
||||||
|
|
||||||
throw new TargteterNotFoundException();
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static SyntaxTriviaList BuildExtensionXmlDocTrivia(ClassDeclarationSyntax classDeclaration, ParameterListSyntax methodParameters)
|
private static SyntaxTriviaList BuildExtensionXmlDocTrivia(ClassDeclarationSyntax classDeclaration, ParameterListSyntax methodParameters)
|
||||||
|
|||||||
@@ -1,38 +0,0 @@
|
|||||||
using Microsoft.CodeAnalysis;
|
|
||||||
using Microsoft.CodeAnalysis.CSharp;
|
|
||||||
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
|
||||||
|
|
||||||
namespace Telegrator.RoslynGenerators.RoslynExtensions
|
|
||||||
{
|
|
||||||
public static class MemberDeclarationSyntaxExtensions
|
|
||||||
{
|
|
||||||
private static SyntaxTrivia TabulationTrivia => SyntaxFactory.SyntaxTrivia(SyntaxKind.WhitespaceTrivia, "\t");
|
|
||||||
private static SyntaxTrivia WhitespaceTrivia => SyntaxFactory.SyntaxTrivia(SyntaxKind.WhitespaceTrivia, " ");
|
|
||||||
private static SyntaxTrivia NewLineTrivia => SyntaxFactory.SyntaxTrivia(SyntaxKind.EndOfLineTrivia, "\n");
|
|
||||||
|
|
||||||
public static SyntaxTokenList Decorate(this SyntaxTokenList tokens)
|
|
||||||
=> new SyntaxTokenList(tokens.Select(token => token.WithoutTrivia().WithTrailingTrivia(WhitespaceTrivia)).ToArray());
|
|
||||||
|
|
||||||
public static BlockSyntax DecorateBlock(this BlockSyntax block, int times) => block
|
|
||||||
.WithStatements([.. block.Statements.Select(statement => statement.DecorateStatememnt(times + 1))])
|
|
||||||
.WithOpenBraceToken(SyntaxFactory.Token(SyntaxKind.OpenBraceToken).WithLeadingTrivia(WhitespaceTrivia).WithTrailingTrivia(NewLineTrivia))
|
|
||||||
.WithCloseBraceToken(SyntaxFactory.Token(SyntaxKind.CloseBraceToken).WithLeadingTrivia(TabulationTrivia.Repeat(times)).WithTrailingTrivia(NewLineTrivia));
|
|
||||||
|
|
||||||
public static T DecorateStatememnt<T>(this T statememnt, int times) where T : StatementSyntax => statememnt
|
|
||||||
.WithoutTrivia().WithLeadingTrivia(TabulationTrivia.Repeat(times)).WithTrailingTrivia(NewLineTrivia);
|
|
||||||
|
|
||||||
public static T DecorateMember<T>(this T typeDeclaration, int times) where T : MemberDeclarationSyntax => typeDeclaration
|
|
||||||
.WithoutTrivia().WithLeadingTrivia(TabulationTrivia.Repeat(times)).WithTrailingTrivia(NewLineTrivia);
|
|
||||||
|
|
||||||
public static NamespaceDeclarationSyntax Decorate(this NamespaceDeclarationSyntax namespaceDeclaration) => namespaceDeclaration
|
|
||||||
.WithName(namespaceDeclaration.Name.WithoutTrivia().WithLeadingTrivia(WhitespaceTrivia))
|
|
||||||
.WithOpenBraceToken(SyntaxFactory.Token(SyntaxKind.OpenBraceToken).WithLeadingTrivia(NewLineTrivia).WithTrailingTrivia(NewLineTrivia))
|
|
||||||
.WithCloseBraceToken(SyntaxFactory.Token(SyntaxKind.CloseBraceToken));
|
|
||||||
|
|
||||||
public static T DecorateType<T>(this T typeDeclaration, int times = 1) where T : TypeDeclarationSyntax => (T)typeDeclaration
|
|
||||||
.WithoutTrivia().WithLeadingTrivia(TabulationTrivia.Repeat(times))
|
|
||||||
.WithIdentifier(typeDeclaration.Identifier.WithoutTrivia().WithLeadingTrivia(WhitespaceTrivia).WithTrailingTrivia(NewLineTrivia))
|
|
||||||
.WithOpenBraceToken(SyntaxFactory.Token(SyntaxKind.OpenBraceToken).WithLeadingTrivia(TabulationTrivia.Repeat(times)).WithTrailingTrivia(NewLineTrivia))
|
|
||||||
.WithCloseBraceToken(SyntaxFactory.Token(SyntaxKind.CloseBraceToken).WithLeadingTrivia(TabulationTrivia.Repeat(times)).WithTrailingTrivia(NewLineTrivia));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,29 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<doc>
|
||||||
|
<assembly>
|
||||||
|
<name>Telegartor.RedisStateStorage</name>
|
||||||
|
</assembly>
|
||||||
|
<members>
|
||||||
|
<member name="T:Telegrator.States.RedisStateStorage">
|
||||||
|
<summary>
|
||||||
|
Provides a Redis-based implementation of the <see cref="T:Telegrator.Core.States.IStateStorage"/> interface.
|
||||||
|
Serializes state objects to JSON format before storing them in the Redis database.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:Telegrator.States.RedisStateStorage.#ctor(StackExchange.Redis.IConnectionMultiplexer)">
|
||||||
|
<summary>
|
||||||
|
Provides a Redis-based implementation of the <see cref="T:Telegrator.Core.States.IStateStorage"/> interface.
|
||||||
|
Serializes state objects to JSON format before storing them in the Redis database.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:Telegrator.States.RedisStateStorage.SetAsync``1(System.String,``0,System.Threading.CancellationToken)">
|
||||||
|
<inheritdoc/>
|
||||||
|
</member>
|
||||||
|
<member name="M:Telegrator.States.RedisStateStorage.GetAsync``1(System.String,System.Threading.CancellationToken)">
|
||||||
|
<inheritdoc/>
|
||||||
|
</member>
|
||||||
|
<member name="M:Telegrator.States.RedisStateStorage.DeleteAsync(System.String,System.Threading.CancellationToken)">
|
||||||
|
<inheritdoc/>
|
||||||
|
</member>
|
||||||
|
</members>
|
||||||
|
</doc>
|
||||||
@@ -100,6 +100,12 @@
|
|||||||
<member name="P:Telegrator.Hosting.Web.TelegramBotWebHostBuilder.Environment">
|
<member name="P:Telegrator.Hosting.Web.TelegramBotWebHostBuilder.Environment">
|
||||||
<inheritdoc/>
|
<inheritdoc/>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="P:Telegrator.Hosting.Web.TelegramBotWebHostBuilder.Properties">
|
||||||
|
<inheritdoc/>
|
||||||
|
</member>
|
||||||
|
<member name="P:Telegrator.Hosting.Web.TelegramBotWebHostBuilder.Metrics">
|
||||||
|
<inheritdoc/>
|
||||||
|
</member>
|
||||||
<member name="M:Telegrator.Hosting.Web.TelegramBotWebHostBuilder.#ctor(Microsoft.AspNetCore.Builder.WebApplicationBuilder,Microsoft.AspNetCore.Builder.WebApplicationOptions)">
|
<member name="M:Telegrator.Hosting.Web.TelegramBotWebHostBuilder.#ctor(Microsoft.AspNetCore.Builder.WebApplicationBuilder,Microsoft.AspNetCore.Builder.WebApplicationOptions)">
|
||||||
<summary>
|
<summary>
|
||||||
Initializes a new instance of the <see cref="T:Telegrator.Hosting.Web.TelegramBotWebHostBuilder"/> class.
|
Initializes a new instance of the <see cref="T:Telegrator.Hosting.Web.TelegramBotWebHostBuilder"/> class.
|
||||||
@@ -107,6 +113,14 @@
|
|||||||
<param name="webApplicationBuilder"></param>
|
<param name="webApplicationBuilder"></param>
|
||||||
<param name="settings"></param>
|
<param name="settings"></param>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:Telegrator.Hosting.Web.TelegramBotWebHostBuilder.#ctor(Microsoft.AspNetCore.Builder.WebApplicationBuilder,Telegrator.TelegratorOptions,Microsoft.AspNetCore.Builder.WebApplicationOptions)">
|
||||||
|
<summary>
|
||||||
|
Initializes a new instance of the <see cref="T:Telegrator.Hosting.Web.TelegramBotWebHostBuilder"/> class.
|
||||||
|
</summary>
|
||||||
|
<param name="webApplicationBuilder"></param>
|
||||||
|
<param name="options"></param>
|
||||||
|
<param name="settings"></param>
|
||||||
|
</member>
|
||||||
<member name="M:Telegrator.Hosting.Web.TelegramBotWebHostBuilder.#ctor(Microsoft.AspNetCore.Builder.WebApplicationBuilder,Telegrator.Core.IHandlersCollection,Microsoft.AspNetCore.Builder.WebApplicationOptions)">
|
<member name="M:Telegrator.Hosting.Web.TelegramBotWebHostBuilder.#ctor(Microsoft.AspNetCore.Builder.WebApplicationBuilder,Telegrator.Core.IHandlersCollection,Microsoft.AspNetCore.Builder.WebApplicationOptions)">
|
||||||
<summary>
|
<summary>
|
||||||
Initializes a new instance of the <see cref="T:Telegrator.Hosting.Web.TelegramBotWebHostBuilder"/> class.
|
Initializes a new instance of the <see cref="T:Telegrator.Hosting.Web.TelegramBotWebHostBuilder"/> class.
|
||||||
@@ -115,12 +129,24 @@
|
|||||||
<param name="handlers"></param>
|
<param name="handlers"></param>
|
||||||
<param name="settings"></param>
|
<param name="settings"></param>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:Telegrator.Hosting.Web.TelegramBotWebHostBuilder.#ctor(Microsoft.AspNetCore.Builder.WebApplicationBuilder,Telegrator.Core.IHandlersCollection,Telegrator.TelegratorOptions,Microsoft.AspNetCore.Builder.WebApplicationOptions)">
|
||||||
|
<summary>
|
||||||
|
Initializes a new instance of the <see cref="T:Telegrator.Hosting.Web.TelegramBotWebHostBuilder"/> class.
|
||||||
|
</summary>
|
||||||
|
<param name="webApplicationBuilder"></param>
|
||||||
|
<param name="handlers"></param>
|
||||||
|
<param name="options"></param>
|
||||||
|
<param name="settings"></param>
|
||||||
|
</member>
|
||||||
<member name="M:Telegrator.Hosting.Web.TelegramBotWebHostBuilder.Build">
|
<member name="M:Telegrator.Hosting.Web.TelegramBotWebHostBuilder.Build">
|
||||||
<summary>
|
<summary>
|
||||||
Builds the host.
|
Builds the host.
|
||||||
</summary>
|
</summary>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:Telegrator.Hosting.Web.TelegramBotWebHostBuilder.ConfigureContainer``1(Microsoft.Extensions.DependencyInjection.IServiceProviderFactory{``0},System.Action{``0})">
|
||||||
|
<inheritdoc/>
|
||||||
|
</member>
|
||||||
<member name="T:Telegrator.Hosting.Web.WebhookerOptions">
|
<member name="T:Telegrator.Hosting.Web.WebhookerOptions">
|
||||||
<summary>
|
<summary>
|
||||||
Configuration options for Telegram bot behavior and execution settings.
|
Configuration options for Telegram bot behavior and execution settings.
|
||||||
@@ -185,7 +211,7 @@
|
|||||||
<member name="M:Telegrator.ServicesCollectionExtensions.get_Handlers(Microsoft.AspNetCore.Builder.WebApplicationBuilder)">
|
<member name="M:Telegrator.ServicesCollectionExtensions.get_Handlers(Microsoft.AspNetCore.Builder.WebApplicationBuilder)">
|
||||||
<inheritdoc cref="P:Telegrator.ServicesCollectionExtensions.<G>$41F16C2D39AF52899E745C9C9F42FF83.Handlers"/>
|
<inheritdoc cref="P:Telegrator.ServicesCollectionExtensions.<G>$41F16C2D39AF52899E745C9C9F42FF83.Handlers"/>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:Telegrator.ServicesCollectionExtensions.AddTelegratorWeb(Microsoft.Extensions.Hosting.IHostApplicationBuilder,Microsoft.AspNetCore.Builder.WebApplicationOptions,Telegrator.TelegratorOptions,Telegrator.Core.IHandlersCollection)">
|
<member name="M:Telegrator.ServicesCollectionExtensions.AddTelegratorWeb(Microsoft.Extensions.Hosting.IHostApplicationBuilder,Telegrator.TelegratorOptions,Telegrator.Core.IHandlersCollection)">
|
||||||
<summary>
|
<summary>
|
||||||
Replaces TelegramBotWebHostBuilder. Configures DI, options, and handlers.
|
Replaces TelegramBotWebHostBuilder. Configures DI, options, and handlers.
|
||||||
</summary>
|
</summary>
|
||||||
|
|||||||
+39
-32
@@ -13,7 +13,7 @@
|
|||||||
<param name="services"></param>
|
<param name="services"></param>
|
||||||
<param name="configuration"></param>
|
<param name="configuration"></param>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:Telegrator.Hosting.HostedTelegramBotInfo.#ctor(Telegram.Bot.ITelegramBotClient,System.IServiceProvider,Microsoft.Extensions.Configuration.IConfigurationManager)">
|
<member name="M:Telegrator.Hosting.HostedTelegramBotInfo.#ctor(Telegram.Bot.ITelegramBotClient,System.IServiceProvider,Microsoft.Extensions.Configuration.IConfiguration)">
|
||||||
<summary>
|
<summary>
|
||||||
Implementation of <see cref="T:Telegrator.Core.ITelegramBotInfo"/> that provides bot information.
|
Implementation of <see cref="T:Telegrator.Core.ITelegramBotInfo"/> that provides bot information.
|
||||||
Contains metadata about the Telegram bot including user details and service provider for wider filterring abilities
|
Contains metadata about the Telegram bot including user details and service provider for wider filterring abilities
|
||||||
@@ -35,27 +35,6 @@
|
|||||||
Provides access to configuration of this Hosted telegram bot
|
Provides access to configuration of this Hosted telegram bot
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="T:Telegrator.Hosting.ITelegramBotHostBuilder">
|
|
||||||
<summary>
|
|
||||||
Interface for building Telegram bot hosts with dependency injection support.
|
|
||||||
Combines host application building capabilities with handler collection functionality.
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="P:Telegrator.Hosting.ITelegramBotHostBuilder.Configuration">
|
|
||||||
<summary>
|
|
||||||
Gets the set of key/value configuration properties.
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="P:Telegrator.Hosting.ITelegramBotHostBuilder.Logging">
|
|
||||||
<summary>
|
|
||||||
Gets a collection of logging providers for the application to compose. This is useful for adding new logging providers.
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="P:Telegrator.Hosting.ITelegramBotHostBuilder.Services">
|
|
||||||
<summary>
|
|
||||||
Gets a collection of services for the application to compose. This is useful for adding user provided or framework provided services.
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="T:Telegrator.Hosting.TelegramBotHost">
|
<member name="T:Telegrator.Hosting.TelegramBotHost">
|
||||||
<summary>
|
<summary>
|
||||||
Represents a hosted telegram bot
|
Represents a hosted telegram bot
|
||||||
@@ -133,6 +112,12 @@
|
|||||||
<member name="P:Telegrator.Hosting.TelegramBotHostBuilder.Environment">
|
<member name="P:Telegrator.Hosting.TelegramBotHostBuilder.Environment">
|
||||||
<inheritdoc/>
|
<inheritdoc/>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="P:Telegrator.Hosting.TelegramBotHostBuilder.Properties">
|
||||||
|
<inheritdoc/>
|
||||||
|
</member>
|
||||||
|
<member name="P:Telegrator.Hosting.TelegramBotHostBuilder.Metrics">
|
||||||
|
<inheritdoc/>
|
||||||
|
</member>
|
||||||
<member name="M:Telegrator.Hosting.TelegramBotHostBuilder.#ctor(Microsoft.Extensions.Hosting.HostApplicationBuilder,Microsoft.Extensions.Hosting.HostApplicationBuilderSettings)">
|
<member name="M:Telegrator.Hosting.TelegramBotHostBuilder.#ctor(Microsoft.Extensions.Hosting.HostApplicationBuilder,Microsoft.Extensions.Hosting.HostApplicationBuilderSettings)">
|
||||||
<summary>
|
<summary>
|
||||||
Initializes a new instance of the <see cref="T:Telegrator.Hosting.TelegramBotHostBuilder"/> class.
|
Initializes a new instance of the <see cref="T:Telegrator.Hosting.TelegramBotHostBuilder"/> class.
|
||||||
@@ -140,6 +125,14 @@
|
|||||||
<param name="hostApplicationBuilder"></param>
|
<param name="hostApplicationBuilder"></param>
|
||||||
<param name="settings"></param>
|
<param name="settings"></param>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:Telegrator.Hosting.TelegramBotHostBuilder.#ctor(Microsoft.Extensions.Hosting.HostApplicationBuilder,Telegrator.TelegratorOptions,Microsoft.Extensions.Hosting.HostApplicationBuilderSettings)">
|
||||||
|
<summary>
|
||||||
|
Initializes a new instance of the <see cref="T:Telegrator.Hosting.TelegramBotHostBuilder"/> class.
|
||||||
|
</summary>
|
||||||
|
<param name="hostApplicationBuilder"></param>
|
||||||
|
<param name="options"></param>
|
||||||
|
<param name="settings"></param>
|
||||||
|
</member>
|
||||||
<member name="M:Telegrator.Hosting.TelegramBotHostBuilder.#ctor(Microsoft.Extensions.Hosting.HostApplicationBuilder,Telegrator.Core.IHandlersCollection,Microsoft.Extensions.Hosting.HostApplicationBuilderSettings)">
|
<member name="M:Telegrator.Hosting.TelegramBotHostBuilder.#ctor(Microsoft.Extensions.Hosting.HostApplicationBuilder,Telegrator.Core.IHandlersCollection,Microsoft.Extensions.Hosting.HostApplicationBuilderSettings)">
|
||||||
<summary>
|
<summary>
|
||||||
Initializes a new instance of the <see cref="T:Telegrator.Hosting.TelegramBotHostBuilder"/> class.
|
Initializes a new instance of the <see cref="T:Telegrator.Hosting.TelegramBotHostBuilder"/> class.
|
||||||
@@ -148,12 +141,24 @@
|
|||||||
<param name="handlers"></param>
|
<param name="handlers"></param>
|
||||||
<param name="settings"></param>
|
<param name="settings"></param>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:Telegrator.Hosting.TelegramBotHostBuilder.#ctor(Microsoft.Extensions.Hosting.HostApplicationBuilder,Telegrator.Core.IHandlersCollection,Telegrator.TelegratorOptions,Microsoft.Extensions.Hosting.HostApplicationBuilderSettings)">
|
||||||
|
<summary>
|
||||||
|
Initializes a new instance of the <see cref="T:Telegrator.Hosting.TelegramBotHostBuilder"/> class.
|
||||||
|
</summary>
|
||||||
|
<param name="hostApplicationBuilder"></param>
|
||||||
|
<param name="handlers"></param>
|
||||||
|
<param name="options"></param>
|
||||||
|
<param name="settings"></param>
|
||||||
|
</member>
|
||||||
<member name="M:Telegrator.Hosting.TelegramBotHostBuilder.Build">
|
<member name="M:Telegrator.Hosting.TelegramBotHostBuilder.Build">
|
||||||
<summary>
|
<summary>
|
||||||
Builds the host.
|
Builds the host.
|
||||||
</summary>
|
</summary>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:Telegrator.Hosting.TelegramBotHostBuilder.ConfigureContainer``1(Microsoft.Extensions.DependencyInjection.IServiceProviderFactory{``0},System.Action{``0})">
|
||||||
|
<inheritdoc/>
|
||||||
|
</member>
|
||||||
<member name="T:Telegrator.Logging.MicrosoftLoggingAdapter">
|
<member name="T:Telegrator.Logging.MicrosoftLoggingAdapter">
|
||||||
<summary>
|
<summary>
|
||||||
Adapter for Microsoft.Extensions.Logging to work with Telegrator logging system.
|
Adapter for Microsoft.Extensions.Logging to work with Telegrator logging system.
|
||||||
@@ -190,12 +195,6 @@
|
|||||||
<member name="M:Telegrator.Polling.HostedUpdateReceiver.ExecuteAsync(System.Threading.CancellationToken)">
|
<member name="M:Telegrator.Polling.HostedUpdateReceiver.ExecuteAsync(System.Threading.CancellationToken)">
|
||||||
<inheritdoc/>
|
<inheritdoc/>
|
||||||
</member>
|
</member>
|
||||||
<member name="T:Telegrator.Polling.HostUpdateHandlersPool">
|
|
||||||
<inheritdoc/>
|
|
||||||
</member>
|
|
||||||
<member name="M:Telegrator.Polling.HostUpdateHandlersPool.#ctor(Telegrator.Core.IUpdateRouter,Microsoft.Extensions.Options.IOptions{Telegrator.TelegratorOptions})">
|
|
||||||
<inheritdoc/>
|
|
||||||
</member>
|
|
||||||
<member name="T:Telegrator.Polling.HostUpdateRouter">
|
<member name="T:Telegrator.Polling.HostUpdateRouter">
|
||||||
<inheritdoc/>
|
<inheritdoc/>
|
||||||
</member>
|
</member>
|
||||||
@@ -204,7 +203,7 @@
|
|||||||
<see cref="T:Microsoft.Extensions.Logging.ILogger"/> of this router
|
<see cref="T:Microsoft.Extensions.Logging.ILogger"/> of this router
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:Telegrator.Polling.HostUpdateRouter.#ctor(Telegrator.Core.IHandlersProvider,Telegrator.Core.IAwaitingProvider,Microsoft.Extensions.Options.IOptions{Telegrator.TelegratorOptions},Telegrator.Core.IUpdateHandlersPool,Telegrator.Core.ITelegramBotInfo,Microsoft.Extensions.Logging.ILogger{Telegrator.Polling.HostUpdateRouter})">
|
<member name="M:Telegrator.Polling.HostUpdateRouter.#ctor(Telegrator.Core.IHandlersProvider,Telegrator.Core.IAwaitingProvider,Telegrator.Core.States.IStateStorage,Microsoft.Extensions.Options.IOptions{Telegrator.TelegratorOptions},Telegrator.Core.ITelegramBotInfo,Microsoft.Extensions.Logging.ILogger{Telegrator.Polling.HostUpdateRouter})">
|
||||||
<inheritdoc/>
|
<inheritdoc/>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:Telegrator.Polling.HostUpdateRouter.HandleUpdateAsync(Telegram.Bot.ITelegramBotClient,Telegram.Bot.Types.Update,System.Threading.CancellationToken)">
|
<member name="M:Telegrator.Polling.HostUpdateRouter.HandleUpdateAsync(Telegram.Bot.ITelegramBotClient,Telegram.Bot.Types.Update,System.Threading.CancellationToken)">
|
||||||
@@ -222,7 +221,7 @@
|
|||||||
<member name="T:Telegrator.Providers.HostAwaitingProvider">
|
<member name="T:Telegrator.Providers.HostAwaitingProvider">
|
||||||
<inheritdoc/>
|
<inheritdoc/>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:Telegrator.Providers.HostAwaitingProvider.#ctor(Microsoft.Extensions.Options.IOptions{Telegrator.TelegratorOptions},Microsoft.Extensions.Logging.ILogger{Telegrator.Providers.HostAwaitingProvider})">
|
<member name="M:Telegrator.Providers.HostAwaitingProvider.#ctor(Microsoft.Extensions.Options.IOptions{Telegrator.TelegratorOptions})">
|
||||||
<inheritdoc/>
|
<inheritdoc/>
|
||||||
</member>
|
</member>
|
||||||
<member name="T:Telegrator.Providers.HostHandlersCollection">
|
<member name="T:Telegrator.Providers.HostHandlersCollection">
|
||||||
@@ -240,7 +239,7 @@
|
|||||||
<member name="T:Telegrator.Providers.HostHandlersProvider">
|
<member name="T:Telegrator.Providers.HostHandlersProvider">
|
||||||
<inheritdoc/>
|
<inheritdoc/>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:Telegrator.Providers.HostHandlersProvider.#ctor(Telegrator.Core.IHandlersCollection,Microsoft.Extensions.Options.IOptions{Telegrator.TelegratorOptions},System.IServiceProvider,Microsoft.Extensions.Logging.ILogger{Telegrator.Providers.HostHandlersProvider})">
|
<member name="M:Telegrator.Providers.HostHandlersProvider.#ctor(Telegrator.Core.IHandlersCollection,Microsoft.Extensions.Options.IOptions{Telegrator.TelegratorOptions},System.IServiceProvider)">
|
||||||
<inheritdoc/>
|
<inheritdoc/>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:Telegrator.Providers.HostHandlersProvider.GetHandlerInstance(Telegrator.Core.Descriptors.HandlerDescriptor,System.Threading.CancellationToken)">
|
<member name="M:Telegrator.Providers.HostHandlersProvider.GetHandlerInstance(Telegrator.Core.Descriptors.HandlerDescriptor,System.Threading.CancellationToken)">
|
||||||
@@ -259,7 +258,7 @@
|
|||||||
<member name="M:Telegrator.HostBuilderExtensions.get_Handlers(Microsoft.Extensions.Hosting.IHostApplicationBuilder)">
|
<member name="M:Telegrator.HostBuilderExtensions.get_Handlers(Microsoft.Extensions.Hosting.IHostApplicationBuilder)">
|
||||||
<inheritdoc cref="P:Telegrator.HostBuilderExtensions.<G>$605D8CCF64349EA050C790D67C500BD9.Handlers"/>
|
<inheritdoc cref="P:Telegrator.HostBuilderExtensions.<G>$605D8CCF64349EA050C790D67C500BD9.Handlers"/>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:Telegrator.HostBuilderExtensions.AddTelegrator(Microsoft.Extensions.Hosting.IHostApplicationBuilder,Microsoft.Extensions.Hosting.HostApplicationBuilderSettings,Telegrator.TelegratorOptions,Telegrator.Core.IHandlersCollection)">
|
<member name="M:Telegrator.HostBuilderExtensions.AddTelegrator(Microsoft.Extensions.Hosting.IHostApplicationBuilder,Telegrator.TelegratorOptions,Telegrator.Core.IHandlersCollection)">
|
||||||
<summary>
|
<summary>
|
||||||
Replaces TelegramBotWebHostBuilder. Configures DI, options, and handlers.
|
Replaces TelegramBotWebHostBuilder. Configures DI, options, and handlers.
|
||||||
</summary>
|
</summary>
|
||||||
@@ -275,6 +274,14 @@
|
|||||||
Provides method to configure Telegram Bot Host
|
Provides method to configure Telegram Bot Host
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:Telegrator.ServicesCollectionExtensions.AddStateStorage``1(Microsoft.Extensions.DependencyInjection.IServiceCollection)">
|
||||||
|
<summary>
|
||||||
|
Registers <see cref="T:Telegrator.Core.States.IStateStorage"/> service
|
||||||
|
</summary>
|
||||||
|
<typeparam name="TStorage"></typeparam>
|
||||||
|
<param name="services"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:Telegrator.ServicesCollectionExtensions.AddTelegramBotHostDefaults(Microsoft.Extensions.DependencyInjection.IServiceCollection)">
|
<member name="M:Telegrator.ServicesCollectionExtensions.AddTelegramBotHostDefaults(Microsoft.Extensions.DependencyInjection.IServiceCollection)">
|
||||||
<summary>
|
<summary>
|
||||||
Registers <see cref="T:Telegrator.Hosting.TelegramBotHost"/> default services
|
Registers <see cref="T:Telegrator.Hosting.TelegramBotHost"/> default services
|
||||||
|
|||||||
+269
-689
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,13 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net10.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Telegrator" Version="1.16.2"/>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
using Telegrator;
|
||||||
|
|
||||||
|
namespace Telegrator.Examples;
|
||||||
|
|
||||||
|
public class EchoBot
|
||||||
|
{
|
||||||
|
public static void Main(string[] args)
|
||||||
|
{
|
||||||
|
var client = new TelegratorClient();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
# Telegrator.RedisStateStorage
|
||||||
|
|
||||||
|
**Telegrator.RedisStateStorage** is an extension for the Telegrator framework that provides Redis powered IStateStorage implementation.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
- .NET standart 2.1 or later
|
||||||
|
- [Telegrator](https://github.com/Rikitav/Telegrator)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
```shell
|
||||||
|
dotnet add package Telegrator.RedisStateStorage
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Quick Start Example
|
||||||
|
|
||||||
|
**Program.cs:**
|
||||||
|
```csharp
|
||||||
|
using Telegrator.Hosting;
|
||||||
|
|
||||||
|
// Creating builder
|
||||||
|
TelegramBotHostBuilder builder = TelegramBotHost.CreateBuilder(new HostApplicationBuilderSettings()
|
||||||
|
{
|
||||||
|
Args = args,
|
||||||
|
ApplicationName = "TelegramBotHost example",
|
||||||
|
});
|
||||||
|
|
||||||
|
// Registerring handlers
|
||||||
|
builder.Handlers.CollectHandlersAssemblyWide();
|
||||||
|
|
||||||
|
// Register your services and
|
||||||
|
builder.Services.AddService<IStateStorage, RedisStateStorage>(services =>
|
||||||
|
new RedisStateStorage(ConnectionMultiplexer.Connect("server1:6379, server2:6379")));
|
||||||
|
|
||||||
|
// Building and running application
|
||||||
|
TelegramBotHost telegramBot = builder.Build();
|
||||||
|
telegramBot.SetBotCommands();
|
||||||
|
telegramBot.Run();
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
- [Telegrator Main Docs](https://github.com/Rikitav/Telegrator)
|
||||||
|
- [Getting Started Guide](https://github.com/Rikitav/Telegrator/wiki/Getting-started)
|
||||||
|
- [Annotation Overview](https://github.com/Rikitav/Telegrator/wiki/Annotation-overview)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## License
|
||||||
|
GPLv3
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
using StackExchange.Redis;
|
||||||
|
using System.Text.Json;
|
||||||
|
using Telegrator.Core.States;
|
||||||
|
|
||||||
|
namespace Telegrator.States;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Provides a Redis-based implementation of the <see cref="IStateStorage"/> interface.
|
||||||
|
/// Serializes state objects to JSON format before storing them in the Redis database.
|
||||||
|
/// </summary>
|
||||||
|
public class RedisStateStorage(IConnectionMultiplexer redis) : IStateStorage
|
||||||
|
{
|
||||||
|
private readonly IDatabase _db = redis.GetDatabase();
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public async Task SetAsync<T>(string key, T state, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
string json = JsonSerializer.Serialize(state);
|
||||||
|
await _db.StringSetAsync(key, json);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public async Task<T?> GetAsync<T>(string key, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
RedisValue json = await _db.StringGetAsync(key);
|
||||||
|
string? jsonStr = json;
|
||||||
|
|
||||||
|
if (jsonStr is null)
|
||||||
|
return default;
|
||||||
|
|
||||||
|
return JsonSerializer.Deserialize<T?>(json: jsonStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public async Task DeleteAsync(string key, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
await _db.KeyDeleteAsync(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>netstandard2.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<LangVersion>latest</LangVersion>
|
||||||
|
<RootNamespace>Telegrator</RootNamespace>
|
||||||
|
<BaseOutputPath>..\..\bin</BaseOutputPath>
|
||||||
|
<DocumentationFile>..\..\docs\$(AssemblyName).xml</DocumentationFile>
|
||||||
|
|
||||||
|
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
|
||||||
|
<GenerateDocumentationFile>True</GenerateDocumentationFile>
|
||||||
|
<EnableNETAnalyzers>True</EnableNETAnalyzers>
|
||||||
|
<EnforceCodeStyleInBuild>True</EnforceCodeStyleInBuild>
|
||||||
|
|
||||||
|
<Title>Telegrator.RedisStateStorage</Title>
|
||||||
|
<Version>1.16.5</Version>
|
||||||
|
<Authors>Rikitav Tim4ik</Authors>
|
||||||
|
<Company>Rikitav Tim4ik</Company>
|
||||||
|
<RepositoryUrl>https://github.com/Rikitav/Telegrator</RepositoryUrl>
|
||||||
|
<PackageTags>telegram;bot;mediator;attributes;aspect;hosting;host;framework;easy;simple;handlers</PackageTags>
|
||||||
|
|
||||||
|
<PackageIcon>telegrator_nuget.png</PackageIcon>
|
||||||
|
<PackageReadmeFile>README.md</PackageReadmeFile>
|
||||||
|
<PackageLicenseFile>LICENSE</PackageLicenseFile>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\Telegrator\Telegrator.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="StackExchange.Redis" Version="2.11.8" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include=".\README.md" Pack="True" PackagePath="\" />
|
||||||
|
<None Include="..\..\LICENSE" Pack="True" PackagePath="\" />
|
||||||
|
<None Include="..\..\resources\telegrator_nuget.png" Pack="True" PackagePath="\" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -9,3 +9,4 @@ using System.Diagnostics.CodeAnalysis;
|
|||||||
[assembly: SuppressMessage("Style", "IDE0090")]
|
[assembly: SuppressMessage("Style", "IDE0090")]
|
||||||
[assembly: SuppressMessage("Usage", "CA2254")]
|
[assembly: SuppressMessage("Usage", "CA2254")]
|
||||||
[assembly: SuppressMessage("Maintainability", "CA1510")]
|
[assembly: SuppressMessage("Maintainability", "CA1510")]
|
||||||
|
[assembly: SuppressMessage("Style", "IDE0270")]
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ using Microsoft.Extensions.Hosting;
|
|||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Telegrator.Core;
|
using Telegrator.Core;
|
||||||
|
|
||||||
namespace Telegrator.Hosting.Web
|
namespace Telegrator.Hosting.Web;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents a web hosted telegram bot
|
/// Represents a web hosted telegram bot
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -53,7 +53,6 @@ namespace Telegrator.Hosting.Web
|
|||||||
{
|
{
|
||||||
// Building proxy application
|
// Building proxy application
|
||||||
_innerApp = webApplicationBuilder.Build();
|
_innerApp = webApplicationBuilder.Build();
|
||||||
_innerApp.UseTelegratorWeb();
|
|
||||||
|
|
||||||
// Reruesting services for this host
|
// Reruesting services for this host
|
||||||
_updateRouter = Services.GetRequiredService<IUpdateRouter>();
|
_updateRouter = Services.GetRequiredService<IUpdateRouter>();
|
||||||
@@ -158,4 +157,3 @@ namespace Telegrator.Hosting.Web
|
|||||||
_disposed = true;
|
_disposed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,21 +1,18 @@
|
|||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using Microsoft.Extensions.Diagnostics.Metrics;
|
||||||
using Microsoft.Extensions.Hosting;
|
using Microsoft.Extensions.Hosting;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.Extensions.Options;
|
|
||||||
using Telegram.Bot;
|
|
||||||
using Telegrator;
|
|
||||||
using Telegrator.Core;
|
using Telegrator.Core;
|
||||||
using Telegrator.Providers;
|
|
||||||
|
|
||||||
#pragma warning disable IDE0001
|
#pragma warning disable IDE0001
|
||||||
namespace Telegrator.Hosting.Web
|
namespace Telegrator.Hosting.Web;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents a web hosted telegram bots and services builder that helps manage configuration, logging, lifetime, and more.
|
/// Represents a web hosted telegram bots and services builder that helps manage configuration, logging, lifetime, and more.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class TelegramBotWebHostBuilder : ITelegramBotHostBuilder
|
public class TelegramBotWebHostBuilder : IHostApplicationBuilder, ICollectingProvider
|
||||||
{
|
{
|
||||||
private readonly WebApplicationBuilder _innerBuilder;
|
private readonly WebApplicationBuilder _innerBuilder;
|
||||||
private readonly WebApplicationOptions _settings;
|
private readonly WebApplicationOptions _settings;
|
||||||
@@ -36,17 +33,37 @@ namespace Telegrator.Hosting.Web
|
|||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public IHostEnvironment Environment => _innerBuilder.Environment;
|
public IHostEnvironment Environment => _innerBuilder.Environment;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public IDictionary<object, object> Properties => ((IHostApplicationBuilder)_innerBuilder).Properties;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public IMetricsBuilder Metrics => _innerBuilder.Metrics;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="TelegramBotWebHostBuilder"/> class.
|
/// Initializes a new instance of the <see cref="TelegramBotWebHostBuilder"/> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="webApplicationBuilder"></param>
|
/// <param name="webApplicationBuilder"></param>
|
||||||
/// <param name="settings"></param>
|
/// <param name="settings"></param>
|
||||||
public TelegramBotWebHostBuilder(WebApplicationBuilder webApplicationBuilder, WebApplicationOptions settings)
|
public TelegramBotWebHostBuilder(WebApplicationBuilder webApplicationBuilder, WebApplicationOptions? settings = null)
|
||||||
{
|
{
|
||||||
_innerBuilder = webApplicationBuilder ?? throw new ArgumentNullException(nameof(webApplicationBuilder));
|
_innerBuilder = webApplicationBuilder ?? throw new ArgumentNullException(nameof(webApplicationBuilder));
|
||||||
_settings = settings ?? throw new ArgumentNullException(nameof(settings));
|
_settings = settings ?? throw new ArgumentNullException(nameof(settings));
|
||||||
|
|
||||||
_innerBuilder.AddTelegratorWeb(settings);
|
this.AddTelegratorWeb();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="TelegramBotWebHostBuilder"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="webApplicationBuilder"></param>
|
||||||
|
/// <param name="options"></param>
|
||||||
|
/// <param name="settings"></param>
|
||||||
|
public TelegramBotWebHostBuilder(WebApplicationBuilder webApplicationBuilder, TelegratorOptions? options, WebApplicationOptions? settings)
|
||||||
|
{
|
||||||
|
_innerBuilder = webApplicationBuilder ?? throw new ArgumentNullException(nameof(webApplicationBuilder));
|
||||||
|
_settings = settings ?? throw new ArgumentNullException(nameof(settings));
|
||||||
|
|
||||||
|
this.AddTelegratorWeb(options, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -60,7 +77,22 @@ namespace Telegrator.Hosting.Web
|
|||||||
_innerBuilder = webApplicationBuilder ?? throw new ArgumentNullException(nameof(webApplicationBuilder));
|
_innerBuilder = webApplicationBuilder ?? throw new ArgumentNullException(nameof(webApplicationBuilder));
|
||||||
_settings = settings ?? throw new ArgumentNullException(nameof(settings));
|
_settings = settings ?? throw new ArgumentNullException(nameof(settings));
|
||||||
|
|
||||||
_innerBuilder.AddTelegratorWeb(settings, null, handlers);
|
this.AddTelegratorWeb(null, handlers);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="TelegramBotWebHostBuilder"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="webApplicationBuilder"></param>
|
||||||
|
/// <param name="handlers"></param>
|
||||||
|
/// <param name="options"></param>
|
||||||
|
/// <param name="settings"></param>
|
||||||
|
public TelegramBotWebHostBuilder(WebApplicationBuilder webApplicationBuilder, IHandlersCollection handlers, TelegratorOptions? options, WebApplicationOptions settings)
|
||||||
|
{
|
||||||
|
_innerBuilder = webApplicationBuilder ?? throw new ArgumentNullException(nameof(webApplicationBuilder));
|
||||||
|
_settings = settings ?? throw new ArgumentNullException(nameof(settings));
|
||||||
|
|
||||||
|
this.AddTelegratorWeb(options, handlers);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -73,5 +105,10 @@ namespace Telegrator.Hosting.Web
|
|||||||
host.UseTelegrator();
|
host.UseTelegrator();
|
||||||
return host;
|
return host;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public void ConfigureContainer<TContainerBuilder>(IServiceProviderFactory<TContainerBuilder> factory, Action<TContainerBuilder>? configure = null) where TContainerBuilder : notnull
|
||||||
|
{
|
||||||
|
((IHostApplicationBuilder)_innerBuilder).ConfigureContainer(factory, configure);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
using System.Diagnostics.CodeAnalysis;
|
using System.Diagnostics.CodeAnalysis;
|
||||||
|
|
||||||
namespace Telegrator.Hosting.Web
|
namespace Telegrator.Hosting.Web;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Configuration options for Telegram bot behavior and execution settings.
|
/// Configuration options for Telegram bot behavior and execution settings.
|
||||||
/// Controls various aspects of bot operation including concurrency, routing, webhook receiving, and execution policies.
|
/// Controls various aspects of bot operation including concurrency, routing, webhook receiving, and execution policies.
|
||||||
@@ -32,4 +32,3 @@ namespace Telegrator.Hosting.Web
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public bool DropPendingUpdates { get; set; } = false;
|
public bool DropPendingUpdates { get; set; } = false;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ using Telegram.Bot.Types;
|
|||||||
using Telegrator.Core;
|
using Telegrator.Core;
|
||||||
using Telegrator.Hosting.Web;
|
using Telegrator.Hosting.Web;
|
||||||
|
|
||||||
namespace Telegrator.Mediation
|
namespace Telegrator.Mediation;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Service for receiving updates for Hosted telegram bots via Webhooks
|
/// Service for receiving updates for Hosted telegram bots via Webhooks
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -94,4 +94,3 @@ namespace Telegrator.Mediation
|
|||||||
return Results.Ok();
|
return Results.Ok();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -0,0 +1,82 @@
|
|||||||
|
using Microsoft.AspNetCore.Builder;
|
||||||
|
using Microsoft.Extensions.Configuration;
|
||||||
|
using Microsoft.Extensions.Hosting;
|
||||||
|
using Telegrator.Hosting;
|
||||||
|
using Telegrator.Hosting.Web;
|
||||||
|
|
||||||
|
namespace Telegrator;
|
||||||
|
|
||||||
|
internal class Program
|
||||||
|
{
|
||||||
|
public static void TelegramBotWebHostBuilder_Example(string[] args)
|
||||||
|
{
|
||||||
|
TelegramBotWebHostBuilder builder = TelegramBotWebHost.CreateBuilder(new WebApplicationOptions()
|
||||||
|
{
|
||||||
|
Args = args,
|
||||||
|
ApplicationName = "TelegramBotWebHost example",
|
||||||
|
});
|
||||||
|
|
||||||
|
builder.Handlers.CollectHandlersAssemblyWide();
|
||||||
|
|
||||||
|
builder.Build()
|
||||||
|
.AddLoggingAdapter()
|
||||||
|
.SetBotCommands()
|
||||||
|
.Run();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void WebApplicationBuilder_Example(string[] args)
|
||||||
|
{
|
||||||
|
WebApplicationBuilder builder = WebApplication.CreateBuilder(new WebApplicationOptions()
|
||||||
|
{
|
||||||
|
Args = args,
|
||||||
|
ApplicationName = "WebApplication example",
|
||||||
|
});
|
||||||
|
|
||||||
|
builder.AddTelegratorWeb();
|
||||||
|
builder.Handlers.CollectHandlersAssemblyWide();
|
||||||
|
|
||||||
|
builder.Build()
|
||||||
|
.UseTelegratorWeb()
|
||||||
|
.AddLoggingAdapter()
|
||||||
|
.SetBotCommands()
|
||||||
|
.Run();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void TelegramBotHostBuilder_Example(string[] args)
|
||||||
|
{
|
||||||
|
ConfigurationManager configuration = new ConfigurationManager();
|
||||||
|
configuration.AddJsonFile("appsettings.json");
|
||||||
|
|
||||||
|
TelegramBotHostBuilder builder = TelegramBotHost.CreateBuilder(new HostApplicationBuilderSettings()
|
||||||
|
{
|
||||||
|
Args = args,
|
||||||
|
ApplicationName = "TelegramBotHost example",
|
||||||
|
Configuration = configuration
|
||||||
|
});
|
||||||
|
|
||||||
|
builder.Handlers.CollectHandlersAssemblyWide();
|
||||||
|
|
||||||
|
builder.Build()
|
||||||
|
.AddLoggingAdapter()
|
||||||
|
.SetBotCommands()
|
||||||
|
.Run();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void HostApplicationBuilder_Example(string[] args)
|
||||||
|
{
|
||||||
|
HostApplicationBuilder builder = Host.CreateApplicationBuilder(new HostApplicationBuilderSettings()
|
||||||
|
{
|
||||||
|
Args = args,
|
||||||
|
ApplicationName = "Host example",
|
||||||
|
});
|
||||||
|
|
||||||
|
builder.AddTelegrator();
|
||||||
|
builder.Handlers.CollectHandlersAssemblyWide();
|
||||||
|
|
||||||
|
builder.Build()
|
||||||
|
.UseTelegrator()
|
||||||
|
.AddLoggingAdapter()
|
||||||
|
.SetBotCommands()
|
||||||
|
.Run();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -16,8 +16,9 @@
|
|||||||
---
|
---
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
- .NET 8.0 or later
|
- .NET 10.0 or later
|
||||||
- ASP.NET Core
|
- ASP.NET Core
|
||||||
|
- [Telegrator.Hosting](https://github.com/Rikitav/Telegrator)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -37,10 +38,10 @@ using Telegrator.Hosting;
|
|||||||
using Telegrator.Hosting.Web;
|
using Telegrator.Hosting.Web;
|
||||||
|
|
||||||
// Creating builder
|
// Creating builder
|
||||||
TelegramBotWebHostBuilder builder = TelegramBotWebHost.CreateBuilder(new TelegramBotWebOptions()
|
TelegramBotWebHostBuilder builder = TelegramBotWebHost.CreateBuilder(new WebApplicationOptions()
|
||||||
{
|
{
|
||||||
Args = args,
|
Args = args,
|
||||||
ExceptIntersectingCommandAliases = true
|
ApplicationName = "TelegramBotWebHost example",
|
||||||
});
|
});
|
||||||
|
|
||||||
// Register handlers
|
// Register handlers
|
||||||
@@ -57,27 +58,59 @@ telegramBot.Run();
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Application integration Example
|
||||||
|
|
||||||
|
**Program.cs (ASP.NET Core):**
|
||||||
|
```csharp
|
||||||
|
using Telegrator.Hosting;
|
||||||
|
using Telegrator.Hosting.Web;
|
||||||
|
|
||||||
|
// Creating builder
|
||||||
|
WebApplicationBuilder builder = WebApplication.CreateBuilder(new WebApplicationOptions()
|
||||||
|
{
|
||||||
|
Args = args,
|
||||||
|
ApplicationName = "WebApplication example",
|
||||||
|
});
|
||||||
|
|
||||||
|
// Adding Telegrator
|
||||||
|
builder.AddTelegratorWeb();
|
||||||
|
|
||||||
|
// Register handlers
|
||||||
|
builder.Handlers.CollectHandlersAssemblyWide();
|
||||||
|
|
||||||
|
// Register your services
|
||||||
|
builder.Services.AddSingleton<IMyService, MyService>();
|
||||||
|
|
||||||
|
// Building and running application
|
||||||
|
builder.Build()
|
||||||
|
.UseTelegratorWeb()
|
||||||
|
.SetBotCommands();
|
||||||
|
.Run();
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Configuration (appsettings.json)
|
## Configuration (appsettings.json)
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"TelegramBotClientOptions": {
|
"TelegratorOptions": {
|
||||||
"Token": "YOUR_BOT_TOKEN"
|
"Token": "YOUR_BOT_TOKEN",
|
||||||
|
"ExceptIntersectingCommandAliases": true
|
||||||
}
|
}
|
||||||
|
|
||||||
"TelegratorWebOptions": {
|
"WebhookerOptioons": {
|
||||||
"WebhookUri" = "https://you-public-host.ru/bot",
|
"WebhookUri" = "https://you-public-host.ru/bot",
|
||||||
|
"SecretToken": "MEDIC_GAMING"
|
||||||
"DropPendingUpdates": true
|
"DropPendingUpdates": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
- `TelegramBotClientOptions`: Bot token and client settings
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
- [Telegrator Main Docs](https://github.com/Rikitav/Telegrator)
|
- [Telegrator Main Repository](https://github.com/Rikitav/Telegrator)
|
||||||
- [Getting Started Guide](https://github.com/Rikitav/Telegrator/wiki/Getting-started)
|
- [Getting Started Guide](https://github.com/Rikitav/Telegrator/wiki/Getting-started)
|
||||||
- [Annotation Overview](https://github.com/Rikitav/Telegrator/wiki/Annotation-overview)
|
- [Annotation Overview](https://github.com/Rikitav/Telegrator/wiki/Annotation-overview)
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
<EnforceCodeStyleInBuild>True</EnforceCodeStyleInBuild>
|
<EnforceCodeStyleInBuild>True</EnforceCodeStyleInBuild>
|
||||||
|
|
||||||
<Title>Telegrator.Hosting.Web</Title>
|
<Title>Telegrator.Hosting.Web</Title>
|
||||||
<Version>1.16.0</Version>
|
<Version>1.16.5</Version>
|
||||||
<Authors>Rikitav Tim4ik</Authors>
|
<Authors>Rikitav Tim4ik</Authors>
|
||||||
<Company>Rikitav Tim4ik</Company>
|
<Company>Rikitav Tim4ik</Company>
|
||||||
<RepositoryUrl>https://github.com/Rikitav/Telegrator</RepositoryUrl>
|
<RepositoryUrl>https://github.com/Rikitav/Telegrator</RepositoryUrl>
|
||||||
@@ -26,21 +26,18 @@
|
|||||||
<PackageLicenseFile>LICENSE</PackageLicenseFile>
|
<PackageLicenseFile>LICENSE</PackageLicenseFile>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<None Include="..\..\LICENSE" Pack="True" PackagePath="\" />
|
|
||||||
<None Include="..\..\README.md" Pack="True" PackagePath="\" />
|
|
||||||
<None Include="..\..\resources\telegrator_nuget.png" Pack="True" PackagePath="\" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\Telegrator.Hosting\Telegrator.Hosting.csproj" />
|
<ProjectReference Include="..\Telegrator.Hosting\Telegrator.Hosting.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<FrameworkReference Include="Microsoft.AspNetCore.App" />
|
<FrameworkReference Include="Microsoft.AspNetCore.App" />
|
||||||
|
<PackageReference Include="Telegram.Bot.AspNetCore" Version="22.5.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Telegram.Bot.AspNetCore" Version="22.5.0" />
|
<None Include=".\README.md" Pack="True" PackagePath="\" />
|
||||||
|
<None Include="..\..\LICENSE" Pack="True" PackagePath="\" />
|
||||||
|
<None Include="..\..\resources\telegrator_nuget.png" Pack="True" PackagePath="\" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ using Microsoft.Extensions.Logging;
|
|||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using Telegram.Bot;
|
using Telegram.Bot;
|
||||||
using Telegrator.Core;
|
using Telegrator.Core;
|
||||||
|
using Telegrator.Hosting;
|
||||||
using Telegrator.Hosting.Web;
|
using Telegrator.Hosting.Web;
|
||||||
using Telegrator.Mediation;
|
using Telegrator.Mediation;
|
||||||
using Telegrator.Providers;
|
using Telegrator.Providers;
|
||||||
@@ -41,11 +42,8 @@ namespace Telegrator
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Replaces TelegramBotWebHostBuilder. Configures DI, options, and handlers.
|
/// Replaces TelegramBotWebHostBuilder. Configures DI, options, and handlers.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static IHostApplicationBuilder AddTelegratorWeb(this IHostApplicationBuilder builder, WebApplicationOptions settings, TelegratorOptions? options = null, IHandlersCollection? handlers = null)
|
public static IHostApplicationBuilder AddTelegratorWeb(this IHostApplicationBuilder builder, TelegratorOptions? options = null, IHandlersCollection? handlers = null)
|
||||||
{
|
{
|
||||||
if (settings is null)
|
|
||||||
throw new ArgumentNullException(nameof(settings));
|
|
||||||
|
|
||||||
IServiceCollection services = builder.Services;
|
IServiceCollection services = builder.Services;
|
||||||
IConfigurationManager configuration = builder.Configuration;
|
IConfigurationManager configuration = builder.Configuration;
|
||||||
|
|
||||||
|
|||||||
@@ -9,3 +9,4 @@ using System.Diagnostics.CodeAnalysis;
|
|||||||
[assembly: SuppressMessage("Style", "IDE0090")]
|
[assembly: SuppressMessage("Style", "IDE0090")]
|
||||||
[assembly: SuppressMessage("Usage", "CA2254")]
|
[assembly: SuppressMessage("Usage", "CA2254")]
|
||||||
[assembly: SuppressMessage("Maintainability", "CA1510")]
|
[assembly: SuppressMessage("Maintainability", "CA1510")]
|
||||||
|
[assembly: SuppressMessage("Style", "IDE0270")]
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ using Telegram.Bot;
|
|||||||
using Telegram.Bot.Types;
|
using Telegram.Bot.Types;
|
||||||
using Telegrator.Core;
|
using Telegrator.Core;
|
||||||
|
|
||||||
namespace Telegrator.Hosting
|
namespace Telegrator.Hosting;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Implementation of <see cref="ITelegramBotInfo"/> that provides bot information.
|
/// Implementation of <see cref="ITelegramBotInfo"/> that provides bot information.
|
||||||
/// Contains metadata about the Telegram bot including user details and service provider for wider filterring abilities
|
/// Contains metadata about the Telegram bot including user details and service provider for wider filterring abilities
|
||||||
@@ -12,7 +12,7 @@ namespace Telegrator.Hosting
|
|||||||
/// <param name="client"></param>
|
/// <param name="client"></param>
|
||||||
/// <param name="services"></param>
|
/// <param name="services"></param>
|
||||||
/// <param name="configuration"></param>
|
/// <param name="configuration"></param>
|
||||||
public class HostedTelegramBotInfo(ITelegramBotClient client, IServiceProvider services, IConfigurationManager configuration) : ITelegramBotInfo
|
public class HostedTelegramBotInfo(ITelegramBotClient client, IServiceProvider services, IConfiguration configuration) : ITelegramBotInfo
|
||||||
{
|
{
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public User User { get; } = client.GetMe().Result;
|
public User User { get; } = client.GetMe().Result;
|
||||||
@@ -25,6 +25,5 @@ namespace Telegrator.Hosting
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Provides access to configuration of this Hosted telegram bot
|
/// Provides access to configuration of this Hosted telegram bot
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public IConfigurationManager Configuration { get; } = configuration;
|
public IConfiguration Configuration { get; } = configuration;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
using Microsoft.Extensions.Configuration;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using Telegrator.Core;
|
|
||||||
|
|
||||||
namespace Telegrator.Hosting
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Interface for building Telegram bot hosts with dependency injection support.
|
|
||||||
/// Combines host application building capabilities with handler collection functionality.
|
|
||||||
/// </summary>
|
|
||||||
public interface ITelegramBotHostBuilder : ICollectingProvider
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the set of key/value configuration properties.
|
|
||||||
/// </summary>
|
|
||||||
IConfigurationManager Configuration { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets a collection of logging providers for the application to compose. This is useful for adding new logging providers.
|
|
||||||
/// </summary>
|
|
||||||
ILoggingBuilder Logging { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets a collection of services for the application to compose. This is useful for adding user provided or framework provided services.
|
|
||||||
/// </summary>
|
|
||||||
IServiceCollection Services { get; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,25 +1,23 @@
|
|||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.DependencyInjection.Extensions;
|
|
||||||
using Microsoft.Extensions.Hosting;
|
using Microsoft.Extensions.Hosting;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Telegrator.Core;
|
using Telegrator.Core;
|
||||||
|
|
||||||
namespace Telegrator.Hosting
|
namespace Telegrator.Hosting;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents a hosted telegram bot
|
/// Represents a hosted telegram bot
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class TelegramBotHost : IHost, ITelegratorBot
|
public class TelegramBotHost : IHost, ITelegratorBot
|
||||||
{
|
{
|
||||||
private readonly IHost _innerHost;
|
private readonly IHost _innerHost;
|
||||||
private readonly IServiceProvider _serviceProvider;
|
|
||||||
private readonly IUpdateRouter _updateRouter;
|
private readonly IUpdateRouter _updateRouter;
|
||||||
private readonly ILogger<TelegramBotHost> _logger;
|
private readonly ILogger<TelegramBotHost> _logger;
|
||||||
|
|
||||||
private bool _disposed;
|
private bool _disposed;
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public IServiceProvider Services => _serviceProvider;
|
public IServiceProvider Services => _innerHost.Services;
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public IUpdateRouter UpdateRouter => _updateRouter;
|
public IUpdateRouter UpdateRouter => _updateRouter;
|
||||||
@@ -40,8 +38,6 @@ namespace Telegrator.Hosting
|
|||||||
|
|
||||||
// Building proxy hoster
|
// Building proxy hoster
|
||||||
_innerHost = hostApplicationBuilder.Build();
|
_innerHost = hostApplicationBuilder.Build();
|
||||||
_serviceProvider = _innerHost.Services;
|
|
||||||
_innerHost.UseTelegrator();
|
|
||||||
|
|
||||||
// Reruesting services for this host
|
// Reruesting services for this host
|
||||||
_updateRouter = Services.GetRequiredService<IUpdateRouter>();
|
_updateRouter = Services.GetRequiredService<IUpdateRouter>();
|
||||||
@@ -56,9 +52,6 @@ namespace Telegrator.Hosting
|
|||||||
{
|
{
|
||||||
HostApplicationBuilder innerBuilder = new HostApplicationBuilder(settings: null);
|
HostApplicationBuilder innerBuilder = new HostApplicationBuilder(settings: null);
|
||||||
TelegramBotHostBuilder builder = new TelegramBotHostBuilder(innerBuilder, null);
|
TelegramBotHostBuilder builder = new TelegramBotHostBuilder(innerBuilder, null);
|
||||||
|
|
||||||
builder.Services.AddTelegramBotHostDefaults();
|
|
||||||
builder.Services.AddTelegramReceiver();
|
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,9 +63,6 @@ namespace Telegrator.Hosting
|
|||||||
{
|
{
|
||||||
HostApplicationBuilder innerBuilder = new HostApplicationBuilder(settings);
|
HostApplicationBuilder innerBuilder = new HostApplicationBuilder(settings);
|
||||||
TelegramBotHostBuilder builder = new TelegramBotHostBuilder(innerBuilder, settings);
|
TelegramBotHostBuilder builder = new TelegramBotHostBuilder(innerBuilder, settings);
|
||||||
|
|
||||||
builder.Services.AddTelegramBotHostDefaults();
|
|
||||||
builder.Services.AddTelegramReceiver();
|
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,4 +112,3 @@ namespace Telegrator.Hosting
|
|||||||
_disposed = true;
|
_disposed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using Microsoft.Extensions.Diagnostics.Metrics;
|
||||||
using Microsoft.Extensions.Hosting;
|
using Microsoft.Extensions.Hosting;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Telegrator.Core;
|
using Telegrator.Core;
|
||||||
using Telegrator.Providers;
|
|
||||||
|
|
||||||
#pragma warning disable IDE0001
|
#pragma warning disable IDE0001
|
||||||
namespace Telegrator.Hosting
|
namespace Telegrator.Hosting;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents a hosted telegram bots and services builder that helps manage configuration, logging, lifetime, and more.
|
/// Represents a hosted telegram bots and services builder that helps manage configuration, logging, lifetime, and more.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class TelegramBotHostBuilder : ICollectingProvider
|
public class TelegramBotHostBuilder : IHostApplicationBuilder, ICollectingProvider
|
||||||
{
|
{
|
||||||
private readonly HostApplicationBuilder _innerBuilder;
|
private readonly HostApplicationBuilder _innerBuilder;
|
||||||
private readonly HostApplicationBuilderSettings _settings;
|
private readonly HostApplicationBuilderSettings _settings;
|
||||||
@@ -32,6 +32,12 @@ namespace Telegrator.Hosting
|
|||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public IHostEnvironment Environment => _innerBuilder.Environment;
|
public IHostEnvironment Environment => _innerBuilder.Environment;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public IDictionary<object, object> Properties => ((IHostApplicationBuilder)_innerBuilder).Properties;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public IMetricsBuilder Metrics => _innerBuilder.Metrics;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="TelegramBotHostBuilder"/> class.
|
/// Initializes a new instance of the <see cref="TelegramBotHostBuilder"/> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -42,8 +48,21 @@ namespace Telegrator.Hosting
|
|||||||
_innerBuilder = hostApplicationBuilder ?? throw new ArgumentNullException(nameof(hostApplicationBuilder));
|
_innerBuilder = hostApplicationBuilder ?? throw new ArgumentNullException(nameof(hostApplicationBuilder));
|
||||||
_settings = settings ?? new HostApplicationBuilderSettings();
|
_settings = settings ?? new HostApplicationBuilderSettings();
|
||||||
|
|
||||||
_innerBuilder.AddTelegrator(_settings);
|
this.AddTelegrator();
|
||||||
_innerBuilder.Logging.ClearProviders();
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="TelegramBotHostBuilder"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="hostApplicationBuilder"></param>
|
||||||
|
/// <param name="options"></param>
|
||||||
|
/// <param name="settings"></param>
|
||||||
|
public TelegramBotHostBuilder(HostApplicationBuilder hostApplicationBuilder, TelegratorOptions? options, HostApplicationBuilderSettings? settings)
|
||||||
|
{
|
||||||
|
_innerBuilder = hostApplicationBuilder ?? throw new ArgumentNullException(nameof(hostApplicationBuilder));
|
||||||
|
_settings = settings ?? new HostApplicationBuilderSettings();
|
||||||
|
|
||||||
|
this.AddTelegrator(options, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -52,13 +71,27 @@ namespace Telegrator.Hosting
|
|||||||
/// <param name="hostApplicationBuilder"></param>
|
/// <param name="hostApplicationBuilder"></param>
|
||||||
/// <param name="handlers"></param>
|
/// <param name="handlers"></param>
|
||||||
/// <param name="settings"></param>
|
/// <param name="settings"></param>
|
||||||
public TelegramBotHostBuilder(HostApplicationBuilder hostApplicationBuilder, IHandlersCollection handlers, HostApplicationBuilderSettings? settings = null)
|
public TelegramBotHostBuilder(HostApplicationBuilder hostApplicationBuilder, IHandlersCollection handlers, HostApplicationBuilderSettings? settings)
|
||||||
{
|
{
|
||||||
_innerBuilder = hostApplicationBuilder ?? throw new ArgumentNullException(nameof(hostApplicationBuilder));
|
_innerBuilder = hostApplicationBuilder ?? throw new ArgumentNullException(nameof(hostApplicationBuilder));
|
||||||
_settings = settings ?? new HostApplicationBuilderSettings();
|
_settings = settings ?? new HostApplicationBuilderSettings();
|
||||||
|
|
||||||
_innerBuilder.AddTelegrator(_settings, null, handlers);
|
this.AddTelegrator(null, handlers);
|
||||||
_innerBuilder.Logging.ClearProviders();
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="TelegramBotHostBuilder"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="hostApplicationBuilder"></param>
|
||||||
|
/// <param name="handlers"></param>
|
||||||
|
/// <param name="options"></param>
|
||||||
|
/// <param name="settings"></param>
|
||||||
|
public TelegramBotHostBuilder(HostApplicationBuilder hostApplicationBuilder, IHandlersCollection handlers, TelegratorOptions? options, HostApplicationBuilderSettings? settings)
|
||||||
|
{
|
||||||
|
_innerBuilder = hostApplicationBuilder ?? throw new ArgumentNullException(nameof(hostApplicationBuilder));
|
||||||
|
_settings = settings ?? new HostApplicationBuilderSettings();
|
||||||
|
|
||||||
|
this.AddTelegrator(options, handlers);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -71,5 +104,10 @@ namespace Telegrator.Hosting
|
|||||||
host.UseTelegrator();
|
host.UseTelegrator();
|
||||||
return host;
|
return host;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public void ConfigureContainer<TContainerBuilder>(IServiceProviderFactory<TContainerBuilder> factory, Action<TContainerBuilder>? configure = null) where TContainerBuilder : notnull
|
||||||
|
{
|
||||||
|
this.ConfigureContainer(factory, configure);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +1,18 @@
|
|||||||
using Microsoft.Extensions.Logging;
|
namespace Telegrator.Logging;
|
||||||
|
|
||||||
namespace Telegrator.Logging
|
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Adapter for Microsoft.Extensions.Logging to work with Telegrator logging system.
|
/// Adapter for Microsoft.Extensions.Logging to work with Telegrator logging system.
|
||||||
/// This allows seamless integration with ASP.NET Core logging infrastructure.
|
/// This allows seamless integration with ASP.NET Core logging infrastructure.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class MicrosoftLoggingAdapter : ITelegratorLogger
|
public class MicrosoftLoggingAdapter : ITelegratorLogger
|
||||||
{
|
{
|
||||||
private readonly ILogger _logger;
|
private readonly Microsoft.Extensions.Logging.ILogger _logger;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of MicrosoftLoggingAdapter.
|
/// Initializes a new instance of MicrosoftLoggingAdapter.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="logger">The Microsoft.Extensions.Logging logger instance.</param>
|
/// <param name="logger">The Microsoft.Extensions.Logging logger instance.</param>
|
||||||
public MicrosoftLoggingAdapter(ILogger logger)
|
public MicrosoftLoggingAdapter(Microsoft.Extensions.Logging.ILogger logger)
|
||||||
{
|
{
|
||||||
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
|
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
|
||||||
}
|
}
|
||||||
@@ -24,11 +22,11 @@ namespace Telegrator.Logging
|
|||||||
{
|
{
|
||||||
var msLogLevel = level switch
|
var msLogLevel = level switch
|
||||||
{
|
{
|
||||||
Telegrator.Logging.LogLevel.Trace => Microsoft.Extensions.Logging.LogLevel.Trace,
|
LogLevel.Trace => Microsoft.Extensions.Logging.LogLevel.Trace,
|
||||||
Telegrator.Logging.LogLevel.Debug => Microsoft.Extensions.Logging.LogLevel.Debug,
|
LogLevel.Debug => Microsoft.Extensions.Logging.LogLevel.Debug,
|
||||||
Telegrator.Logging.LogLevel.Information => Microsoft.Extensions.Logging.LogLevel.Information,
|
LogLevel.Information => Microsoft.Extensions.Logging.LogLevel.Information,
|
||||||
Telegrator.Logging.LogLevel.Warning => Microsoft.Extensions.Logging.LogLevel.Warning,
|
LogLevel.Warning => Microsoft.Extensions.Logging.LogLevel.Warning,
|
||||||
Telegrator.Logging.LogLevel.Error => Microsoft.Extensions.Logging.LogLevel.Error,
|
LogLevel.Error => Microsoft.Extensions.Logging.LogLevel.Error,
|
||||||
_ => Microsoft.Extensions.Logging.LogLevel.Information
|
_ => Microsoft.Extensions.Logging.LogLevel.Information
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -42,4 +40,3 @@ namespace Telegrator.Logging
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
using Microsoft.Extensions.Options;
|
|
||||||
using Telegrator.Core;
|
|
||||||
using Telegrator.Mediation;
|
|
||||||
|
|
||||||
namespace Telegrator.Polling
|
|
||||||
{
|
|
||||||
/// <inheritdoc/>
|
|
||||||
public class HostUpdateHandlersPool(IUpdateRouter router, IOptions<TelegratorOptions> options)
|
|
||||||
: UpdateHandlersPool(router, options.Value, options.Value.GlobalCancellationToken)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -4,10 +4,11 @@ using Telegram.Bot;
|
|||||||
using Telegram.Bot.Polling;
|
using Telegram.Bot.Polling;
|
||||||
using Telegram.Bot.Types;
|
using Telegram.Bot.Types;
|
||||||
using Telegrator.Core;
|
using Telegrator.Core;
|
||||||
|
using Telegrator.Core.States;
|
||||||
using Telegrator.Mediation;
|
using Telegrator.Mediation;
|
||||||
|
|
||||||
namespace Telegrator.Polling
|
namespace Telegrator.Polling;
|
||||||
{
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public class HostUpdateRouter : UpdateRouter
|
public class HostUpdateRouter : UpdateRouter
|
||||||
{
|
{
|
||||||
@@ -20,10 +21,10 @@ namespace Telegrator.Polling
|
|||||||
public HostUpdateRouter(
|
public HostUpdateRouter(
|
||||||
IHandlersProvider handlersProvider,
|
IHandlersProvider handlersProvider,
|
||||||
IAwaitingProvider awaitingProvider,
|
IAwaitingProvider awaitingProvider,
|
||||||
|
IStateStorage stateStorage,
|
||||||
IOptions<TelegratorOptions> options,
|
IOptions<TelegratorOptions> options,
|
||||||
IUpdateHandlersPool handlersPool,
|
|
||||||
ITelegramBotInfo botInfo,
|
ITelegramBotInfo botInfo,
|
||||||
ILogger<HostUpdateRouter> logger) : base(handlersProvider, awaitingProvider, options.Value, handlersPool, botInfo)
|
ILogger<HostUpdateRouter> logger) : base(handlersProvider, awaitingProvider, stateStorage, options.Value, botInfo)
|
||||||
{
|
{
|
||||||
Logger = logger;
|
Logger = logger;
|
||||||
ExceptionHandler = new DefaultRouterExceptionHandler(HandleException);
|
ExceptionHandler = new DefaultRouterExceptionHandler(HandleException);
|
||||||
@@ -56,4 +57,3 @@ namespace Telegrator.Polling
|
|||||||
Logger.LogError("Exception was thrown during update routing faulted :\n{exception}", exception.ToString());
|
Logger.LogError("Exception was thrown during update routing faulted :\n{exception}", exception.ToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ using Telegram.Bot.Polling;
|
|||||||
using Telegrator.Core;
|
using Telegrator.Core;
|
||||||
using Telegrator.Mediation;
|
using Telegrator.Mediation;
|
||||||
|
|
||||||
namespace Telegrator.Polling
|
namespace Telegrator.Polling;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Service for receiving updates for Hosted telegram bots
|
/// Service for receiving updates for Hosted telegram bots
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -29,4 +29,3 @@ namespace Telegrator.Polling
|
|||||||
await updateReceiver.ReceiveAsync(_updateRouter, stoppingToken).ConfigureAwait(false);
|
await updateReceiver.ReceiveAsync(_updateRouter, stoppingToken).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,11 +1,9 @@
|
|||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Options;
|
||||||
using Microsoft.Extensions.Options;
|
|
||||||
|
namespace Telegrator.Providers;
|
||||||
|
|
||||||
namespace Telegrator.Providers
|
|
||||||
{
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public class HostAwaitingProvider(IOptions<TelegratorOptions> options, ILogger<HostAwaitingProvider> logger) : AwaitingProvider(options.Value)
|
public class HostAwaitingProvider(IOptions<TelegratorOptions> options) : AwaitingProvider(options.Value)
|
||||||
{
|
{
|
||||||
private readonly ILogger<HostAwaitingProvider> _logger = logger;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
using Telegrator.Core;
|
using Telegrator.Core;
|
||||||
using Telegrator.Core.Descriptors;
|
using Telegrator.Core.Descriptors;
|
||||||
|
|
||||||
namespace Telegrator.Providers
|
namespace Telegrator.Providers;
|
||||||
{
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public class HostHandlersCollection(IServiceCollection hostServiceColletion, TelegratorOptions options) : HandlersCollection(options)
|
public class HostHandlersCollection(IServiceCollection hostServiceColletion, TelegratorOptions options) : HandlersCollection(options)
|
||||||
{
|
{
|
||||||
@@ -59,4 +59,3 @@ namespace Telegrator.Providers
|
|||||||
return base.AddDescriptor(descriptor);
|
return base.AddDescriptor(descriptor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,27 +1,23 @@
|
|||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using Telegrator.Core;
|
using Telegrator.Core;
|
||||||
using Telegrator.Core.Descriptors;
|
using Telegrator.Core.Descriptors;
|
||||||
using Telegrator.Core.Handlers;
|
using Telegrator.Core.Handlers;
|
||||||
|
|
||||||
namespace Telegrator.Providers
|
namespace Telegrator.Providers;
|
||||||
{
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public class HostHandlersProvider : HandlersProvider
|
public class HostHandlersProvider : HandlersProvider
|
||||||
{
|
{
|
||||||
private readonly IServiceProvider Services;
|
private readonly IServiceProvider Services;
|
||||||
private readonly ILogger<HostHandlersProvider> Logger;
|
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public HostHandlersProvider(
|
public HostHandlersProvider(
|
||||||
IHandlersCollection handlers,
|
IHandlersCollection handlers,
|
||||||
IOptions<TelegratorOptions> options,
|
IOptions<TelegratorOptions> options,
|
||||||
IServiceProvider serviceProvider,
|
IServiceProvider serviceProvider) : base(handlers, options.Value)
|
||||||
ILogger<HostHandlersProvider> logger) : base(handlers, options.Value)
|
|
||||||
{
|
{
|
||||||
Services = serviceProvider;
|
Services = serviceProvider;
|
||||||
Logger = logger;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
@@ -42,4 +38,3 @@ namespace Telegrator.Providers
|
|||||||
return updateHandler;
|
return updateHandler;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
---
|
---
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
- .NET 8.0 or later
|
- .NET 10.0 or later
|
||||||
- [Telegrator](https://github.com/Rikitav/Telegrator)
|
- [Telegrator](https://github.com/Rikitav/Telegrator)
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -35,10 +35,10 @@ dotnet add package Telegrator.Hosting
|
|||||||
using Telegrator.Hosting;
|
using Telegrator.Hosting;
|
||||||
|
|
||||||
// Creating builder
|
// Creating builder
|
||||||
TelegramBotHostBuilder builder = TelegramBotHost.CreateBuilder(new TelegramBotHostBuilderSettings()
|
TelegramBotHostBuilder builder = TelegramBotHost.CreateBuilder(new HostApplicationBuilderSettings()
|
||||||
{
|
{
|
||||||
Args = args,
|
Args = args,
|
||||||
ExceptIntersectingCommandAliases = true
|
ApplicationName = "TelegramBotHost example",
|
||||||
});
|
});
|
||||||
|
|
||||||
// Registerring handlers
|
// Registerring handlers
|
||||||
@@ -55,12 +55,42 @@ telegramBot.Run();
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Application integration Example
|
||||||
|
|
||||||
|
**Program.cs:**
|
||||||
|
```csharp
|
||||||
|
using Telegrator.Hosting;
|
||||||
|
|
||||||
|
// Creating builder
|
||||||
|
HostApplicationBuilder builder = Host.CreateApplicationBuilder(new HostApplicationBuilderSettings()
|
||||||
|
{
|
||||||
|
Args = args,
|
||||||
|
ApplicationName = "Host example",
|
||||||
|
});
|
||||||
|
|
||||||
|
// Adding Telegrator
|
||||||
|
builder.AddTelegrator();
|
||||||
|
|
||||||
|
// Registerring handlers (extension)
|
||||||
|
builder.Handlers.CollectHandlersAssemblyWide();
|
||||||
|
|
||||||
|
// Building and running application
|
||||||
|
builder.Build()
|
||||||
|
.UseTelegrator()
|
||||||
|
.SetBotCommands()
|
||||||
|
.Run();
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Configuration (appsettings.json)
|
## Configuration (appsettings.json)
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"TelegramBotClientOptions": {
|
"TelegratorOptions": {
|
||||||
"Token": "YOUR_BOT_TOKEN"
|
"Token": "YOUR_BOT_TOKEN",
|
||||||
|
"ExceptIntersectingCommandAliases": true
|
||||||
},
|
},
|
||||||
|
|
||||||
"HostOptions": {
|
"HostOptions": {
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
<EnforceCodeStyleInBuild>True</EnforceCodeStyleInBuild>
|
<EnforceCodeStyleInBuild>True</EnforceCodeStyleInBuild>
|
||||||
|
|
||||||
<Title>Telegrator.Hosting</Title>
|
<Title>Telegrator.Hosting</Title>
|
||||||
<Version>1.16.0</Version>
|
<Version>1.16.5</Version>
|
||||||
<Authors>Rikitav Tim4ik</Authors>
|
<Authors>Rikitav Tim4ik</Authors>
|
||||||
<Company>Rikitav Tim4ik</Company>
|
<Company>Rikitav Tim4ik</Company>
|
||||||
<RepositoryUrl>https://github.com/Rikitav/Telegrator</RepositoryUrl>
|
<RepositoryUrl>https://github.com/Rikitav/Telegrator</RepositoryUrl>
|
||||||
@@ -26,19 +26,19 @@
|
|||||||
<PackageLicenseFile>LICENSE</PackageLicenseFile>
|
<PackageLicenseFile>LICENSE</PackageLicenseFile>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\Telegrator\Telegrator.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="10.0.3" />
|
<PackageReference Include="Microsoft.Extensions.Hosting" Version="10.0.3" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Http" Version="10.0.3" />
|
<PackageReference Include="Microsoft.Extensions.Http" Version="10.0.3" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<None Include=".\README.md" Pack="True" PackagePath="\" />
|
||||||
<None Include="..\..\LICENSE" Pack="True" PackagePath="\" />
|
<None Include="..\..\LICENSE" Pack="True" PackagePath="\" />
|
||||||
<None Include="..\..\README.md" Pack="True" PackagePath="\" />
|
|
||||||
<None Include="..\..\resources\telegrator_nuget.png" Pack="True" PackagePath="\" />
|
<None Include="..\..\resources\telegrator_nuget.png" Pack="True" PackagePath="\" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\Telegrator\Telegrator.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -11,10 +11,12 @@ using Telegram.Bot.Types;
|
|||||||
using Telegram.Bot.Types.Enums;
|
using Telegram.Bot.Types.Enums;
|
||||||
using Telegrator.Core;
|
using Telegrator.Core;
|
||||||
using Telegrator.Core.Descriptors;
|
using Telegrator.Core.Descriptors;
|
||||||
|
using Telegrator.Core.States;
|
||||||
using Telegrator.Hosting;
|
using Telegrator.Hosting;
|
||||||
using Telegrator.Logging;
|
using Telegrator.Logging;
|
||||||
using Telegrator.Polling;
|
using Telegrator.Polling;
|
||||||
using Telegrator.Providers;
|
using Telegrator.Providers;
|
||||||
|
using Telegrator.States;
|
||||||
|
|
||||||
namespace Telegrator;
|
namespace Telegrator;
|
||||||
|
|
||||||
@@ -48,11 +50,8 @@ public static class HostBuilderExtensions
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Replaces TelegramBotWebHostBuilder. Configures DI, options, and handlers.
|
/// Replaces TelegramBotWebHostBuilder. Configures DI, options, and handlers.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static IHostApplicationBuilder AddTelegrator(this IHostApplicationBuilder builder, HostApplicationBuilderSettings settings, TelegratorOptions? options = null, IHandlersCollection? handlers = null)
|
public static IHostApplicationBuilder AddTelegrator(this IHostApplicationBuilder builder, TelegratorOptions? options = null, IHandlersCollection? handlers = null)
|
||||||
{
|
{
|
||||||
if (settings is null)
|
|
||||||
throw new ArgumentNullException(nameof(settings));
|
|
||||||
|
|
||||||
IServiceCollection services = builder.Services;
|
IServiceCollection services = builder.Services;
|
||||||
IConfigurationManager configuration = builder.Configuration;
|
IConfigurationManager configuration = builder.Configuration;
|
||||||
|
|
||||||
@@ -115,6 +114,18 @@ public static class HostBuilderExtensions
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static class ServicesCollectionExtensions
|
public static class ServicesCollectionExtensions
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Registers <see cref="IStateStorage"/> service
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TStorage"></typeparam>
|
||||||
|
/// <param name="services"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static IServiceCollection AddStateStorage<TStorage>(this IServiceCollection services) where TStorage : IStateStorage
|
||||||
|
{
|
||||||
|
services.Replace(new ServiceDescriptor(typeof(IStateStorage), typeof(TStorage), ServiceLifetime.Singleton));
|
||||||
|
return services;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Registers <see cref="TelegramBotHost"/> default services
|
/// Registers <see cref="TelegramBotHost"/> default services
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -123,11 +134,11 @@ public static class ServicesCollectionExtensions
|
|||||||
public static IServiceCollection AddTelegramBotHostDefaults(this IServiceCollection services)
|
public static IServiceCollection AddTelegramBotHostDefaults(this IServiceCollection services)
|
||||||
{
|
{
|
||||||
services.AddLogging(builder => builder.AddConsole().AddDebug());
|
services.AddLogging(builder => builder.AddConsole().AddDebug());
|
||||||
services.AddSingleton<IUpdateHandlersPool, HostUpdateHandlersPool>();
|
|
||||||
services.AddSingleton<IAwaitingProvider, HostAwaitingProvider>();
|
services.AddSingleton<IAwaitingProvider, HostAwaitingProvider>();
|
||||||
services.AddSingleton<IHandlersProvider, HostHandlersProvider>();
|
services.AddSingleton<IHandlersProvider, HostHandlersProvider>();
|
||||||
services.AddSingleton<IUpdateRouter, HostUpdateRouter>();
|
services.AddSingleton<IUpdateRouter, HostUpdateRouter>();
|
||||||
services.AddSingleton<ITelegramBotInfo, HostedTelegramBotInfo>();
|
services.AddSingleton<ITelegramBotInfo, HostedTelegramBotInfo>();
|
||||||
|
services.AddSingleton<IStateStorage, DefaultStateStorage>();
|
||||||
|
|
||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ using System.Threading.Tasks;
|
|||||||
using Telegram.Bot.Types;
|
using Telegram.Bot.Types;
|
||||||
using Telegrator.Handlers;
|
using Telegrator.Handlers;
|
||||||
|
|
||||||
namespace Telegrator.Localized
|
namespace Telegrator.Localized;
|
||||||
{
|
|
||||||
public static class LocalizedMessageHandlerExtensions
|
public static class LocalizedMessageHandlerExtensions
|
||||||
{
|
{
|
||||||
public static async Task<Message> ResponseLocalized(this ILocalizedHandler<Message> localizedHandler, string localizedReplyIdentifier, params IEnumerable<string> formatArgs)
|
public static async Task<Message> ResponseLocalized(this ILocalizedHandler<Message> localizedHandler, string localizedReplyIdentifier, params IEnumerable<string> formatArgs)
|
||||||
@@ -14,4 +14,3 @@ namespace Telegrator.Localized
|
|||||||
return await localizedHandler.Container.Responce(localizedString.Value);
|
return await localizedHandler.Container.Responce(localizedString.Value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netstandard2.0</TargetFramework>
|
<TargetFramework>netstandard2.1</TargetFramework>
|
||||||
<LangVersion>latest</LangVersion>
|
<LangVersion>latest</LangVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ using Telegrator.Attributes;
|
|||||||
using Telegrator.Core.Filters;
|
using Telegrator.Core.Filters;
|
||||||
using Telegrator.Filters;
|
using Telegrator.Filters;
|
||||||
|
|
||||||
namespace Telegrator.Annotations
|
namespace Telegrator.Annotations;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Abstract base attribute for filtering callback-based updates.
|
/// Abstract base attribute for filtering callback-based updates.
|
||||||
/// Supports various message types including regular messages, edited messages, channel posts, and business messages.
|
/// Supports various message types including regular messages, edited messages, channel posts, and business messages.
|
||||||
@@ -41,4 +41,3 @@ namespace Telegrator.Annotations
|
|||||||
public class CallbackInlineIdAttribute(string inlineMessageId)
|
public class CallbackInlineIdAttribute(string inlineMessageId)
|
||||||
: CallbackQueryAttribute(new CallbackInlineIdFilter(inlineMessageId))
|
: CallbackQueryAttribute(new CallbackInlineIdFilter(inlineMessageId))
|
||||||
{ }
|
{ }
|
||||||
}
|
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ using Telegram.Bot.Types.Enums;
|
|||||||
using Telegrator.Filters;
|
using Telegrator.Filters;
|
||||||
using Telegrator.Attributes;
|
using Telegrator.Attributes;
|
||||||
|
|
||||||
namespace Telegrator.Annotations
|
namespace Telegrator.Annotations;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Attribute for filtering messages based on command aliases.
|
/// Attribute for filtering messages based on command aliases.
|
||||||
/// Allows handlers to respond to multiple command variations using a single attribute.
|
/// Allows handlers to respond to multiple command variations using a single attribute.
|
||||||
@@ -57,4 +57,3 @@ namespace Telegrator.Annotations
|
|||||||
/// <returns>The message from the update, or null if not present.</returns>
|
/// <returns>The message from the update, or null if not present.</returns>
|
||||||
public override Message? GetFilterringTarget(Update update) => update.Message;
|
public override Message? GetFilterringTarget(Update update) => update.Message;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using Telegrator.Filters;
|
using Telegrator.Filters;
|
||||||
|
|
||||||
namespace Telegrator.Annotations
|
namespace Telegrator.Annotations;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Attribute for filtering messages where a command has arguments count >= <paramref name="count"/>.
|
/// Attribute for filtering messages where a command has arguments count >= <paramref name="count"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -60,4 +60,3 @@ namespace Telegrator.Annotations
|
|||||||
public class ArgumentRegexAttribute(string pattern, RegexOptions options = RegexOptions.None, int index = 0)
|
public class ArgumentRegexAttribute(string pattern, RegexOptions options = RegexOptions.None, int index = 0)
|
||||||
: MessageFilterAttribute(new ArgumentRegexFilter(pattern, options, index: index))
|
: MessageFilterAttribute(new ArgumentRegexFilter(pattern, options, index: index))
|
||||||
{ }
|
{ }
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
namespace Telegrator.Annotations
|
namespace Telegrator.Annotations;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Attribute that prevents a class from being automatically collected by the handler collection system.
|
/// Attribute that prevents a class from being automatically collected by the handler collection system.
|
||||||
/// When applied to a class, it will be excluded from domain-wide handler collection operations.
|
/// When applied to a class, it will be excluded from domain-wide handler collection operations.
|
||||||
@@ -9,4 +9,3 @@
|
|||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ using Telegrator.Filters;
|
|||||||
using Telegrator.Attributes;
|
using Telegrator.Attributes;
|
||||||
using Telegrator.Core.Filters;
|
using Telegrator.Core.Filters;
|
||||||
|
|
||||||
namespace Telegrator.Annotations
|
namespace Telegrator.Annotations;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Abstract base attribute for filtering updates based on environment conditions.
|
/// Abstract base attribute for filtering updates based on environment conditions.
|
||||||
/// Can process all types of updates and provides environment-specific filtering logic.
|
/// Can process all types of updates and provides environment-specific filtering logic.
|
||||||
@@ -82,4 +82,3 @@ namespace Telegrator.Annotations
|
|||||||
public EnvironmentVariableAttribute(string variable, StringComparison comparison)
|
public EnvironmentVariableAttribute(string variable, StringComparison comparison)
|
||||||
: base(new EnvironmentVariableFilter(variable, comparison)) { }
|
: base(new EnvironmentVariableFilter(variable, comparison)) { }
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
using Telegram.Bot.Types.Enums;
|
using Telegram.Bot.Types.Enums;
|
||||||
using Telegrator.Filters;
|
using Telegrator.Filters;
|
||||||
|
|
||||||
namespace Telegrator.Annotations
|
namespace Telegrator.Annotations;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Attribute for filtering messages that contain mentions.
|
/// Attribute for filtering messages that contain mentions.
|
||||||
/// Allows handlers to respond only to messages that mention the bot or specific users.
|
/// Allows handlers to respond only to messages that mention the bot or specific users.
|
||||||
@@ -37,4 +37,3 @@ namespace Telegrator.Annotations
|
|||||||
public MentionedAttribute(string mention, int offset)
|
public MentionedAttribute(string mention, int offset)
|
||||||
: base(new MessageHasEntityFilter(MessageEntityType.Mention, offset, null), new MentionedFilter(mention)) { }
|
: base(new MessageHasEntityFilter(MessageEntityType.Mention, offset, null), new MentionedFilter(mention)) { }
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
using Telegram.Bot.Types.Enums;
|
using Telegram.Bot.Types.Enums;
|
||||||
using Telegrator.Filters;
|
using Telegrator.Filters;
|
||||||
|
|
||||||
namespace Telegrator.Annotations
|
namespace Telegrator.Annotations;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Attribute for filtering messages sent in forum chats.
|
/// Attribute for filtering messages sent in forum chats.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -102,4 +102,3 @@ namespace Telegrator.Annotations
|
|||||||
public ChatNameAttribute(string? firstName, string? lastName)
|
public ChatNameAttribute(string? firstName, string? lastName)
|
||||||
: base(new MessageChatNameFilter(firstName, lastName)) { }
|
: base(new MessageChatNameFilter(firstName, lastName)) { }
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ using Telegrator.Filters;
|
|||||||
using Telegrator.Attributes;
|
using Telegrator.Attributes;
|
||||||
using Telegrator.Core.Filters;
|
using Telegrator.Core.Filters;
|
||||||
|
|
||||||
namespace Telegrator.Annotations
|
namespace Telegrator.Annotations;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Abstract base attribute for filtering message-based updates.
|
/// Abstract base attribute for filtering message-based updates.
|
||||||
/// Supports various message types including regular messages, edited messages, channel posts, and business messages.
|
/// Supports various message types including regular messages, edited messages, channel posts, and business messages.
|
||||||
@@ -158,4 +158,3 @@ namespace Telegrator.Annotations
|
|||||||
public MessageHasEntityAttribute(MessageEntityType type, int offset, int? length, string content, StringComparison stringComparison = StringComparison.CurrentCulture)
|
public MessageHasEntityAttribute(MessageEntityType type, int offset, int? length, string content, StringComparison stringComparison = StringComparison.CurrentCulture)
|
||||||
: base(new MessageHasEntityFilter(type, offset, length, content, stringComparison)) { }
|
: base(new MessageHasEntityFilter(type, offset, length, content, stringComparison)) { }
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
using Telegrator.Filters;
|
using Telegrator.Filters;
|
||||||
|
|
||||||
namespace Telegrator.Annotations
|
namespace Telegrator.Annotations;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Attribute for filtering messages with reply to messages of this bot.
|
/// Attribute for filtering messages with reply to messages of this bot.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -24,4 +24,3 @@ namespace Telegrator.Annotations
|
|||||||
public class FromReplyChainAttribute(int replyDepth = 1)
|
public class FromReplyChainAttribute(int replyDepth = 1)
|
||||||
: MessageFilterAttribute(new FromReplyChainFilter(replyDepth))
|
: MessageFilterAttribute(new FromReplyChainFilter(replyDepth))
|
||||||
{ }
|
{ }
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
using Telegrator.Filters;
|
using Telegrator.Filters;
|
||||||
|
|
||||||
namespace Telegrator.Annotations
|
namespace Telegrator.Annotations;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Attribute for filtering messages based on the sender's username.
|
/// Attribute for filtering messages based on the sender's username.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -89,4 +89,3 @@ namespace Telegrator.Annotations
|
|||||||
public class FromPremiumUserAttribute()
|
public class FromPremiumUserAttribute()
|
||||||
: MessageFilterAttribute(new FromPremiumUserFilter())
|
: MessageFilterAttribute(new FromPremiumUserFilter())
|
||||||
{ }
|
{ }
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
using Telegrator.Filters;
|
using Telegrator.Filters;
|
||||||
|
|
||||||
namespace Telegrator.Annotations
|
namespace Telegrator.Annotations;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Attribute for filtering messages where the text starts with the specified content.
|
/// Attribute for filtering messages where the text starts with the specified content.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -55,4 +55,3 @@ namespace Telegrator.Annotations
|
|||||||
public class TextContainsWordAttribute(string word, StringComparison comparison = StringComparison.InvariantCulture, int startIndex = 0)
|
public class TextContainsWordAttribute(string word, StringComparison comparison = StringComparison.InvariantCulture, int startIndex = 0)
|
||||||
: MessageFilterAttribute(new TextContainsWordFilter(word, comparison, startIndex))
|
: MessageFilterAttribute(new TextContainsWordFilter(word, comparison, startIndex))
|
||||||
{ }
|
{ }
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
using Telegram.Bot.Types.Enums;
|
using Telegram.Bot.Types.Enums;
|
||||||
|
|
||||||
namespace Telegrator.Annotations
|
namespace Telegrator.Annotations;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Attribute that says if this handler can await some of await types, that is not listed by its handler base.
|
/// Attribute that says if this handler can await some of await types, that is not listed by its handler base.
|
||||||
/// Used for automatic collecting allowed to receiving <see cref="UpdateType"/>'s.
|
/// Used for automatic collecting allowed to receiving <see cref="UpdateType"/>'s.
|
||||||
@@ -24,4 +24,3 @@ namespace Telegrator.Annotations
|
|||||||
public MightAwaitAttribute(params UpdateType[] updateTypes)
|
public MightAwaitAttribute(params UpdateType[] updateTypes)
|
||||||
=> _updateTypes = updateTypes;
|
=> _updateTypes = updateTypes;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -0,0 +1,32 @@
|
|||||||
|
using Telegram.Bot.Types;
|
||||||
|
using Telegram.Bot.Types.Enums;
|
||||||
|
using Telegrator.Attributes;
|
||||||
|
using Telegrator.Core.States;
|
||||||
|
using Telegrator.Filters;
|
||||||
|
|
||||||
|
namespace Telegrator.Annotations;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Attribute for filtering updates where resolved state matches target value.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TKey"></typeparam>
|
||||||
|
/// <typeparam name="TValue"></typeparam>
|
||||||
|
/// <param name="value"></param>
|
||||||
|
public class StateAttribute<TKey, TValue>(TValue? value) : UpdateFilterAttribute<Update>(new StateKeyFilter<TKey, TValue>(value))
|
||||||
|
where TKey : IStateKeyResolver, new()
|
||||||
|
where TValue : IEquatable<TValue>
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The targetting state value.
|
||||||
|
/// </summary>
|
||||||
|
public TValue? Value => value;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public override UpdateType[] AllowedTypes => Update.AllTypes;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public override Update? GetFilterringTarget(Update update)
|
||||||
|
{
|
||||||
|
return update;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
using Telegrator.StateKeeping;
|
|
||||||
using Telegrator.Attributes;
|
|
||||||
using Telegrator.Core.StateKeeping;
|
|
||||||
|
|
||||||
namespace Telegrator.Annotations.StateKeeping
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Attribute for managing enum-based states in Telegram bot handlers.
|
|
||||||
/// Provides a convenient way to associate enum values with state management functionality.
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="TEnum">The enum type to be used for state management.</typeparam>
|
|
||||||
public class EnumStateAttribute<TEnum> : StateKeeperAttribute<long, TEnum, EnumStateKeeper<TEnum>> where TEnum : Enum
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes a new instance of the EnumStateAttribute with a special state and custom key resolver.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="specialState">The special state to be managed.</param>
|
|
||||||
/// <param name="keyResolver">The resolver for extracting keys from updates.</param>
|
|
||||||
public EnumStateAttribute(SpecialState specialState, IStateKeyResolver<long> keyResolver)
|
|
||||||
: base(specialState, keyResolver) { }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes a new instance of the EnumStateAttribute with a specific enum state and custom key resolver.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="myState">The specific enum state to be managed.</param>
|
|
||||||
/// <param name="keyResolver">The resolver for extracting keys from updates.</param>
|
|
||||||
public EnumStateAttribute(TEnum myState, IStateKeyResolver<long> keyResolver)
|
|
||||||
: base(myState, keyResolver) { }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes a new instance of the EnumStateAttribute with a special state and default sender ID resolver.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="specialState">The special state to be managed.</param>
|
|
||||||
public EnumStateAttribute(SpecialState specialState)
|
|
||||||
: base(specialState, new SenderIdResolver()) { }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes a new instance of the EnumStateAttribute with a specific enum state and default sender ID resolver.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="myState">The specific enum state to be managed.</param>
|
|
||||||
public EnumStateAttribute(TEnum myState)
|
|
||||||
: this(myState, new SenderIdResolver()) { }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
using Telegrator.StateKeeping;
|
|
||||||
using Telegrator.Attributes;
|
|
||||||
using Telegrator.Core.StateKeeping;
|
|
||||||
|
|
||||||
namespace Telegrator.Annotations.StateKeeping
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Attribute for associating a handler or method with a numeric (integer) state keeper.
|
|
||||||
/// Provides constructors for flexible state and key resolver configuration.
|
|
||||||
/// </summary>
|
|
||||||
public class NumericStateAttribute : StateKeeperAttribute<long, int, NumericStateKeeper>
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes the attribute with a special state and a custom key resolver.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="specialState">The special state to associate</param>
|
|
||||||
/// <param name="keyResolver">The key resolver for state keeping</param>
|
|
||||||
public NumericStateAttribute(SpecialState specialState, IStateKeyResolver<long> keyResolver)
|
|
||||||
: base(specialState, keyResolver) { }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes the attribute with a specific numeric state and a custom key resolver.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="myState">The integer state to associate</param>
|
|
||||||
/// <param name="keyResolver">The key resolver for state keeping</param>
|
|
||||||
public NumericStateAttribute(int myState, IStateKeyResolver<long> keyResolver)
|
|
||||||
: base(myState, keyResolver) { }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes the attribute with a special state and the default sender ID resolver.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="specialState">The special state to associate</param>
|
|
||||||
public NumericStateAttribute(SpecialState specialState)
|
|
||||||
: base(specialState, new SenderIdResolver()) { }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes the attribute with a specific numeric state and the default sender ID resolver.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="myState">The integer state to associate</param>
|
|
||||||
public NumericStateAttribute(int myState)
|
|
||||||
: this(myState, new SenderIdResolver()) { }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
namespace Telegrator.Annotations.StateKeeping
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Represents special states for state keeping logic.
|
|
||||||
/// </summary>
|
|
||||||
public enum SpecialState
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// No special state.
|
|
||||||
/// </summary>
|
|
||||||
None,
|
|
||||||
/// <summary>
|
|
||||||
/// Indicates that no state is present.
|
|
||||||
/// </summary>
|
|
||||||
NoState,
|
|
||||||
/// <summary>
|
|
||||||
/// Indicates that any state is acceptable.
|
|
||||||
/// </summary>
|
|
||||||
AnyState
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
using Telegrator.StateKeeping;
|
|
||||||
using Telegrator.Attributes;
|
|
||||||
using Telegrator.Core.StateKeeping;
|
|
||||||
|
|
||||||
namespace Telegrator.Annotations.StateKeeping
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Attribute for associating a handler or method with a string-based state keeper.
|
|
||||||
/// Provides various constructors for flexible state and key resolver configuration.
|
|
||||||
/// </summary>
|
|
||||||
public class StringStateAttribute : StateKeeperAttribute<long, string, StringStateKeeper>
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes the attribute with a special state and a custom key resolver.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="specialState">The special state to associate</param>
|
|
||||||
/// <param name="keyResolver">The key resolver for state keeping</param>
|
|
||||||
public StringStateAttribute(SpecialState specialState, IStateKeyResolver<long> keyResolver)
|
|
||||||
: base(specialState, keyResolver) { }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes the attribute with a specific state and a custom key resolver.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="myState">The string state to associate</param>
|
|
||||||
/// <param name="keyResolver">The key resolver for state keeping</param>
|
|
||||||
public StringStateAttribute(string myState, IStateKeyResolver<long> keyResolver)
|
|
||||||
: base(myState, keyResolver) { }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes the attribute with a special state and the default sender ID resolver.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="specialState">The special state to associate</param>
|
|
||||||
public StringStateAttribute(SpecialState specialState)
|
|
||||||
: base(specialState, new SenderIdResolver()) { }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes the attribute with a specific state and the default sender ID resolver.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="myState">The string state to associate</param>
|
|
||||||
public StringStateAttribute(string myState)
|
|
||||||
: base(myState, new SenderIdResolver()) { }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
using Telegram.Bot.Types;
|
|
||||||
using Telegram.Bot.Types.Enums;
|
|
||||||
using Telegrator.Filters;
|
|
||||||
|
|
||||||
namespace Telegrator.Annotations.Targetted
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Attribute for filtering message with command "start" in bot's private chats.
|
|
||||||
/// Allows handlers to respond to "welcome" bot commands.
|
|
||||||
/// </summary>
|
|
||||||
public class WelcomeAttribute : MessageFilterAttribute
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Creates new instance of <see cref="WelcomeAttribute"/>
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="onlyFirst"></param>
|
|
||||||
public WelcomeAttribute(bool onlyFirst = false) : base(
|
|
||||||
new MessageChatTypeFilter(ChatType.Private),
|
|
||||||
new CommandAlliasFilter("start"),
|
|
||||||
Filter<Message>.If(ctx => !onlyFirst || ctx.Input.Id == 0))
|
|
||||||
{ }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
using Telegram.Bot.Types;
|
||||||
|
using Telegram.Bot.Types.Enums;
|
||||||
|
using Telegrator.Filters;
|
||||||
|
|
||||||
|
namespace Telegrator.Annotations;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Attribute for filtering message with command "start" in bot's private chats.
|
||||||
|
/// Allows handlers to respond to "welcome" bot commands.
|
||||||
|
/// </summary>
|
||||||
|
public class WelcomeAttribute : MessageFilterAttribute
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Creates new instance of <see cref="WelcomeAttribute"/>
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="onlyFirst"></param>
|
||||||
|
public WelcomeAttribute(bool onlyFirst = false) : base(
|
||||||
|
new MessageChatTypeFilter(ChatType.Private),
|
||||||
|
new CommandAlliasFilter("start"),
|
||||||
|
Filter<Message>.If(ctx => !onlyFirst || ctx.Input.Id == 0))
|
||||||
|
{ }
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
namespace Telegrator.Aspects
|
namespace Telegrator.Aspects;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Attribute that specifies a post-execution processor to be executed after the handler.
|
/// Attribute that specifies a post-execution processor to be executed after the handler.
|
||||||
/// The processor type must implement <see cref="IPostProcessor"/> interface.
|
/// The processor type must implement <see cref="IPostProcessor"/> interface.
|
||||||
@@ -13,4 +13,3 @@
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public Type ProcessorType => typeof(T);
|
public Type ProcessorType => typeof(T);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
namespace Telegrator.Aspects
|
namespace Telegrator.Aspects;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Attribute that specifies a pre-execution processor to be executed before the handler.
|
/// Attribute that specifies a pre-execution processor to be executed before the handler.
|
||||||
/// The processor type must implement <see cref="IPreProcessor"/> interface.
|
/// The processor type must implement <see cref="IPreProcessor"/> interface.
|
||||||
@@ -13,4 +13,3 @@
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public Type ProcessorType => typeof(T);
|
public Type ProcessorType => typeof(T);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
using Telegrator.Core.Handlers;
|
using Telegrator.Core.Handlers;
|
||||||
|
|
||||||
namespace Telegrator.Aspects
|
namespace Telegrator.Aspects;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Interface for post-execution processors that are executed after handler execution.
|
/// Interface for post-execution processors that are executed after handler execution.
|
||||||
/// Implement this interface to add cross-cutting concerns like logging, cleanup, or metrics collection.
|
/// Implement this interface to add cross-cutting concerns like logging, cleanup, or metrics collection.
|
||||||
@@ -16,4 +16,3 @@ namespace Telegrator.Aspects
|
|||||||
/// <returns>A <see cref="Result"/> indicating the final execution result.</returns>
|
/// <returns>A <see cref="Result"/> indicating the final execution result.</returns>
|
||||||
public Task<Result> AfterExecution(IHandlerContainer container, CancellationToken cancellationToken);
|
public Task<Result> AfterExecution(IHandlerContainer container, CancellationToken cancellationToken);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
using Telegrator.Core.Handlers;
|
using Telegrator.Core.Handlers;
|
||||||
|
|
||||||
namespace Telegrator.Aspects
|
namespace Telegrator.Aspects;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Interface for pre-execution processors that are executed before handler execution.
|
/// Interface for pre-execution processors that are executed before handler execution.
|
||||||
/// Implement this interface to add cross-cutting concerns like validation, logging, or authorization.
|
/// Implement this interface to add cross-cutting concerns like validation, logging, or authorization.
|
||||||
@@ -16,4 +16,3 @@ namespace Telegrator.Aspects
|
|||||||
/// <returns>A <see cref="Result"/> indicating whether execution should continue or be stopped.</returns>
|
/// <returns>A <see cref="Result"/> indicating whether execution should continue or be stopped.</returns>
|
||||||
public Task<Result> BeforeExecution(IHandlerContainer container, CancellationToken cancellationToken = default);
|
public Task<Result> BeforeExecution(IHandlerContainer container, CancellationToken cancellationToken = default);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ using Telegram.Bot.Types.Enums;
|
|||||||
using Telegrator.Core.Filters;
|
using Telegrator.Core.Filters;
|
||||||
using Telegrator.Filters;
|
using Telegrator.Filters;
|
||||||
|
|
||||||
namespace Telegrator.Attributes
|
namespace Telegrator.Attributes;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Reactive way to implement a new <see cref="UpdateFilterAttribute{T}"/> of type <typeparamref name="T"/>
|
/// Reactive way to implement a new <see cref="UpdateFilterAttribute{T}"/> of type <typeparamref name="T"/>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -36,4 +36,3 @@ namespace Telegrator.Attributes
|
|||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public abstract bool CanPass(FilterExecutionContext<T> context);
|
public abstract bool CanPass(FilterExecutionContext<T> context);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
namespace Telegrator.Attributes
|
namespace Telegrator.Attributes;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Enumeration of filter modifiers that can be applied to update filters.
|
/// Enumeration of filter modifiers that can be applied to update filters.
|
||||||
/// Defines how filters should be combined and applied in filter chains.
|
/// Defines how filters should be combined and applied in filter chains.
|
||||||
@@ -22,4 +22,3 @@
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
Not = 4,
|
Not = 4,
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,86 +0,0 @@
|
|||||||
using Telegram.Bot.Types;
|
|
||||||
using Telegrator.Annotations.StateKeeping;
|
|
||||||
using Telegrator.Core.Attributes;
|
|
||||||
using Telegrator.Core.Filters;
|
|
||||||
using Telegrator.Core.StateKeeping;
|
|
||||||
|
|
||||||
namespace Telegrator.Attributes
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Abstract attribute for associating a handler or method with a state keeper.
|
|
||||||
/// Provides logic for state-based filtering and state management.
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="TKey">The type of the key used for state keeping (e.g., chat ID).</typeparam>
|
|
||||||
/// <typeparam name="TState">The type of the state value (e.g., string, int).</typeparam>
|
|
||||||
/// <typeparam name="TKeeper">The type of the state keeper implementation.</typeparam>
|
|
||||||
public abstract class StateKeeperAttribute<TKey, TState, TKeeper> : StateKeeperAttributeBase where TKey : notnull where TState : notnull where TKeeper : StateKeeperBase<TKey, TState>, new()
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
private static readonly TKeeper _shared = new TKeeper();
|
|
||||||
private static readonly Dictionary<TKey, TKeeper> _keyed = [];
|
|
||||||
*/
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the singleton instance of the state keeper for this attribute type.
|
|
||||||
/// </summary>
|
|
||||||
public static TKeeper Shared { get; } = new TKeeper();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the default state value of this statekeeper.
|
|
||||||
/// </summary>
|
|
||||||
public static TState DefaultState => Shared.DefaultState;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the state value associated with this attribute instance.
|
|
||||||
/// </summary>
|
|
||||||
public TState MyState { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the special state mode for this attribute instance.
|
|
||||||
/// </summary>
|
|
||||||
public SpecialState SpecialState { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes the attribute with a specific state and a custom key resolver.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="myState">The state value to associate</param>
|
|
||||||
/// <param name="keyResolver">The key resolver for state keeping</param>
|
|
||||||
protected StateKeeperAttribute(TState myState, IStateKeyResolver<TKey> keyResolver) : base(typeof(TKeeper))
|
|
||||||
{
|
|
||||||
Shared.KeyResolver = keyResolver;
|
|
||||||
MyState = myState;
|
|
||||||
SpecialState = SpecialState.None;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes the attribute with a special state and a custom key resolver.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="specialState">The special state mode</param>
|
|
||||||
/// <param name="keyResolver">The key resolver for state keeping</param>
|
|
||||||
protected StateKeeperAttribute(SpecialState specialState, IStateKeyResolver<TKey> keyResolver) : base(typeof(TKeeper))
|
|
||||||
{
|
|
||||||
Shared.KeyResolver = keyResolver;
|
|
||||||
MyState = Shared.DefaultState;
|
|
||||||
SpecialState = specialState;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Determines whether the current update context passes the state filter.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context">The filter execution context</param>
|
|
||||||
/// <returns>True if the state matches the filter; otherwise, false.</returns>
|
|
||||||
public override bool CanPass(FilterExecutionContext<Update> context)
|
|
||||||
{
|
|
||||||
if (SpecialState == SpecialState.AnyState)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if (!Shared.TryGetState(context.Input, out TState? state))
|
|
||||||
return SpecialState == SpecialState.NoState;
|
|
||||||
|
|
||||||
if (state == null)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return MyState.Equals(state);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -3,8 +3,8 @@ using Telegrator.Core.Attributes;
|
|||||||
using Telegrator.Core.Filters;
|
using Telegrator.Core.Filters;
|
||||||
using Telegrator.Filters;
|
using Telegrator.Filters;
|
||||||
|
|
||||||
namespace Telegrator.Attributes
|
namespace Telegrator.Attributes;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Abstract base attribute for defining update filters for a specific type of update target.
|
/// Abstract base attribute for defining update filters for a specific type of update target.
|
||||||
/// Provides logic for filter composition, modifier processing, and target extraction.
|
/// Provides logic for filter composition, modifier processing, and target extraction.
|
||||||
@@ -82,4 +82,3 @@ namespace Telegrator.Attributes
|
|||||||
/// <returns>The target object to filter, or null if not applicable</returns>
|
/// <returns>The target object to filter, or null if not applicable</returns>
|
||||||
public abstract T? GetFilterringTarget(Update update);
|
public abstract T? GetFilterringTarget(Update update);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
using Telegrator.Core.Attributes;
|
using Telegrator.Core.Attributes;
|
||||||
using Telegrator.Core.Handlers;
|
using Telegrator.Core.Handlers;
|
||||||
|
|
||||||
namespace Telegrator.Attributes
|
namespace Telegrator.Attributes;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Abstract base attribute for marking update handler classes.
|
/// Abstract base attribute for marking update handler classes.
|
||||||
/// Provides a type-safe way to associate handler types with specific update types and importance settings.
|
/// Provides a type-safe way to associate handler types with specific update types and importance settings.
|
||||||
@@ -43,4 +43,3 @@ namespace Telegrator.Attributes
|
|||||||
protected UpdateHandlerAttribute(Type[] types, UpdateType updateType, int importance)
|
protected UpdateHandlerAttribute(Type[] types, UpdateType updateType, int importance)
|
||||||
: base([.. types, typeof(T)], updateType, importance) { }
|
: base([.. types, typeof(T)], updateType, importance) { }
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
using Telegram.Bot.Types;
|
|
||||||
using Telegrator.Core.Filters;
|
|
||||||
using Telegrator.Core.Handlers;
|
|
||||||
using Telegrator.Core.StateKeeping;
|
|
||||||
|
|
||||||
namespace Telegrator.Core.Attributes
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Sets the state in which the <see cref="UpdateHandlerBase"/> can be executed
|
|
||||||
/// </summary>
|
|
||||||
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
|
|
||||||
public abstract class StateKeeperAttributeBase : Attribute, IFilter<Update>
|
|
||||||
{
|
|
||||||
/// <inheritdoc/>
|
|
||||||
public bool IsCollectible => GetType().HasPublicProperties();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Creates a new instance <see cref="StateKeeperBase{TKey, TState}"/>
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="stateKeeperType"></param>
|
|
||||||
/// <exception cref="ArgumentException"></exception>
|
|
||||||
protected StateKeeperAttributeBase(Type stateKeeperType)
|
|
||||||
{
|
|
||||||
if (!stateKeeperType.IsAssignableToGenericType(typeof(StateKeeperBase<,>)))
|
|
||||||
throw new ArgumentException(stateKeeperType + " is not a StateKeeperBase", nameof(stateKeeperType));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Realizes a <see cref="IFilter{T}"/> for validation of the current <see cref="StateKeeperBase{TKey, TState}"/> in the polling routing
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public abstract bool CanPass(FilterExecutionContext<Update> context);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -5,8 +5,8 @@ using Telegrator.Core.Filters;
|
|||||||
using Telegrator.Core.Handlers;
|
using Telegrator.Core.Handlers;
|
||||||
using Telegrator.Filters;
|
using Telegrator.Filters;
|
||||||
|
|
||||||
namespace Telegrator.Core.Attributes
|
namespace Telegrator.Core.Attributes;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Defines the <see cref="IFilter{T}"/> to <see cref="Update"/> validation for entry into execution of the <see cref="UpdateHandlerBase"/>
|
/// Defines the <see cref="IFilter{T}"/> to <see cref="Update"/> validation for entry into execution of the <see cref="UpdateHandlerBase"/>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -44,4 +44,3 @@ namespace Telegrator.Core.Attributes
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public abstract bool ProcessModifiers(UpdateFilterAttributeBase? previous);
|
public abstract bool ProcessModifiers(UpdateFilterAttributeBase? previous);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ using Telegrator.Core.Descriptors;
|
|||||||
using Telegrator.Core.Filters;
|
using Telegrator.Core.Filters;
|
||||||
using Telegrator.Core.Handlers;
|
using Telegrator.Core.Handlers;
|
||||||
|
|
||||||
namespace Telegrator.Core.Attributes
|
namespace Telegrator.Core.Attributes;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Defines the <see cref="UpdateType"/>'s and validator (<see cref="IFilter{T}"/>) of the <see cref="Update"/> that <see cref="UpdateHandlerBase"/> will process
|
/// Defines the <see cref="UpdateType"/>'s and validator (<see cref="IFilter{T}"/>) of the <see cref="Update"/> that <see cref="UpdateHandlerBase"/> will process
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -79,4 +79,3 @@ namespace Telegrator.Core.Attributes
|
|||||||
/// <returns>True if the update passes validation; otherwise, false.</returns>
|
/// <returns>True if the update passes validation; otherwise, false.</returns>
|
||||||
public abstract bool CanPass(FilterExecutionContext<Update> context);
|
public abstract bool CanPass(FilterExecutionContext<Update> context);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ using Telegrator.Core.Handlers;
|
|||||||
using Telegrator.Handlers;
|
using Telegrator.Handlers;
|
||||||
using Telegrator.Handlers.Building;
|
using Telegrator.Handlers.Building;
|
||||||
|
|
||||||
namespace Telegrator.Core.Descriptors
|
namespace Telegrator.Core.Descriptors;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Descriptor for creating handlers from methods
|
/// Descriptor for creating handlers from methods
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -24,7 +24,7 @@ namespace Telegrator.Core.Descriptors
|
|||||||
public MethodHandlerDescriptor(AbstractHandlerAction<TUpdate> action) : base(DescriptorType.General, typeof(MethodHandler), true)
|
public MethodHandlerDescriptor(AbstractHandlerAction<TUpdate> action) : base(DescriptorType.General, typeof(MethodHandler), true)
|
||||||
{
|
{
|
||||||
UpdateHandlerAttributeBase handlerAttribute = HandlerInspector.GetHandlerAttribute(action.Method);
|
UpdateHandlerAttributeBase handlerAttribute = HandlerInspector.GetHandlerAttribute(action.Method);
|
||||||
StateKeeperAttributeBase? stateKeeperAttribute = HandlerInspector.GetStateKeeperAttribute(action.Method);
|
IFilter<Update>? stateKeeperAttribute = HandlerInspector.GetStateKeeperAttribute(action.Method);
|
||||||
IFilter<Update>[] filters = HandlerInspector.GetFilterAttributes(action.Method, handlerAttribute.Type).ToArray();
|
IFilter<Update>[] filters = HandlerInspector.GetFilterAttributes(action.Method, handlerAttribute.Type).ToArray();
|
||||||
|
|
||||||
UpdateType = handlerAttribute.Type;
|
UpdateType = handlerAttribute.Type;
|
||||||
@@ -67,4 +67,3 @@ namespace Telegrator.Core.Descriptors
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
using Telegram.Bot;
|
using Telegram.Bot;
|
||||||
using Telegram.Bot.Types;
|
using Telegram.Bot.Types;
|
||||||
using Telegrator.Core;
|
|
||||||
using Telegrator.Core.Filters;
|
using Telegrator.Core.Filters;
|
||||||
using Telegrator.Core.Handlers;
|
using Telegrator.Core.Handlers;
|
||||||
|
using Telegrator.Core.States;
|
||||||
|
|
||||||
|
namespace Telegrator.Core.Descriptors;
|
||||||
|
|
||||||
namespace Telegrator.Core.Descriptors
|
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Contains information about a described handler, including its context, client, and execution logic.
|
/// Contains information about a described handler, including its context, client, and execution logic.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -28,6 +28,11 @@ namespace Telegrator.Core.Descriptors
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public IAwaitingProvider AwaitingProvider { get; }
|
public IAwaitingProvider AwaitingProvider { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The state storage to handling state machines
|
||||||
|
/// </summary>
|
||||||
|
public IStateStorage StateStorage { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The Telegram bot client used for this handler.
|
/// The Telegram bot client used for this handler.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -74,6 +79,7 @@ namespace Telegrator.Core.Descriptors
|
|||||||
/// <param name="fromDescriptor">The descriptor from which this handler was described.</param>
|
/// <param name="fromDescriptor">The descriptor from which this handler was described.</param>
|
||||||
/// <param name="updateRouter">The update router.</param>
|
/// <param name="updateRouter">The update router.</param>
|
||||||
/// <param name="awaitingProvider">The awaiting provider.</param>
|
/// <param name="awaitingProvider">The awaiting provider.</param>
|
||||||
|
/// <param name="stateStorage">The state storage.</param>
|
||||||
/// <param name="client">The Telegram bot client.</param>
|
/// <param name="client">The Telegram bot client.</param>
|
||||||
/// <param name="handlerInstance">The handler instance.</param>
|
/// <param name="handlerInstance">The handler instance.</param>
|
||||||
/// <param name="filterContext">The filter execution context.</param>
|
/// <param name="filterContext">The filter execution context.</param>
|
||||||
@@ -82,6 +88,7 @@ namespace Telegrator.Core.Descriptors
|
|||||||
HandlerDescriptor fromDescriptor,
|
HandlerDescriptor fromDescriptor,
|
||||||
IUpdateRouter updateRouter,
|
IUpdateRouter updateRouter,
|
||||||
IAwaitingProvider awaitingProvider,
|
IAwaitingProvider awaitingProvider,
|
||||||
|
IStateStorage stateStorage,
|
||||||
ITelegramBotClient client,
|
ITelegramBotClient client,
|
||||||
UpdateHandlerBase handlerInstance,
|
UpdateHandlerBase handlerInstance,
|
||||||
FilterExecutionContext<Update> filterContext,
|
FilterExecutionContext<Update> filterContext,
|
||||||
@@ -90,6 +97,7 @@ namespace Telegrator.Core.Descriptors
|
|||||||
From = fromDescriptor;
|
From = fromDescriptor;
|
||||||
UpdateRouter = updateRouter;
|
UpdateRouter = updateRouter;
|
||||||
AwaitingProvider = awaitingProvider;
|
AwaitingProvider = awaitingProvider;
|
||||||
|
StateStorage = stateStorage;
|
||||||
Client = client;
|
Client = client;
|
||||||
HandlerInstance = handlerInstance;
|
HandlerInstance = handlerInstance;
|
||||||
ExtraData = filterContext.Data;
|
ExtraData = filterContext.Data;
|
||||||
@@ -115,7 +123,7 @@ namespace Telegrator.Core.Descriptors
|
|||||||
/// <param name="result">The execution result.</param>
|
/// <param name="result">The execution result.</param>
|
||||||
public void ReportResult(Result? result)
|
public void ReportResult(Result? result)
|
||||||
{
|
{
|
||||||
if (result != null)
|
if (Result != null)
|
||||||
throw new InvalidOperationException("Result already reported");
|
throw new InvalidOperationException("Result already reported");
|
||||||
|
|
||||||
Result = result;
|
Result = result;
|
||||||
@@ -126,4 +134,3 @@ namespace Telegrator.Core.Descriptors
|
|||||||
public override string ToString()
|
public override string ToString()
|
||||||
=> DisplayString ?? From.HandlerType.Name;
|
=> DisplayString ?? From.HandlerType.Name;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
using Telegrator.Aspects;
|
using Telegrator.Aspects;
|
||||||
using Telegrator.Core.Handlers;
|
using Telegrator.Core.Handlers;
|
||||||
|
|
||||||
namespace Telegrator.Core.Descriptors
|
namespace Telegrator.Core.Descriptors;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Manages the execution of pre and post-execution aspects for a handler.
|
/// Manages the execution of pre and post-execution aspects for a handler.
|
||||||
/// This class coordinates between self-processing (handler implements interfaces)
|
/// This class coordinates between self-processing (handler implements interfaces)
|
||||||
@@ -77,4 +77,3 @@ namespace Telegrator.Core.Descriptors
|
|||||||
return Result.Ok();
|
return Result.Ok();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ using Telegrator.Core.Filters;
|
|||||||
using Telegrator.Handlers.Diagnostics;
|
using Telegrator.Handlers.Diagnostics;
|
||||||
using Telegrator.Logging;
|
using Telegrator.Logging;
|
||||||
|
|
||||||
namespace Telegrator.Core.Descriptors
|
namespace Telegrator.Core.Descriptors;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents a set of filters for a handler descriptor, including update and state keeper validators.
|
/// Represents a set of filters for a handler descriptor, including update and state keeper validators.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -142,4 +142,3 @@ namespace Telegrator.Core.Descriptors
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
using Telegrator.Core.Attributes;
|
using Telegrator.Core.Attributes;
|
||||||
|
|
||||||
namespace Telegrator.Core.Descriptors
|
namespace Telegrator.Core.Descriptors;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents an indexer for handler descriptors, containing importance and priority information.
|
/// Represents an indexer for handler descriptors, containing importance and priority information.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -85,4 +85,3 @@ namespace Telegrator.Core.Descriptors
|
|||||||
return string.Format("(Ix: {0,2}, Im: {1,2}, Pr: {2,2})", RouterIndex, Importance, Priority);
|
return string.Format("(Ix: {0,2}, Im: {1,2}, Pr: {2,2})", RouterIndex, Importance, Priority);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ using Telegrator.Core.Attributes;
|
|||||||
using Telegrator.Core.Filters;
|
using Telegrator.Core.Filters;
|
||||||
using Telegrator.Core.Handlers;
|
using Telegrator.Core.Handlers;
|
||||||
|
|
||||||
namespace Telegrator.Core.Descriptors
|
namespace Telegrator.Core.Descriptors;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Specifies the type of handler descriptor.
|
/// Specifies the type of handler descriptor.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -167,7 +167,7 @@ namespace Telegrator.Core.Descriptors
|
|||||||
if (handlerAttribute.ExpectingHandlerType != null && !handlerAttribute.ExpectingHandlerType.Contains(handlerType.BaseType))
|
if (handlerAttribute.ExpectingHandlerType != null && !handlerAttribute.ExpectingHandlerType.Contains(handlerType.BaseType))
|
||||||
throw new ArgumentException(string.Format("This handler attribute cannot be attached to this class. Attribute can be attached on next handlers : {0}", string.Join(", ", handlerAttribute.ExpectingHandlerType.AsEnumerable())));
|
throw new ArgumentException(string.Format("This handler attribute cannot be attached to this class. Attribute can be attached on next handlers : {0}", string.Join(", ", handlerAttribute.ExpectingHandlerType.AsEnumerable())));
|
||||||
|
|
||||||
StateKeeperAttributeBase? stateKeeperAttribute = HandlerInspector.GetStateKeeperAttribute(handlerType);
|
IFilter<Update>? stateKeeperAttribute = HandlerInspector.GetStateKeeperAttribute(handlerType);
|
||||||
IFilter<Update>[] filters = HandlerInspector.GetFilterAttributes(handlerType, handlerAttribute.Type).ToArray();
|
IFilter<Update>[] filters = HandlerInspector.GetFilterAttributes(handlerType, handlerAttribute.Type).ToArray();
|
||||||
|
|
||||||
UpdateType = handlerAttribute.Type;
|
UpdateType = handlerAttribute.Type;
|
||||||
@@ -472,4 +472,3 @@ namespace Telegrator.Core.Descriptors
|
|||||||
public override string ToString()
|
public override string ToString()
|
||||||
=> DisplayString ?? HandlerType.Name;
|
=> DisplayString ?? HandlerType.Name;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
@@ -2,8 +2,8 @@
|
|||||||
using Telegram.Bot.Types;
|
using Telegram.Bot.Types;
|
||||||
using Telegram.Bot.Types.Enums;
|
using Telegram.Bot.Types.Enums;
|
||||||
|
|
||||||
namespace Telegrator.Core.Descriptors
|
namespace Telegrator.Core.Descriptors;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The collection containing the <see cref="HandlerDescriptor"/>'s. Used to route <see cref="Update"/>'s in <see cref="IHandlersProvider"/>
|
/// The collection containing the <see cref="HandlerDescriptor"/>'s. Used to route <see cref="Update"/>'s in <see cref="IHandlersProvider"/>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -156,4 +156,3 @@ namespace Telegrator.Core.Descriptors
|
|||||||
return _innerCollection.Values.GetEnumerator();
|
return _innerCollection.Values.GetEnumerator();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -2,12 +2,13 @@
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using Telegram.Bot.Types;
|
using Telegram.Bot.Types;
|
||||||
using Telegram.Bot.Types.Enums;
|
using Telegram.Bot.Types.Enums;
|
||||||
|
using Telegrator.Annotations;
|
||||||
using Telegrator.Aspects;
|
using Telegrator.Aspects;
|
||||||
using Telegrator.Core.Attributes;
|
using Telegrator.Core.Attributes;
|
||||||
using Telegrator.Core.Filters;
|
using Telegrator.Core.Filters;
|
||||||
|
|
||||||
namespace Telegrator.Core.Descriptors
|
namespace Telegrator.Core.Descriptors;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Provides methods for inspecting handler types and retrieving their attributes and filters.
|
/// Provides methods for inspecting handler types and retrieving their attributes and filters.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -42,13 +43,13 @@ namespace Telegrator.Core.Descriptors
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="handlerType">The member info representing the handler type.</param>
|
/// <param name="handlerType">The member info representing the handler type.</param>
|
||||||
/// <returns>The state keeper attribute, or null if not present.</returns>
|
/// <returns>The state keeper attribute, or null if not present.</returns>
|
||||||
public static StateKeeperAttributeBase? GetStateKeeperAttribute(MemberInfo handlerType)
|
public static IFilter<Update>? GetStateKeeperAttribute(MemberInfo handlerType)
|
||||||
{
|
{
|
||||||
// Getting polling handler attribute
|
// Getting polling handler attribute
|
||||||
IEnumerable<StateKeeperAttributeBase> handlerAttrs = handlerType.GetCustomAttributes<StateKeeperAttributeBase>();
|
Attribute stateAttr = handlerType.GetCustomAttribute(typeof(StateAttribute<,>));
|
||||||
|
|
||||||
//
|
//
|
||||||
return handlerAttrs.Any() ? handlerAttrs.Single() : null;
|
return stateAttr as IFilter<Update>;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -95,4 +96,3 @@ namespace Telegrator.Core.Descriptors
|
|||||||
return new DescriptorAspectsSet(typedPre, typedPost);
|
return new DescriptorAspectsSet(typedPre, typedPost);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
using Telegrator.Filters;
|
using Telegrator.Filters;
|
||||||
using Telegrator.Logging;
|
using Telegrator.Logging;
|
||||||
|
|
||||||
namespace Telegrator.Core.Filters
|
namespace Telegrator.Core.Filters;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents a compiled filter that applies a set of filters to an anonymous target type.
|
/// Represents a compiled filter that applies a set of filters to an anonymous target type.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -106,4 +106,3 @@ namespace Telegrator.Core.Filters
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
using Telegrator.Filters;
|
using Telegrator.Filters;
|
||||||
using Telegrator.Logging;
|
using Telegrator.Logging;
|
||||||
|
|
||||||
namespace Telegrator.Core.Filters
|
namespace Telegrator.Core.Filters;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents a filter that applies a filter action to an anonymous target type extracted from an update.
|
/// Represents a filter that applies a filter action to an anonymous target type extracted from an update.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -107,4 +107,3 @@ namespace Telegrator.Core.Filters
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
using Telegrator.Filters;
|
using Telegrator.Filters;
|
||||||
using Telegrator.Logging;
|
using Telegrator.Logging;
|
||||||
|
|
||||||
namespace Telegrator.Core.Filters
|
namespace Telegrator.Core.Filters;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents a filter that composes multiple filters and passes only if all of them pass.
|
/// Represents a filter that composes multiple filters and passes only if all of them pass.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -61,4 +61,3 @@ namespace Telegrator.Core.Filters
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
using System.Collections;
|
using System.Collections;
|
||||||
|
|
||||||
namespace Telegrator.Core.Filters
|
namespace Telegrator.Core.Filters;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The list containing filters worked out during Polling to further obtain additional filtering information
|
/// The list containing filters worked out during Polling to further obtain additional filtering information
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -83,4 +83,3 @@ namespace Telegrator.Core.Filters
|
|||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
IEnumerator IEnumerable.GetEnumerator() => CompletedFilters.GetEnumerator();
|
IEnumerator IEnumerable.GetEnumerator() => CompletedFilters.GetEnumerator();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,14 +1,19 @@
|
|||||||
using Telegram.Bot.Types;
|
using Telegram.Bot.Types;
|
||||||
using Telegram.Bot.Types.Enums;
|
using Telegram.Bot.Types.Enums;
|
||||||
|
|
||||||
namespace Telegrator.Core.Filters
|
namespace Telegrator.Core.Filters;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents the context for filter execution, including update, input, and additional data.
|
/// Represents the context for filter execution, including update, input, and additional data.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="T">The type of the input for the filter.</typeparam>
|
/// <typeparam name="T">The type of the input for the filter.</typeparam>
|
||||||
public class FilterExecutionContext<T> where T : class
|
public class FilterExecutionContext<T> where T : class
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the <see cref="ITelegramBotInfo"/> for the current context.
|
||||||
|
/// </summary>
|
||||||
|
public IUpdateRouter UpdateRouter { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the <see cref="ITelegramBotInfo"/> for the current context.
|
/// Gets the <see cref="ITelegramBotInfo"/> for the current context.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -42,13 +47,15 @@ namespace Telegrator.Core.Filters
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="FilterExecutionContext{T}"/> class with all parameters.
|
/// Initializes a new instance of the <see cref="FilterExecutionContext{T}"/> class with all parameters.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <param name="router">The router, that invoked filter.</param>
|
||||||
/// <param name="botInfo">The bot info.</param>
|
/// <param name="botInfo">The bot info.</param>
|
||||||
/// <param name="update">The update.</param>
|
/// <param name="update">The update.</param>
|
||||||
/// <param name="input">The input object.</param>
|
/// <param name="input">The input object.</param>
|
||||||
/// <param name="data">The additional data dictionary.</param>
|
/// <param name="data">The additional data dictionary.</param>
|
||||||
/// <param name="completedFilters">The list of completed filters.</param>
|
/// <param name="completedFilters">The list of completed filters.</param>
|
||||||
public FilterExecutionContext(ITelegramBotInfo botInfo, Update update, T input, Dictionary<string, object> data, CompletedFiltersList completedFilters)
|
public FilterExecutionContext(IUpdateRouter router, ITelegramBotInfo botInfo, Update update, T input, Dictionary<string, object> data, CompletedFiltersList completedFilters)
|
||||||
{
|
{
|
||||||
|
UpdateRouter = router;
|
||||||
BotInfo = botInfo;
|
BotInfo = botInfo;
|
||||||
Data = data;
|
Data = data;
|
||||||
CompletedFilters = completedFilters;
|
CompletedFilters = completedFilters;
|
||||||
@@ -60,11 +67,12 @@ namespace Telegrator.Core.Filters
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="FilterExecutionContext{T}"/> class with default data and filters.
|
/// Initializes a new instance of the <see cref="FilterExecutionContext{T}"/> class with default data and filters.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <param name="router">The router, that invoked filter.</param>
|
||||||
/// <param name="botInfo">The bot info.</param>
|
/// <param name="botInfo">The bot info.</param>
|
||||||
/// <param name="update">The update.</param>
|
/// <param name="update">The update.</param>
|
||||||
/// <param name="input">The input object.</param>
|
/// <param name="input">The input object.</param>
|
||||||
public FilterExecutionContext(ITelegramBotInfo botInfo, Update update, T input)
|
public FilterExecutionContext(IUpdateRouter router, ITelegramBotInfo botInfo, Update update, T input)
|
||||||
: this(botInfo, update, input, [], []) { }
|
: this(router, botInfo, update, input, [], []) { }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a child context for a different input type, sharing the same data and completed filters.
|
/// Creates a child context for a different input type, sharing the same data and completed filters.
|
||||||
@@ -73,6 +81,5 @@ namespace Telegrator.Core.Filters
|
|||||||
/// <param name="input">The new input object.</param>
|
/// <param name="input">The new input object.</param>
|
||||||
/// <returns>A new <see cref="FilterExecutionContext{C}"/> instance.</returns>
|
/// <returns>A new <see cref="FilterExecutionContext{C}"/> instance.</returns>
|
||||||
public FilterExecutionContext<C> CreateChild<C>(C input) where C : class
|
public FilterExecutionContext<C> CreateChild<C>(C input) where C : class
|
||||||
=> new FilterExecutionContext<C>(BotInfo, Update, input, Data, CompletedFilters);
|
=> new FilterExecutionContext<C>(UpdateRouter, BotInfo, Update, input, Data, CompletedFilters);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
namespace Telegrator.Core.Filters
|
namespace Telegrator.Core.Filters;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Interface for filters that have a name for identification and debugging purposes.
|
/// Interface for filters that have a name for identification and debugging purposes.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -36,4 +36,15 @@
|
|||||||
/// <returns>True if the filter passes; otherwise, false.</returns>
|
/// <returns>True if the filter passes; otherwise, false.</returns>
|
||||||
public bool CanPass(FilterExecutionContext<T> info);
|
public bool CanPass(FilterExecutionContext<T> info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Represents a filter that joins multiple filters together.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">The type of the input for the filter.</typeparam>
|
||||||
|
public interface IJoinedFilter<T> : IFilter<T> where T : class
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the array of joined filters.
|
||||||
|
/// </summary>
|
||||||
|
public IFilter<T>[] Filters { get; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
namespace Telegrator.Core.Filters
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Represents a filter that joins multiple filters together.
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="T">The type of the input for the filter.</typeparam>
|
|
||||||
public interface IJoinedFilter<T> : IFilter<T> where T : class
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the array of joined filters.
|
|
||||||
/// </summary>
|
|
||||||
public IFilter<T>[] Filters { get; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -3,10 +3,11 @@ using Telegram.Bot.Types;
|
|||||||
using Telegram.Bot.Types.Enums;
|
using Telegram.Bot.Types.Enums;
|
||||||
using Telegrator.Core.Descriptors;
|
using Telegrator.Core.Descriptors;
|
||||||
using Telegrator.Core.Filters;
|
using Telegrator.Core.Filters;
|
||||||
|
using Telegrator.Core.States;
|
||||||
using Telegrator.Handlers;
|
using Telegrator.Handlers;
|
||||||
|
|
||||||
namespace Telegrator.Core.Handlers
|
namespace Telegrator.Core.Handlers;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Abstract handler for Telegram updates of type <typeparamref name="TUpdate"/>.
|
/// Abstract handler for Telegram updates of type <typeparamref name="TUpdate"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -47,6 +48,11 @@ namespace Telegrator.Core.Handlers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
protected IAwaitingProvider AwaitingProvider => Container.AwaitingProvider;
|
protected IAwaitingProvider AwaitingProvider => Container.AwaitingProvider;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Storage of bot states.
|
||||||
|
/// </summary>
|
||||||
|
protected IStateStorage StateStorage => Container.StateStorage;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance and checks that the update type matches <typeparamref name="TUpdate"/>.
|
/// Initializes a new instance and checks that the update type matches <typeparamref name="TUpdate"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -87,4 +93,3 @@ namespace Telegrator.Core.Handlers
|
|||||||
/// <returns>A task representing the asynchronous operation.</returns>
|
/// <returns>A task representing the asynchronous operation.</returns>
|
||||||
public abstract Task<Result> Execute(IHandlerContainer<TUpdate> container, CancellationToken cancellation);
|
public abstract Task<Result> Execute(IHandlerContainer<TUpdate> container, CancellationToken cancellation);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ using Telegrator.Core.Descriptors;
|
|||||||
using Telegrator.Core.Filters;
|
using Telegrator.Core.Filters;
|
||||||
using Telegrator.Handlers;
|
using Telegrator.Handlers;
|
||||||
|
|
||||||
namespace Telegrator.Core.Handlers
|
namespace Telegrator.Core.Handlers;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Abstract base class for handlers that support branching execution based on different methods.
|
/// Abstract base class for handlers that support branching execution based on different methods.
|
||||||
/// Allows multiple handler methods to be defined in a single class, each with its own filters.
|
/// Allows multiple handler methods to be defined in a single class, each with its own filters.
|
||||||
@@ -162,4 +162,3 @@ namespace Telegrator.Core.Handlers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
using Telegram.Bot.Types;
|
using Telegram.Bot.Types;
|
||||||
using Telegram.Bot.Types.Enums;
|
using Telegram.Bot.Types.Enums;
|
||||||
using Telegrator.Annotations.StateKeeping;
|
|
||||||
using Telegrator.Core.Descriptors;
|
using Telegrator.Core.Descriptors;
|
||||||
using Telegrator.Core.Filters;
|
using Telegrator.Core.Filters;
|
||||||
using Telegrator.Core.StateKeeping;
|
using Telegrator.Core.States;
|
||||||
|
using Telegrator.Filters;
|
||||||
|
|
||||||
|
namespace Telegrator.Core.Handlers.Building;
|
||||||
|
|
||||||
namespace Telegrator.Core.Handlers.Building
|
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Base class for building handler descriptors and managing handler filters.
|
/// Base class for building handler descriptors and managing handler filters.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -140,35 +140,15 @@ namespace Telegrator.Core.Handlers.Building
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets a state keeper for the handler using a specific state and key resolver.
|
/// Sets a state keeper for the handler using a specific state and key resolver.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="TKey">The type of the key.</typeparam>
|
/// <typeparam name="TKey">The key resolver.</typeparam>
|
||||||
/// <typeparam name="TState">The type of the state.</typeparam>
|
/// <typeparam name="TValue">The state value.</typeparam>
|
||||||
/// <typeparam name="TKeeper">The type of the state keeper.</typeparam>
|
/// <param name="state">The state value.</param>
|
||||||
/// <param name="myState">The state value.</param>
|
|
||||||
/// <param name="keyResolver">The key resolver.</param>
|
|
||||||
/// <returns>The builder instance.</returns>
|
/// <returns>The builder instance.</returns>
|
||||||
public void SetStateKeeper<TKey, TState, TKeeper>(TState myState, IStateKeyResolver<TKey> keyResolver)
|
public void SetState<TKey, TValue>(TValue? state)
|
||||||
where TKey : notnull
|
where TKey : IStateKeyResolver, new()
|
||||||
where TState : IEquatable<TState>
|
where TValue : IEquatable<TValue>
|
||||||
where TKeeper : StateKeeperBase<TKey, TState>, new()
|
|
||||||
{
|
{
|
||||||
StateKeeper = new StateKeepFilter<TKey, TState, TKeeper>(myState, keyResolver);
|
StateKeeper = new StateKeyFilter<TKey, TValue>(state);
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Sets a state keeper for the handler using a special state and key resolver.
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="TKey">The type of the key.</typeparam>
|
|
||||||
/// <typeparam name="TState">The type of the state.</typeparam>
|
|
||||||
/// <typeparam name="TKeeper">The type of the state keeper.</typeparam>
|
|
||||||
/// <param name="specialState">The special state value.</param>
|
|
||||||
/// <param name="keyResolver">The key resolver.</param>
|
|
||||||
/// <returns>The builder instance.</returns>
|
|
||||||
public void SetStateKeeper<TKey, TState, TKeeper>(SpecialState specialState, IStateKeyResolver<TKey> keyResolver)
|
|
||||||
where TKey : notnull
|
|
||||||
where TState : IEquatable<TState>
|
|
||||||
where TKeeper : StateKeeperBase<TKey, TState>, new()
|
|
||||||
{
|
|
||||||
StateKeeper = new StateKeepFilter<TKey, TState, TKeeper>(specialState, keyResolver);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -197,4 +177,3 @@ namespace Telegrator.Core.Handlers.Building
|
|||||||
Filters.Add(compiledPollingFilter);
|
Filters.Add(compiledPollingFilter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
using Telegrator.Core.StateKeeping;
|
using Telegrator.Core.States;
|
||||||
|
|
||||||
|
namespace Telegrator.Core.Handlers.Building;
|
||||||
|
|
||||||
namespace Telegrator.Core.Handlers.Building
|
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Defines a builder for awaiting handler logic for a specific update type.
|
/// Defines a builder for awaiting handler logic for a specific update type.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -11,9 +11,8 @@ namespace Telegrator.Core.Handlers.Building
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Awaits an update using the specified key resolver and cancellation token.
|
/// Awaits an update using the specified key resolver and cancellation token.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="keyResolver">The <see cref="IStateKeyResolver{TKey}"/> to resolve the key.</param>
|
/// <param name="keyResolver">The <see cref="IStateKeyResolver"/> to resolve the key.</param>
|
||||||
/// <param name="cancellationToken">The cancellation token.</param>
|
/// <param name="cancellationToken">The cancellation token.</param>
|
||||||
/// <returns>A <see cref="Task{TUpdate}"/> representing the awaited update.</returns>
|
/// <returns>A <see cref="Task{TUpdate}"/> representing the awaited update.</returns>
|
||||||
public Task<TUpdate> Await(IStateKeyResolver<long> keyResolver, CancellationToken cancellationToken = default);
|
public Task<TUpdate> Await(IStateKeyResolver keyResolver, CancellationToken cancellationToken = default);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
using Telegram.Bot.Types;
|
using Telegram.Bot.Types;
|
||||||
using Telegrator.Annotations.StateKeeping;
|
|
||||||
using Telegrator.Core.Filters;
|
using Telegrator.Core.Filters;
|
||||||
using Telegrator.Core.StateKeeping;
|
using Telegrator.Core.States;
|
||||||
|
|
||||||
|
namespace Telegrator.Core.Handlers.Building;
|
||||||
|
|
||||||
namespace Telegrator.Core.Handlers.Building
|
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Defines builder actions for configuring handler builders.
|
/// Defines builder actions for configuring handler builders.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -56,30 +55,13 @@ namespace Telegrator.Core.Handlers.Building
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets a state keeper for the handler using a specific state and key resolver.
|
/// Sets a state keeper for the handler using a specific state and key resolver.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="TKey">The type of the key.</typeparam>
|
/// <typeparam name="TKey">The key resolver.</typeparam>
|
||||||
/// <typeparam name="TState">The type of the state.</typeparam>
|
/// <typeparam name="TValue">The state value.</typeparam>
|
||||||
/// <typeparam name="TKeeper">The type of the state keeper.</typeparam>
|
/// <param name="state">The state value.</param>
|
||||||
/// <param name="myState">The state value.</param>
|
|
||||||
/// <param name="keyResolver">The key resolver.</param>
|
|
||||||
/// <returns>The builder instance.</returns>
|
/// <returns>The builder instance.</returns>
|
||||||
public void SetStateKeeper<TKey, TState, TKeeper>(TState myState, IStateKeyResolver<TKey> keyResolver)
|
public void SetState<TKey, TValue>(TValue? state)
|
||||||
where TKey : notnull
|
where TKey : IStateKeyResolver, new()
|
||||||
where TState : IEquatable<TState>
|
where TValue : IEquatable<TValue>;
|
||||||
where TKeeper : StateKeeperBase<TKey, TState>, new();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Sets a state keeper for the handler using a special state and key resolver.
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="TKey">The type of the key.</typeparam>
|
|
||||||
/// <typeparam name="TState">The type of the state.</typeparam>
|
|
||||||
/// <typeparam name="TKeeper">The type of the state keeper.</typeparam>
|
|
||||||
/// <param name="specialState">The special state value.</param>
|
|
||||||
/// <param name="keyResolver">The key resolver.</param>
|
|
||||||
/// <returns>The builder instance.</returns>
|
|
||||||
public void SetStateKeeper<TKey, TState, TKeeper>(SpecialState specialState, IStateKeyResolver<TKey> keyResolver)
|
|
||||||
where TKey : notnull
|
|
||||||
where TState : IEquatable<TState>
|
|
||||||
where TKeeper : StateKeeperBase<TKey, TState>, new();
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Adds a targeted filter for a specific filter target type.
|
/// Adds a targeted filter for a specific filter target type.
|
||||||
@@ -101,4 +83,3 @@ namespace Telegrator.Core.Handlers.Building
|
|||||||
public void AddTargetedFilters<TFilterTarget>(Func<Update, TFilterTarget?> getFilterringTarget, params IFilter<TFilterTarget>[] filters)
|
public void AddTargetedFilters<TFilterTarget>(Func<Update, TFilterTarget?> getFilterringTarget, params IFilter<TFilterTarget>[] filters)
|
||||||
where TFilterTarget : class;
|
where TFilterTarget : class;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
using Telegrator.Handlers.Building;
|
using Telegrator.Handlers.Building;
|
||||||
|
|
||||||
namespace Telegrator.Core.Handlers.Building
|
namespace Telegrator.Core.Handlers.Building;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Defines a builder for regular handler logic for a specific update type.
|
/// Defines a builder for regular handler logic for a specific update type.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -14,4 +14,3 @@ namespace Telegrator.Core.Handlers.Building
|
|||||||
/// <param name="executeHandler">The delegate to execute the handler logic.</param>
|
/// <param name="executeHandler">The delegate to execute the handler logic.</param>
|
||||||
public IHandlersCollection Build(AbstractHandlerAction<TUpdate> executeHandler);
|
public IHandlersCollection Build(AbstractHandlerAction<TUpdate> executeHandler);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,80 +0,0 @@
|
|||||||
using Telegram.Bot.Types;
|
|
||||||
using Telegrator.Annotations.StateKeeping;
|
|
||||||
using Telegrator.Core.Filters;
|
|
||||||
using Telegrator.Core.StateKeeping;
|
|
||||||
using Telegrator.Filters;
|
|
||||||
|
|
||||||
namespace Telegrator.Core.Handlers.Building
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Filter for state keeping logic, allowing filtering based on state and special state conditions.
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="TKey">The type of the key for state resolution.</typeparam>
|
|
||||||
/// <typeparam name="TState">The type of the state.</typeparam>
|
|
||||||
/// <typeparam name="TKeeper">The type of the state keeper.</typeparam>
|
|
||||||
public class StateKeepFilter<TKey, TState, TKeeper> : Filter<Update>
|
|
||||||
where TKey : notnull
|
|
||||||
where TState : IEquatable<TState>
|
|
||||||
where TKeeper : StateKeeperBase<TKey, TState>, new()
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the state keeper instance.
|
|
||||||
/// </summary>
|
|
||||||
public static TKeeper StateKeeper { get; internal set; } = null!;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the state value for this filter.
|
|
||||||
/// </summary>
|
|
||||||
public TState MyState { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the special state value for this filter.
|
|
||||||
/// </summary>
|
|
||||||
public SpecialState SpecialState { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes a new instance of the <see cref="StateKeepFilter{TKey, TState, TKeeper}"/> class with a specific state.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="myState">The state value.</param>
|
|
||||||
/// <param name="keyResolver">The key resolver.</param>
|
|
||||||
public StateKeepFilter(TState myState, IStateKeyResolver<TKey> keyResolver)
|
|
||||||
{
|
|
||||||
StateKeeper ??= new TKeeper();
|
|
||||||
StateKeeper.KeyResolver = keyResolver;
|
|
||||||
MyState = myState;
|
|
||||||
SpecialState = SpecialState.None;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes a new instance of the <see cref="StateKeepFilter{TKey, TState, TKeeper}"/> class with a special state.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="specialState">The special state value.</param>
|
|
||||||
/// <param name="keyResolver">The key resolver.</param>
|
|
||||||
public StateKeepFilter(SpecialState specialState, IStateKeyResolver<TKey> keyResolver)
|
|
||||||
{
|
|
||||||
StateKeeper ??= new TKeeper();
|
|
||||||
StateKeeper.KeyResolver = keyResolver;
|
|
||||||
MyState = StateKeeper.DefaultState;
|
|
||||||
SpecialState = specialState;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Determines whether the filter can pass for the given context based on state logic.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context">The filter execution context.</param>
|
|
||||||
/// <returns>True if the filter passes; otherwise, false.</returns>
|
|
||||||
public override bool CanPass(FilterExecutionContext<Update> context)
|
|
||||||
{
|
|
||||||
if (SpecialState == SpecialState.AnyState)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if (!StateKeeper.TryGetState(context.Input, out TState? state))
|
|
||||||
return SpecialState == SpecialState.NoState;
|
|
||||||
|
|
||||||
if (state == null)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return MyState.Equals(state);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
using Telegram.Bot.Types;
|
using Telegram.Bot.Types;
|
||||||
using Telegrator.Core.Filters;
|
using Telegrator.Core.Filters;
|
||||||
|
|
||||||
namespace Telegrator.Core.Handlers.Building
|
namespace Telegrator.Core.Handlers.Building;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Delegate for validating an update in a filter context.
|
/// Delegate for validating an update in a filter context.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -38,4 +38,3 @@ namespace Telegrator.Core.Handlers.Building
|
|||||||
public bool CanPass(FilterExecutionContext<Update> info)
|
public bool CanPass(FilterExecutionContext<Update> info)
|
||||||
=> UpdateValidateAction.Invoke(info);
|
=> UpdateValidateAction.Invoke(info);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
using Telegram.Bot;
|
using Telegram.Bot;
|
||||||
using Telegram.Bot.Types;
|
using Telegram.Bot.Types;
|
||||||
using Telegrator.Core.Filters;
|
using Telegrator.Core.Filters;
|
||||||
|
using Telegrator.Core.States;
|
||||||
|
|
||||||
|
namespace Telegrator.Core.Handlers;
|
||||||
|
|
||||||
namespace Telegrator.Core.Handlers
|
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents an empty handler container that throws <see cref="NotImplementedException"/> for all members.
|
/// Represents an empty handler container that throws <see cref="NotImplementedException"/> for all members.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -23,5 +24,7 @@ namespace Telegrator.Core.Handlers
|
|||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public IAwaitingProvider AwaitingProvider => throw new NotImplementedException();
|
public IAwaitingProvider AwaitingProvider => throw new NotImplementedException();
|
||||||
}
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public IStateStorage StateStorage => throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
namespace Telegrator.Core.Handlers
|
namespace Telegrator.Core.Handlers;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents a token that tracks the lifetime of a handler instance.
|
/// Represents a token that tracks the lifetime of a handler instance.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -24,4 +24,3 @@
|
|||||||
OnLifetimeEnded?.Invoke(this);
|
OnLifetimeEnded?.Invoke(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
using Telegram.Bot;
|
using Telegram.Bot;
|
||||||
using Telegram.Bot.Types;
|
using Telegram.Bot.Types;
|
||||||
using Telegrator.Core.Filters;
|
using Telegrator.Core.Filters;
|
||||||
|
using Telegrator.Core.States;
|
||||||
|
|
||||||
|
namespace Telegrator.Core.Handlers;
|
||||||
|
|
||||||
namespace Telegrator.Core.Handlers
|
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Interface for handler containers that provide context and resources for update handlers.
|
/// Interface for handler containers that provide context and resources for update handlers.
|
||||||
/// Contains all necessary information and services that handlers need during execution.
|
/// Contains all necessary information and services that handlers need during execution.
|
||||||
@@ -34,5 +35,9 @@ namespace Telegrator.Core.Handlers
|
|||||||
/// Gets the <see cref="IAwaitingProvider"/> for awaiting operations.
|
/// Gets the <see cref="IAwaitingProvider"/> for awaiting operations.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public IAwaitingProvider AwaitingProvider { get; }
|
public IAwaitingProvider AwaitingProvider { get; }
|
||||||
}
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the <see cref="IStateStorage"/> for state managment.
|
||||||
|
/// </summary>
|
||||||
|
public IStateStorage StateStorage { get; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
using Telegrator.Core.Descriptors;
|
using Telegrator.Core.Descriptors;
|
||||||
|
|
||||||
namespace Telegrator.Core.Handlers
|
namespace Telegrator.Core.Handlers;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Factory interface for creating handler containers.
|
/// Factory interface for creating handler containers.
|
||||||
/// Provides a way to create handler containers with specific providers and handler information.
|
/// Provides a way to create handler containers with specific providers and handler information.
|
||||||
@@ -15,4 +15,3 @@ namespace Telegrator.Core.Handlers
|
|||||||
/// <returns>A new <see cref="IHandlerContainer"/> instance.</returns>
|
/// <returns>A new <see cref="IHandlerContainer"/> instance.</returns>
|
||||||
public IHandlerContainer CreateContainer(DescribedHandlerDescriptor handlerInfo);
|
public IHandlerContainer CreateContainer(DescribedHandlerDescriptor handlerInfo);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ using Telegram.Bot.Types.Enums;
|
|||||||
using Telegrator.Core.Descriptors;
|
using Telegrator.Core.Descriptors;
|
||||||
using Telegrator.Handlers.Diagnostics;
|
using Telegrator.Handlers.Diagnostics;
|
||||||
|
|
||||||
namespace Telegrator.Core.Handlers
|
namespace Telegrator.Core.Handlers;
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Base class for update handlers, providing execution and lifetime management for Telegram updates.
|
/// Base class for update handlers, providing execution and lifetime management for Telegram updates.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -125,7 +125,7 @@ namespace Telegrator.Core.Handlers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal IHandlerContainer GetContainer(DescribedHandlerDescriptor handlerInfo)
|
private IHandlerContainer GetContainer(DescribedHandlerDescriptor handlerInfo)
|
||||||
{
|
{
|
||||||
if (this is IHandlerContainerFactory handlerDefainedContainerFactory)
|
if (this is IHandlerContainerFactory handlerDefainedContainerFactory)
|
||||||
return handlerDefainedContainerFactory.CreateContainer(handlerInfo);
|
return handlerDefainedContainerFactory.CreateContainer(handlerInfo);
|
||||||
@@ -179,4 +179,3 @@ namespace Telegrator.Core.Handlers
|
|||||||
GC.SuppressFinalize(this);
|
GC.SuppressFinalize(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user