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

کلاس AntiSpam – سیستم تشخیص و جلوگیری از اسپم

کلاس AntiSpam ابزاری برای مدیریت و جلوگیری از پیام‌های تکراری (Flood) در ربات است. این کلاس با رصد تعداد پیام‌های ارسالی هر کاربر در یک بازه زمانی مشخص، رفتارهای مشکوک را شناسایی کرده و تابع/callback تعریف شده را اجرا می‌کند.

وابستگی‌ها:

  • Update: کانتکست پیام دریافتی
  • OptionSpamType: اینترفیس تنظیمات اسپم
  • SpamCallbackType: اینترفیس تابع واکنش به اسپم

تنظیمات سازنده (Constructor)

هنگام ساخت نمونه‌ای از این کلاس، باید دو آرگومان را پاس دهید:

توضیحاتنوعپارامتر
تابعی که هنگام تشخیص اسپم اجرا می‌شود (مثلاً برای بن کردن یا حذف پیام).FunctionspamCallback
شیء تنظیمات شامل زمان و محدودیت تعداد پیام.Objectoptions

گزینه‌های options:

  • spam_time (عدد): بازه زمانی بر حسب میلی‌ثانیه (پیش‌فرض: 5000).
  • spam_limit (عدد): حداکثر تعداد پیام مجاز در بازه زمانی فوق (پیش‌فرض: 4).

متدها

checkSpam(ctx: Update): Promise<void>

این متد باید روی هر پیام ورودی صدا زده شود. وضعیت پیام را بررسی کرده و در صورت تشخیص اسپم، کال‌بک را فراخوانی می‌کند.

منطق عملکرد:

  1. بررسی می‌کند که پیام جدید باشد (new_message).
  2. شناسه فرستنده و چت را استخراج می‌کند.
  3. زمان ارسال پیام را در کش ذخیره می‌کند.
  4. پیام‌های قدیمی‌تر از spam_time را از حافظه پاک می‌کند.
  5. اگر تعداد پیام‌های باقی‌مانده از spam_limit بیشتر شد، اسپم تشخیص داده می‌شود.

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

در این مثال، ما یک سیستم ضد اسپم راه‌اندازی می‌کنیم که اگر کاربری بیش از ۴ پیام در ۵ ثانیه ارسال کرد، ربات واکنش نشان می‌دهد.

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

const bot = new Bot("YOUR_TOKEN");

// تنظیمات ضد اسپم
const antiSpam = new AntiSpam(
async (ctx) => {
// این تابع هنگام تشخیص اسپم اجرا می‌شود
console.log(`Spam detected from user: ${ctx.new_message?.sender_id}`);
await ctx.reply("⛔ ارسال پیام سریع ممنوع است!");
// اقدامات دیگر مثل حذف پیام یا بن کردن کاربر
},
{
spam_time: 5000, // ۵ ثانیه
spam_limit: 4, // حداکثر ۴ پیام
},
);

// استفاده در هندلر پیام
bot.on("update", async (ctx) => {
// بررسی اسپم قبل از پردازش اصلی
await antiSpam.checkSpam(ctx);

// ادامه پردازش‌های عادی ربات...
console.log("Message processed");
});

bot.run();