پرش به مطلب اصلی

کلاس Update – کانتکست مدیریت رویدادها

کلاس Update نمایان‌گر context مربوط به پیام‌های اینلاین (inline) دریافت‌شده از روبیکاست. این کلاس به‌صورت خودکار توسط rubika هنگام دریافت رویداد "update" ساخته شده و به هندلر پاس داده می‌شود.

ویژگی‌های کلاس (Properties)

ویژگینوعتوضیحات
typeUpdateTypeEnumنوع رویداد دریافتی (مثلاً NewMessage, DeletedMessage)
chat_idstringشناسه یکتای چت، گروه یا کانال
new_message?Messageآبجکت پیام جدید (در صورت وجود)
updated_message?Messageآبجکت اپدیت پیام (در صورت وجود)
removed_message_id?stringشناسه پیام حذف شده
updated_payment?PaymentStatusوضعیت پرداخت (برای رویدادهای مالی)
storeRecord<string, any>حافظه موقت برای ذخیره داده‌های دلخواه در طول چرخه حیات درخواست
botBotدسترسی مستقیم به نمونه ربات برای فراخوانی متدهای سطح پایین

متدهای پاسخ‌دهی (Reply Methods)

تمامی این متدها به‌صورت خودکار به پیام کاربر Reply می‌دهند (پاسخ متصل).

reply(text, ...options)

ارسال پیام متنی ساده به عنوان پاسخ.

await ctx.reply("سلام! پیام شما دریافت شد.");

replyImage(file, text? , ...options)

ارسال عکس همراه با کپشن.

await ctx.replyImage("path/to/file");

replyVideo(file, text? , ...options)

ارسال ویدیو همراه با کپشن.

await ctx.replyVideo("path/to/file", "این یک ویدیو است.");

replyGif(file, text? , ...options)

ارسال گیف همراه با کپشن.

await ctx.replyGif("path/to/file");

replySticker(sticker_id, ...options)

ارسال استیکر با شناسه اختصاصی.

await ctx.replySticker("sticker_12345");

replyMusic / replyVoice(file, text? , ...options)

ارسال فایل صوتی (موزیک) یا ویس (پیام صوتی).

await ctx.replyMusic("path/to/file", "این یک آهنگ است.");
await ctx.replyVoice("path/to/file");

replyFile(file, text? , ...options)

ارسال هر نوع فایل عمومی (سند، PDF، ZIP و...).

await ctx.replyFile("path/to/file");

replyLocation(latitude, longitude, ...options)

ارسال موقعیت مکانی روی نقشه.

await ctx.replyLocation("35.6997", "51.3380"); // تهران

replyContact(firstName, lastName, phone, ...options)

ارسال کارت تماس (Contact).

await ctx.replyContact("هادی", "رستمی", "989123456789");

replyPoll(question, options, auto_delete?)

ارسال نظرسنجی (Poll) به چت.

await ctx.replyPoll("کدام فریم‌ورک بهتر است؟", ["React", "Vue", "Svelte"]);

⚠ نکته: تمام متدهای بالا از پارامترهای مشترکی مثل chat_keypad (دکمه‌های شیشه‌ای کیبورد)، inline_keypad (دکمه‌های زیر پیام)، disable_notification (بی‌صدا ارسال کردن) و auto_delete (حذف خودکار پس از زمان مشخص) پشتیبانی می‌کنند.

متدهای مدیریت پیام و چت


forward(to_chat_id: string)

فوروارد کردن پیام فعلی به چت دیگر.

await ctx.forward("b0..."); // ارسال به چت ادمین

delete(message_id?)

حذف پیام (پیش‌فرض: پیامی که ربات به آن پاسخ می‌دهد).

await ctx.delete(); // حذف پیام فعلی
await ctx.delete("message_id"); // حذف پیام دیگر

editMessage(text?, inline_keypad?)

ویرایش متن یا کیبورد پیام ارسالی ربات.

await ctx.editMessage("✅ متن ویرایش شد!", myInlineKeypad);

banUser(userId?) / unbanUser(userId?)

بن یا آنبن کردن کاربر در چت. اگر userId پاس داده نشود، فرستنده پیام فعلی مد نظر قرار می‌گیرد.

// بن کردن کاربر مزاحم
if (isSpam) {
await ctx.banUser();
}

ویژگی‌های خاص

حافظه موقت (store)

می‌توانید داده‌های موقت را در طول پردازش یک درخواست در ctx.store ذخیره کنید تا در فیلترهای بعدی قابل دسترسی باشند.

// Filter اول
ctx.store.userData = await db.getUser(ctx.new_message.sender_id);

// Filter دوم
const user = ctx.store.userData;

دسترسی مستقیم به Bot

از طریق ctx.bot به تمام متدهای اصلی ربات دسترسی دارید:

const botInfo = await ctx.bot.getMe();

نمونه استفاده کامل

import Bot, { Filters } from "rubika/bot";

const bot = new Bot("YOUR_TOKEN");

bot.on("update", [Filters.isPrivate], async (ctx) => {
// 1. استفاده از store برای کش کردن داده‌ها
ctx.store.user = await fetchUser(ctx.new_message.sender_id);

if (!ctx.store.user) {
return await ctx.reply("❌ کاربر یافت نشد.");
}

// 2. پاسخ متنی با کیبورد
await ctx.reply("👋 سلام! چه کمکی از دستم برمی‌آید؟", {
keyboard: [["📁 فایل‌ها", "👤 پروفایل"], ["❌ بستن"]],
is_persistent: false,
});

// 3. مدیریت دستورات
if (ctx.new_message.text === "/start") {
await ctx.replyImage(
"به ربات خوش آمدید!",
"welcome.jpg",
undefined, // chat_keypad
undefined, // inline_keypad
true, // disable_notification
);
}

// 4. فوروارد پیام‌های مهم به ادمین
if (ctx.new_message.text.includes("پشتیبانی")) {
await ctx.forward("ADMIN_CHAT_ID");
await ctx.reply("✅ درخواست شما به پشتیبانی ارسال شد.");
}
});

bot.run();

نکته حرفه‌ای: متد reply و سایر متدهای مشابه، به‌صورت هوشمند تشخیص می‌دهند که آیا پیام ورودی دارای message_id معتبر است یا خیر. اگر پیام نامعتبر باشد، به‌جای کرش کردن، خطا را از طریق bot.logger ثبت می‌کنند که باعث پایداری بیشتر ربات در محیط Production می‌شود.