Skip to content

Session

Session memungkinkan bot menyimpan data per-pengguna yang persisten di antara update. VibeGram menggunakan pola adapter sehingga Anda bisa menyimpan session di memori, Redis, MongoDB, atau penyimpanan lainnya.

Setup Dasar

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

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

// Pasang session dengan nilai awal
bot.use(session({
    initial: () => ({ count: 0, bahasa: 'id' })
}));

bot.command('hitung', async (ctx) => {
    ctx.session.count++;
    await ctx.reply(`Anda telah mengirim ${ctx.session.count} pesan.`);
});

Session Bertipe (TypeScript)

Definisikan interface untuk session Anda:

typescript
interface SessionData {
    count: number;
    bahasa: string;
    keranjang: string[];
    lastSeen?: Date;
}

bot.use(session<SessionData>({
    initial: () => ({
        count: 0,
        bahasa: 'id',
        keranjang: []
    })
}));

// ctx.session.count dikenali sebagai `number`
// ctx.session.keranjang dikenali sebagai `string[]`

Opsi Konfigurasi

typescript
bot.use(session({
    // Nilai awal untuk session baru
    initial: () => ({ count: 0 }),

    // Kunci session kustom (default: `${chatId}:${fromId}`)
    getSessionKey: (ctx) => {
        return ctx.from?.id?.toString(); // per-pengguna global
    },

    // Adapter penyimpanan kustom (default: MemorySessionStore)
    store: myCustomStore,
}));

MemorySessionStore (Bawaan)

VibeGram menggunakan MemorySessionStore secara default dengan:

  • TTL: 24 jam (dapat dikonfigurasi)
  • Eviksi LRU: Hapus entri terlama saat kapasitas penuh (default: 10.000)
typescript
import { MemorySessionStore } from 'vibegram';

const store = new MemorySessionStore(
    3600_000,  // TTL: 1 jam (dalam ms)
    5000       // Maksimal 5.000 session
);

bot.use(session({ store }));

Adapter Redis

Untuk lingkungan produksi, gunakan Redis agar session persisten saat restart:

typescript
import Redis from 'ioredis';
import { createRedisStore } from './examples/redis-session';

const redis = new Redis(process.env.REDIS_URL!);

bot.use(session({
    store: createRedisStore(redis, { ttlSeconds: 7 * 24 * 3600 }), // 7 hari
    initial: () => ({ count: 0 }),
}));

Menghapus Session

Set session ke null untuk menghapus data pengguna:

typescript
bot.command('reset', async (ctx) => {
    ctx.session = null as any; // hapus dari store
    await ctx.reply('Session direset! ♻️');
});

Kunci Session Kustom

Secara default, kunci session adalah ${chatId}:${fromId}. Ubah ini jika perlu:

typescript
// Session per-pengguna (dibagikan di semua chat)
bot.use(session({
    getSessionKey: (ctx) => ctx.from?.id?.toString(),
}));

// Session per-chat (dibagikan di semua anggota)
bot.use(session({
    getSessionKey: (ctx) => ctx.chat?.id?.toString(),
}));

Membuat Adapter Kustom

Implementasikan interface SessionStore:

typescript
import type { SessionStore } from 'vibegram';

class MongoSessionStore implements SessionStore {
    private collection: any;

    constructor(collection: any) {
        this.collection = collection;
    }

    async get(key: string) {
        const doc = await this.collection.findOne({ _id: key });
        return doc?.data ?? undefined;
    }

    async set(key: string, value: any) {
        await this.collection.updateOne(
            { _id: key },
            { $set: { data: value, updatedAt: new Date() } },
            { upsert: true }
        );
    }

    async delete(key: string) {
        await this.collection.deleteOne({ _id: key });
    }
}

Released under the ISC License.