npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

botact

v2.4.2

Published

Botact enables developers to focus on writing reusable application logic instead of spending time building infrastructure.

Downloads

313

Readme

botact botact botact botact botact

botact.js

Botact enables developers to focus on writing reusable application logic instead of spending time building infrastructure.

Table of content

Install

via npm:

$ npm i botact -S

via yarn:

$ yarn add botact

Examples

express:

const express = require('express')
const bodyParser = require('body-parser')
const { Botact } = require('botact')

const app = express()
const bot = new Botact({
  confirmation: process.env.CONFIRMATION,
  token: process.env.TOKEN
})

// User wrote command 'start'
bot.command('start', ({ reply }) => {
  reply('This is start!')
})

// User wrote message which contains 'car' or 'tesla'
bot.hears(/(car|tesla)/, ({ reply }) => {
  reply('I love Tesla!')
})

// User joined in the group
bot.event('group_join', ({ reply }) => {
  reply('Thanks!')
})

// User wrote any message
bot.on(({ reply }) => {
  reply('What?')
})

// Parser request body
app.use(bodyParser.json())

// Bot's endpoint
app.post('/', bot.listen)

// Start listen on 3000
app.listen(process.env.PORT)

koa:

const Koa = require('koa')
const Router = require('koa-router')
const bodyParser = require('koa-bodyparser')
const { Botact } = require('botact')

const app = new Koa()
const router = new Router()
const bot = new Botact({
  confirmation: process.env.CONFIRMATION,
  token: process.env.TOKEN,
  framework: 'koa'
})

// User wrote command 'start'
bot.command('start', ({ reply }) => {
  reply('This is start!')
})

// User wrote message which contains 'car' or 'tesla'
bot.hears(/(car|tesla)/, ({ reply }) => {
  reply('I love Tesla!')
})

// User joined in the group
bot.event('group_join', ({ reply }) => {
  reply('Thanks!')
})

// User wrote any message
bot.on(({ reply }) => {
  reply('What?')
})

// Bot's endpoint
router.post('/', bot.listen)

// Parser request body
app.use(bodyParser())
// Connect routes
app.use(router.routes())

// Start listen on 3000
app.listen(3000)

Botact API

Methods

Core

Actions

Options

Upload helpers

Error Handling


Botact API: Core

constructor(settings)

Create bot.

Definition:

constructor (settings: {
  confirmation: string;   // required
  token: string;          // required
  group_id?: number;
  framework?: string;     // Server framework (express/koa)

  // Flow Settings
  flowTimeout?: number;   // Document expire time, in seconds
  redis?: boolean;        // false by default
  redisConfig?: object;   // {} by default
})

Usage:

const { Botact } = require('botact')

const bot = new Botact({
  confirmation: process.env.CONFIRMATION,
  token: process.env.TOKEN
})

.api(method, settings)

Call API method (https://vk.com/dev/methods).

Definition:

async api (
  method: string,        // required
  options?: object,      // api call parameters
): Promise<any>;         // Promise with response/error

Usage:

const data = await bot.api('users.get', {
  user_ids: 1
})

.execute(method, settings, callback)

Call API by execute.

Definition:

async execute (
  method: string,        // required
  options?: object,      // api call  parameters
  callback?: function    
): Promise<any>;         // Promise with response/error

Usage:

bot.execute('users.get', {
  user_ids: 1
}, (body) => {
  // {
  //   response: [{
  //     id: 1,
  //     first_name: 'Павел',
  //     last_name: 'Дуров'
  //   }]
  // }
})

.reply(userId, message, attachment, keyboard)

Sends message to user

Definition:

async reply (
  userId: number,
  message: string,      // required, if attachment not setten
  attachment: string,   // required, if message not setten
  keyboard: Object      // optional
): Promise<any>         // Promise with response/error

Usage:

bot.command('start', (ctx) => {
  // via shortcut from context
  ctx.reply('Hi, this is start!')
  // via shortcut with keyboard
  ctx.reply('Yo, this is keyboard?', null, {
    one_time: false,
    buttons: [
      [
        {
          action: {
            type: 'text',
            payload: {
              button: 'Hello, world!'
            },
            label: 'Hello, world!'
          },
          color: 'primary'
        }
      ]
    ]
  })
  // via function from context
  ctx.sendMessage(ctx.user_id, 'Hi, this is start!')
  // via function from instance
  bot.reply(ctx.user_id, 'Hi, this is start!')
  // to multiple users
  bot.reply([ ctx.user_id, 1 ], 'Hi, this is start!')
})

.listen(...args)

Start listen.

Definition:

express:

listen (
  req: any,           // Express request, required
  res: any            // Express response, required
  callback: function  // Callback for errors
)

koa:

listen (
  ctx: object,        // Koa object, required
  callback: function  // Callback for errors
)

Usage:

// express
bot.listen(req, res, (error) => {
  res.status(500).json({
    error: 'Server error'
  })
})

// koa
bot.listen(ctx, (error) => {
  ctx.throw(500, 'Server error')
})

Botact API: Actions

.command(command, callback)

Add command w/ strict match.

Definition:

command (
  command: string | string[],
  callback: function
): Botact

Usage:

bot.command('start', ({ reply }) => reply('This is start!'))

.event(event, callback)

Add event handler .

Definition:

event (
  event: string | string[],
  callback: function
): Botact;

Usage:

bot.event('group_join', ({ reply }) => reply('Thanks!'))

.hears(command, callback)

Add command w/ match like RegEx.

Definition:

hears (
  hear: string | RegExp | (string | RegExp)[],
  callback: function
): Botact;

Usage:

bot.hears(/(car|tesla)/, ({ reply }) => reply('I love Tesla!'))

.on(type, callback)

Add reserved callback.

Definition:

on (
  type: string,
  callback: function
): Botact;

OR

on (
  callback: function
): Botact;

Usage:

bot.on(({ reply }) => reply('What?'))
bot.on('audio', ({ reply }) => reply('Great music!'))

.use(callback)

Add middleware.

Definition:

use (
  callback: function
): Botact

Usage:

bot.use(ctx => ctx.date = new Date())

bot.on(({ date }) => {
  // Fri Nov 24 2017 16:00:21 GMT+0300 (MSK)
})

Botact API: Options

[getter] options

Get options.

bot.options
// {
//   confirmation: '12345',
//   token: 'abcde...'
// }

[setter] options

Set options.

bot.options = { foo: 'bar' }
// {
//   confirmation: '12345',
//   token: 'abcde...',
//   foo: 'bar'
// }

.deleteOptions(settings)

Delete keys settings.

Definition:

deleteOptions (
  keys: string[]
): Botact

Usage:

bot.deleteOptions([ 'token', 'confirmation' ])
// {
//   foo: 'bar'
// }

Botact API: Upload helpers

.uploadCover(file, settings)

Upload and save cover. See detailed settings here.

Definition:

async uploadCover (
  filepath: string,    // Path to file with cover
  settings?: object
): Promise<any>        // Promise with response/error

Usage:

await bot.uploadCover('./cover.jpg', { crop_x2: 1590 })
// {
//   images: [
//     {
//       url: "URL",
//       width: 1920,
//       height: 1080
//     },
//     [Object],
//     [Object],
//     [Object],
//     [Object]
//   ]
// }

.uploadDocument(file, peer_id, type)

Uploads document to peer.

Definition:

async uploadDocument (
  filepath: string,               // Path to file
  peer_id: number,
  type: 'doc' | 'audio_message'   // 'doc' by default
): Promise<any>;                  // Promise with response/error

Usage:

await bot.uploadDocument('./book.pdf', 1234)
// {
//   response:
//     [{
//       id: 1234,
//       owner_id: 1234,
//       title: "",
//       ...
//     }]
// }

.uploadPhoto(file, peer_id)

Uploads photo to peer.

Definition:

async uploadPhoto (
  filepath: string,   // Path to picture
  peer_id: number
): Promise<any>       // Promise with response/error

Usage:

await bot.uploadPhoto('./picture.png', 1234)
// {
//   id: 1234,
//   album_id: 1234,
//   owner_id: 1234,
//   ...
// }

Botact API: Error Handling

.catch(handler)

Add catch handler for errors.

Default handler:

console.error(`❌ Botact Error: ${typeof err === 'object' ? JSON.stringify(err) : err}`)

Usage:

// Handle all botact errors here
bot.catch((ctx, err) => {
  // ctx - user's context
  // err - throwed error
  console.error(ctx, err)
})

bot.on((ctx) => {
  if (ctx.peer_id !== 1) {
    // Throw error to the .catch handler
    return ctx.throw('User is not Pavel Durov')
  }
})

.throw(error)

Throw error.

Usage:

bot.catch((ctx, err) => {
  console.error(ctx, err)
})

bot.command('start', (ctx) => {
  if (ctx.peer_id === 301361473) {
    return ctx.throw('User is blocked')
  }
  
  ctx.reply('Hello, how are you?')
})

.assert(value, message)

Helper method to throw an error similar to .throw() when !value.

bot.catch((ctx, err) => {
  console.error(ctx, err)
})

bot.command('start', (ctx) => {
  ctx.assert(ctx.peer_id !== 301361473, 'User is blocked')
  ctx.reply('Hello, how are you?')
})

Botact Flow API

Usage

const bot = new Botact({
  ...,
  redis: true       // enable redis
  flowTimeout: 20   // timeout for delete documents
  redisConfig: {    // redis config
    port: 1234
  }
})
$ redis-server

Methods

Example

const bodyParser = require('body-parser')
const express = require('express')
const { Botact } = require('botact')

const app = express()
const bot = new Botact({
  confirmation: process.env.CONFIRMATION,
  token: process.env.TOKEN,
  redis: true,
  flowTimeout: 20,      // document will be deleted after 20 secs
  redisConfig: {
    host: '127.0.0.1',  // default host for redis
    port: 8080          // custom port for redis
  },
})

bot.addScene('wizard',
  ({ reply, scene: { next } }) => {
    next()
    reply('Write me something!')
   },
  ({ reply, body, scene: { leave } }) => {
    leave()
    reply(`You wrote: ${body}`)
  }
)

bot.command('join', ({ scene: { join } }) => join('wizard'))

app.use(bodyParser.json())
app.post('/', bot.listen)
app.listen(process.env.PORT)

Botact Flow API: Methods

.addScene(name, ...callbacks)

Add scene.

Definition:

addScene (
  name: string,
  ...args: function[]
): Botact;

Usage:

bot.addScene('wizard',
  ({ reply, scene: { next } }) => {
    next()
    reply('Write me something!')
  },
  ({ reply, body, scene: { leave } }) => {
    leave()
    reply(`You wrote: ${body}`)
  }
)

.joinScene(ctx, scene, session, step, now)

Enter scene.

Definition:

async joinScene (
  ctx: object,
  scene: string,
  session?: object,      // {} by default
  step?: number,         // 0 by default
  instantly?: boolean    // true by default
): Promise<Botact>;

Usage:

bot.command('join', (ctx) => {
  // with shortcut without additional settings
  ctx.scene.join('wizard')
  // simple usage with additional settings
  bot.joinScene(ctx, 'wizard', { foo: 'bar' })
})

.nextScene(ctx, body)

Navigate scene.

Definition:

async nextScene (
  ctx: object,
  session?: object,      // {} by default
): Promise<Botact>;

Usage:

bot.addScene('wizard',
  (ctx) => {
    // with shortcut without additional settings
    ctx.scene.next({ foo: 'bar' })
    // simple usage with additional settings
    bot.nextScene(ctx, { foo: 'bar' })
  }
)

.leaveScene(ctx)

Leave scene.

Definition:

async leaveScene(
  ctx: object
): Promise<Botact>;

Usage:

bot.addScene('wizard',
  (ctx) => {
    // with shortcut
    ctx.scene.leave()
    // simple usage
    bot.leaveScene(ctx)
  }
)

TypeScript

Botact includes TypeScript definitions.

Tests

via npm:

$ npm test

via yarn:

$ yarn test

License

MIT.