Telegraf Session local
Middleware for locally stored sessions & database
⚡️ Features
-
Any type of storage:
Memory
,FileSync
,FileAsync
, ... (implement your own) -
Any format you want:
JSON
,BSON
,YAML
,XML
, ... (implement your own) -
Shipped together with power of
lodash
-
Supports basic DB-like operations (thanks to lodash-id):
getById
,insert
,upsert
,updateById
,updateWhere
,replaceById
,removeById
,removeWhere
,createId
,
🚀 Installation
$ npm install -S telegraf-session-local
💡 TIP: We recommendpnpm
package manager:npm i -g pnpm
and thenpnpm i -S telegraf-session-local
.
It's in-place replacement fornpm
, faster and better thannpm
/yarn
, and saves your disk space.
📚 Documentation & API
👀 Quick-start example
const { Telegraf } = require('telegraf')
const LocalSession = require('telegraf-session-local')
const bot = new Telegraf(process.env.BOT_TOKEN) // Your Bot token here
bot.use((new LocalSession({ database: 'example_db.json' })).middleware())
bot.on('text', (ctx, next) => {
ctx.session.counter = ctx.session.counter || 0
ctx.session.counter++
ctx.replyWithMarkdown(`Counter updated, new value: \`${ctx.session.counter}\``)
return next()
})
bot.command('/stats', (ctx) => {
ctx.replyWithMarkdown(`Database has \`${ctx.session.counter}\` messages from @${ctx.from.username || ctx.from.id}`)
})
bot.command('/remove', (ctx) => {
ctx.replyWithMarkdown(`Removing session from database: \`${JSON.stringify(ctx.session)}\``)
// Setting session to null, undefined or empty object/array will trigger removing it from database
ctx.session = null
})
bot.launch()
📄 Full example
const { Telegraf } = require('telegraf')
const LocalSession = require('telegraf-session-local')
const bot = new Telegraf(process.env.BOT_TOKEN) // Your Bot token here
// Name of session property object in Telegraf Context (default: 'session')
const property = 'data'
const localSession = new LocalSession({
// Database name/path, where sessions will be located (default: 'sessions.json')
database: 'example_db.json',
// Name of session property object in Telegraf Context (default: 'session')
property: 'session',
// Type of lowdb storage (default: 'storageFileSync')
storage: LocalSession.storageFileAsync,
// Format of storage/database (default: JSON.stringify / JSON.parse)
format: {
serialize: (obj) => JSON.stringify(obj, null, 2), // null & 2 for pretty-formatted JSON
deserialize: (str) => JSON.parse(str),
},
// We will use `messages` array in our database to store user messages using exported lowdb instance from LocalSession via Telegraf Context
state: { messages: [] }
})
// Wait for database async initialization finished (storageFileAsync or your own asynchronous storage adapter)
localSession.DB.then(DB => {
// Database now initialized, so now you can retrieve anything you want from it
console.log('Current LocalSession DB:', DB.value())
// console.log(DB.get('sessions').getById('1:1').value())
})
// Telegraf will use `telegraf-session-local` configured above middleware with overrided `property` value: `data`, instead of `session`
bot.use(localSession.middleware(property))
bot.on('text', (ctx, next) => {
ctx[property].counter = ctx[property].counter || 0
ctx[property].counter++
ctx.replyWithMarkdown(`Counter updated, new value: \`${ctx[property].counter}\``)
// Writing message to Array `messages` into database which already has sessions Array
ctx[property + 'DB'].get('messages').push([ctx.message]).write()
// `property`+'DB' is a name of property which contains lowdb instance, default = `sessionDB`, in current example = `dataDB`
// ctx.dataDB.get('messages').push([ctx.message]).write()
return next()
})
bot.command('/stats', (ctx) => {
let msg = `Using session object from [Telegraf Context](http://telegraf.js.org/context.html) (\`ctx\`), named \`${property}\`\n`
msg += `Database has \`${ctx[property].counter}\` messages from @${ctx.from.username || ctx.from.id}`
ctx.replyWithMarkdown(msg)
})
bot.command('/remove', (ctx) => {
ctx.replyWithMarkdown(`Removing session from database: \`${JSON.stringify(ctx[property])}\``)
// Setting session to null, undefined or empty object/array will trigger removing it from database
ctx[property] = null
})
bot.launch()
/examples
folder (PRs welcome)
Another examples located in Also, you may read comments in /lib/session.js
Tema Smirnov and contributors / [email protected] /