Skip to content

Rate Limiter

Middleware rateLimit melindungi bot Anda dari spam dan penyalahgunaan dengan membatasi berapa banyak pesan yang bisa diterima dari satu pengguna atau chat dalam jangka waktu tertentu.

Penggunaan Dasar

typescript
import { Bot, rateLimit } from 'vibegram';

const bot = new Bot(process.env.BOT_TOKEN!);

// Auto-tuned sesuai batas Telegram:
// - Chat privat: 1 pesan/detik
// - Chat grup: 20 pesan/menit
bot.use(rateLimit());

Konfigurasi Kustom

typescript
bot.use(rateLimit({
    // Jendela waktu dalam milidetik
    windowMs: 60_000,  // 1 menit

    // Maksimal request per jendela waktu
    limit: 10,

    // Callback saat limit terlampaui (opsional)
    onLimitExceeded: async (ctx) => {
        await ctx.reply('⚠️ Terlalu banyak permintaan! Tunggu sebentar.');
    },

    // Generator kunci kustom (opsional)
    keyGenerator: (ctx) => {
        // Batasi berdasarkan user saja (bukan chat:user)
        return ctx.from?.id?.toString();
    },
}));

Opsi Konfigurasi

OpsiTipeDefaultDeskripsi
windowMsnumber60_000Durasi jendela waktu (ms)
limitnumber20 (grup) / 60 (privat)Maksimal request per jendela
onLimitExceededFunctionundefinedCallback saat terlimit
keyGeneratorFunction'chatId_fromId'Fungsi pembuat kunci

Perilaku Default

VibeGram menggunakan limit berbeda berdasarkan tipe chat sesuai panduan resmi Telegram:

Tipe ChatDefault LimitJendela
Chat privat60 pesan1 menit
Grup/Supergroup20 pesan1 menit
Channel20 pesan1 menit

Penanganan Saat Terlimit

Tanpa callback onLimitExceeded, request yang melebihi limit akan diabaikan diam-diam (next() tidak dipanggil). Tambahkan callback untuk memberi notifikasi ke pengguna:

typescript
bot.use(rateLimit({
    limit: 5,
    windowMs: 30_000,
    onLimitExceeded: async (ctx) => {
        // Hanya kirim pemberitahuan sekali setiap 30 detik
        await ctx.reply(
            '🚫 Anda mengirim pesan terlalu cepat.\n' +
            'Tunggu 30 detik sebelum melanjutkan.'
        );
    },
}));

Kunci Generator Kustom

typescript
// Batasi berdasarkan pengguna di semua chat
bot.use(rateLimit({
    keyGenerator: ctx => `user_${ctx.from?.id}`,
}));

// Batasi berdasarkan chat saja (semua anggota berbagi limit)
bot.use(rateLimit({
    keyGenerator: ctx => `chat_${ctx.chat?.id}`,
}));

Integrasi dengan Logger

Middleware log yang dipasang sebelum rateLimit akan menerima semua request termasuk yang ditolak:

typescript
bot.use(logger());       // Log semua request
bot.use(rateLimit());    // Tolak yang melebihi limit
// Handler hanya menerima request yang lolos

Released under the ISC License.