Skip to content

Queue & Broadcasting

Use case queue

Gunakan queue saat pekerjaan perlu rate limit, retry, atau dipisahkan dari update masuk.

Broadcasting

Kirim pesan ke banyak user tanpa menyentuh rate limit Telegram.

Background job

Tunda pekerjaan non-kritis di luar update handler.

Retry

Tangani kegagalan Telegram atau network sementara secara terprediksi.

BotQueue menyediakan broadcasting massal dengan rate-limiting dan penjadwalan tugas — penting bagi bot yang perlu mengirim pesan ke ribuan pengguna tanpa menyentuh batas Telegram.

Memulai Cepat

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

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

const queue = new BotQueue(bot.client, {
    concurrency: 25, // 25 pesan per batch
    delayMs: 1000, // 1 detik antar batch
});

Broadcasting

Kirim ke Banyak Pengguna

typescript
const userIds = [123456, 789012, 345678 /* ...ribuan */];

const hasil = await queue.broadcastMessage(userIds, '📢 Pengumuman penting!', {
    parse_mode: 'HTML',
});

console.log(`✅ ${hasil.success} terkirim, ❌ ${hasil.failed} gagal, ⏱️ ${hasil.durationMs}ms`);

Logika Broadcast Kustom

typescript
const hasil = await queue.broadcast(userIds, async chatId => {
    await bot.callApi('sendPhoto', {
        chat_id: chatId,
        photo: 'https://contoh.com/promo.jpg',
        caption: '🎉 Promo spesial hari ini!',
    });
});

Pelacakan Progres

typescript
const queue = new BotQueue(bot.client, {
    concurrency: 30,
    delayMs: 1000,
    onProgress: (selesai, total) => {
        const persen = Math.round((selesai / total) * 100);
        console.log(`Progres: ${selesai}/${total} (${persen}%)`);
    },
    onError: (err, chatId) => {
        console.error(`Gagal untuk chat ${chatId}: ${err.message}`);
    },
});

Hasil Broadcast

typescript
interface BroadcastResult {
    total: number; // Total penerima
    success: number; // Berhasil dikirim
    failed: number; // Gagal dikirim
    errors: Array<{
        // Daftar error detail
        chatId: number | string;
        error: Error;
    }>;
    durationMs: number; // Waktu total
}

Penjadwalan

Job Berulang

typescript
// Jalankan setiap 60 detik
queue.scheduleInterval('tip_harian', 60_000, async () => {
    await bot.callApi('sendMessage', {
        chat_id: '@channel_saya',
        text: '💡 Tips hari ini: Minum air yang cukup!',
    });
});

Job Sekali Eksekusi

typescript
// Jalankan sekali setelah 5 menit
queue.scheduleOnce('pengingat', 5 * 60_000, async () => {
    await bot.callApi('sendMessage', {
        chat_id: userId,
        text: '⏰ Pengingat: Sesi Anda akan segera berakhir!',
    });
});

Batalkan Job

typescript
queue.cancelScheduled('tip_harian'); // Batalkan berdasarkan ID
queue.cancelAllScheduled(); // Batalkan semua job

Referensi API

MetodeDeskripsi
queue.broadcast(ids, fn, opts?)Broadcast kustom dengan rate limiting
queue.broadcastMessage(ids, text, extra?)Kirim teks ke banyak pengguna
queue.scheduleInterval(id, ms, fn)Job berulang berkala
queue.scheduleOnce(id, ms, fn)Job sekali dengan delay
queue.cancelScheduled(id)Batalkan job berdasarkan ID
queue.cancelAllScheduled()Batalkan semua job
queue.stopBroadcast()Hentikan broadcast yang sedang berjalan
queue.activeJobsJumlah job aktif

Strategi Rate Limit

Queue memproses pesan dalam batch:

  1. Kirim concurrency pesan secara bersamaan (default: 25)
  2. Tunggu delayMs milidetik (default: 1000)
  3. Ulangi hingga semua pesan terkirim

Ini tetap di bawah batas Telegram ~30 pesan/detik, mencegah error 429.

WARNING

Selalu tangani onError di produksi — pengguna mungkin memblokir bot, chat mungkin sudah dihapus. Gagal kirim adalah hal normal dalam skala besar.

Released under the ISC License.