گام پنجم: آمادهسازی آپدیت هندلر
برای اینکه آپدیت هندلر نسبت به آپدیتهای متفاوتی که از سرور بله دریافت میکند، عکسالعمل مناسب را داشته باشد نیاز است تا آن را کمی گسترش دهیم.
در این مرحله به چند نکته توجه میکنیم. -1. طبق مستندات رسمی بله، هر آپدیت امکان دارد یکی از 4 نوع زیر باشد: -1-الف. Message -1-ب. EditedMessage -1-ج. CallbackQuery -1-د. PreCheckoutQuery
پس نیاز است برای هر کدام از این 4 نوع متد مخصوصش را آماده کنیم.
-2. با توجه به لایف سایکل هر درخواست و سرویسهای خدمات دهنده به آن نیاز است از طریق IServiceScopeFactory یک scope جدید برای هر آپدیت بسازیم.
-3. امکان دارد در منطق تجاری پروژه، نیاز باشد برای جلوگیری از تکرار درخواستها شناسه منحصر به فرد هر آپدیت را در اختیار داشته باشیم.
پس با توجه به این 3 مورد، فایل Services\Bot\BotUpdateHandler.cs را به شکل زیر توسعه دهیم:
در ادامه با یک مثال سعی میکنیم کارکرد واقعی بات خود را عملیاتی کنیم.
فهرست آموزش@BaleBotNet | کلاینت داتنت بازوی بله
برای اینکه آپدیت هندلر نسبت به آپدیتهای متفاوتی که از سرور بله دریافت میکند، عکسالعمل مناسب را داشته باشد نیاز است تا آن را کمی گسترش دهیم.
در این مرحله به چند نکته توجه میکنیم. -1. طبق مستندات رسمی بله، هر آپدیت امکان دارد یکی از 4 نوع زیر باشد: -1-الف. Message -1-ب. EditedMessage -1-ج. CallbackQuery -1-د. PreCheckoutQuery
پس نیاز است برای هر کدام از این 4 نوع متد مخصوصش را آماده کنیم.
-2. با توجه به لایف سایکل هر درخواست و سرویسهای خدمات دهنده به آن نیاز است از طریق IServiceScopeFactory یک scope جدید برای هر آپدیت بسازیم.
-3. امکان دارد در منطق تجاری پروژه، نیاز باشد برای جلوگیری از تکرار درخواستها شناسه منحصر به فرد هر آپدیت را در اختیار داشته باشیم.
پس با توجه به این 3 مورد، فایل Services\Bot\BotUpdateHandler.cs را به شکل زیر توسعه دهیم:
using BaleBotNet;
using BaleBotNet.Types;
namespace MyBaleBot.Services.Bot;
public class BotUpdateHandler(IServiceScopeFactory scopeFactory) : IUpdateHandler
{
public async Task HandleUpdate(Update update, CancellationToken cancellationToken = default)
{
// Console.WriteLine($"Update #{update.UpdateId} recived!");
using var scope = scopeFactory.CreateScope();
var updateId = update.UpdateId;
var handler = update switch
{
{ Message: { } } => OnMessage(scope, updateId, update.Message),
{ EditedMessage: { } } => OnEditedMessage(scope, updateId, update.EditedMessage),
{ CallbackQuery: { } } => OnCallback(scope, updateId, update.CallbackQuery),
{ PreCheckoutQuery: { } } => OnPreCheckout(scope, updateId, update.PreCheckoutQuery),
_ => Task.CompletedTask
};
await handler;
}
private static async Task OnMessage(IServiceScope scope, int updateId, Message message)
{
Task? task = null;
task ??= Task.CompletedTask;
await task;
}
private static async Task OnCallback(IServiceScope scope, int updateId, CallbackQuery query)
{
Task? task = null;
task ??= Task.CompletedTask;
await task;
}
private static async Task OnEditedMessage(IServiceScope scope, int updateId, Message message)
{
Task? task = null;
task ??= Task.CompletedTask;
await task;
}
private static async Task OnPreCheckout(
IServiceScope scope,
int updateId,
PreCheckoutQuery query
)
{
Task? task = null;
task ??= Task.CompletedTask;
await task;
}
}
در ادامه با یک مثال سعی میکنیم کارکرد واقعی بات خود را عملیاتی کنیم.
فهرست آموزش@BaleBotNet | کلاینت داتنت بازوی بله
۱۵:۵۹