Skip to content

Scene

Scene mengisolasi logika percakapan bot ke dalam router independen. Saat pengguna masuk ke sebuah scene, hanya handler scene tersebut yang aktif — handler global dilewati.

Memulai Cepat

typescript
import { Bot, session, Scene, Stage } from 'vibegram';

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

// Definisikan scene
const pengaturanScene = new Scene('pengaturan');

pengaturanScene.command('tema', ctx => ctx.reply('Pilih tema: terang atau gelap?'));
pengaturanScene.hears('kembali', ctx => {
    ctx.reply('Keluar dari pengaturan.');
    ctx.scene?.leave();
});
pengaturanScene.on('message', ctx =>
    ctx.reply('Anda berada di pengaturan. Ketik "kembali" untuk keluar.')
);

// Daftarkan dan aktifkan
const stage = new Stage([pengaturanScene]);
bot.use(stage.middleware());

// Masuk ke scene
bot.command('pengaturan', ctx => ctx.scene?.enter('pengaturan'));

API Scene

MetodeDeskripsi
ctx.scene?.enter(nama)Masuk ke scene berdasarkan nama
ctx.scene?.leave()Keluar dari scene saat ini

Cara Kerja

  1. Saat ctx.scene?.enter('nama') dipanggil, session mencatat scene aktif
  2. Pada update berikutnya, Stage middleware mengecek apakah pengguna di dalam scene
  3. Jika ya, hanya handler scene tersebut yang berjalan — handler global dilewati
  4. Saat ctx.scene?.leave() dipanggil, routing normal dilanjutkan

Beberapa Scene

typescript
const faqScene = new Scene('faq');
faqScene.on('message', ctx => ctx.reply('FAQ: Ajukan pertanyaan atau ketik "kembali".'));
faqScene.hears('kembali', ctx => ctx.scene?.leave());

const kontakScene = new Scene('kontak');
kontakScene.on('message', ctx => ctx.reply('Kontak: Kirim pesan atau ketik "kembali".'));
kontakScene.hears('kembali', ctx => ctx.scene?.leave());

const stage = new Stage([faqScene, kontakScene]);
bot.use(stage.middleware());

bot.command('faq', ctx => ctx.scene?.enter('faq'));
bot.command('kontak', ctx => ctx.scene?.enter('kontak'));

Skenario Praktis: Menu Utama

typescript
const menuScene = new Scene('menu');

menuScene.action('produk', ctx => ctx.scene?.enter('produk'));
menuScene.action('profil', ctx => ctx.scene?.enter('profil'));
menuScene.hears('exit', ctx => {
    ctx.scene?.leave();
    ctx.reply('Kembali ke menu utama.');
});

bot.command('menu', async ctx => {
    await ctx.reply('📋 Menu Utama:', {
        reply_markup: Markup.inlineKeyboard([
            [Markup.button.callback('🛒 Produk', 'produk')],
            [Markup.button.callback('👤 Profil', 'profil')],
        ])
    });
    ctx.scene?.enter('menu');
});

Urutan Middleware

Daftarkan bot.use(session()) sebelum bot.use(stage.middleware()) — Stage bergantung pada data session.

Released under the ISC License.