Skip to content

Sistem Plugin

Komposisi plugin

Kemas middleware, command, handler, dan lifecycle hook menjadi unit reusable.

Install plugin

Mount plugin class atau function melalui `bot.plugin()`.

Fitur reusable

Bagikan analytics, auth, logging, atau behavior domain antar bot.

Opsi bertipe

Jaga konfigurasi plugin tetap eksplisit dan mudah divalidasi.

Sistem plugin VibeGram memungkinkan komposisi fitur secara modular. Plugin mengenkapsulasi middleware, command, dan handler menjadi unit yang bisa digunakan ulang dan diinstal.

Memulai Cepat

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

// Plugin berbasis kelas
class WelcomePlugin implements BotPlugin {
    name = 'welcome';

    install(bot) {
        bot.command('selamat', ctx => ctx.reply('Selamat datang!'));
        bot.command('halo', ctx => ctx.reply('Halo! Ada yang bisa saya bantu?'));
    }
}

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

Interface Plugin

typescript
interface BotPlugin<C extends Context = Context> {
    name: string;
    install(composer: Composer<C>, options?: any): void;
}

Plugin Fungsional

Gunakan createPlugin() untuk plugin yang lebih sederhana dan bisa dikonfigurasi:

typescript
import { createPlugin } from 'vibegram';

const salamPlugin = createPlugin('salam', (bot, opts: { pesan: string }) => {
    bot.command('salam', ctx => ctx.reply(opts.pesan));
    bot.hears(/halo/i, ctx => ctx.reply(opts.pesan));
});

// Install dengan opsi
bot.plugin(salamPlugin({ pesan: 'Halo dari plugin salam!' }));

Preset

Gabungkan beberapa plugin menjadi satu preset yang bisa diinstal sekaligus:

typescript
import { Preset } from 'vibegram';

const produksiPreset = new Preset('produksi', [
    new LoggerPlugin(),
    new RateLimitPlugin({ limit: 30 }),
    new SessionPlugin(),
    new CachePlugin({ ttl: 300 }),
]);

bot.plugin(produksiPreset);

Membuat Plugin yang Bisa Digunakan Ulang

typescript
// analytics-plugin.ts
import { BotPlugin, Composer, Context } from 'vibegram';

export class AnalyticsPlugin implements BotPlugin {
    name = 'analytics';

    constructor(private webhookUrl: string) {}

    install(bot: Composer<Context>) {
        bot.use(async (ctx, next) => {
            const mulai = Date.now();
            await next();
            const durasi = Date.now() - mulai;

            // Kirim data ke layanan analytics Anda
            fetch(this.webhookUrl, {
                method: 'POST',
                body: JSON.stringify({
                    jenisUpdate: Object.keys(ctx.update).filter(k => k !== 'update_id'),
                    userId: ctx.from?.id,
                    durasi,
                }),
            }).catch(() => {});
        });
    }
}

// Penggunaan
bot.plugin(new AnalyticsPlugin('https://analytics.contoh.com/events'));

Plugin vs Middleware

FiturMiddlewarePlugin
CakupanSatu fungsiKumpulan middleware + command
KonfigurasiClosure/opsiKonstruktor atau factory
ReusabilitasCopy/pasteImport dan install
KomposisiManualPreset menggabungkan otomatis
PublikasiN/ABisa dipublikasikan sebagai paket npm

TIP

Plugin yang baik terdiri dari: middleware, handler command yang relevan, dan state inisialisasi. Hindari membuat plugin yang terlalu besar — satu plugin = satu fitur.

Released under the ISC License.