deptyped / callback-data

Easy callback data management for inline keyboards
https://npmjs.com/callback-data
28 stars 2 forks source link
bot grammy grammyjs javascript telegraf telegram telegram-bot telegram-bot-api telegram-bots typescript

Introduction

Lightweight and simple library that helps manage callback data when using inline keyboards.

Installation

Node

$ npm install callback-data

Deno

import { createCallbackData } from "https://deno.land/x/callback_data/mod.ts";

Example

import { Bot, InlineKeyboard } from "grammy";
import { createCallbackData } from "callback-data";

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

const greetingData = createCallbackData("greeting", {
  type: String,
});

const greetingKeyboard = new InlineKeyboard()
  .text(
    "oldschool",
    greetingData.pack({
      type: "oldschool",
    }), // callback data is equal to "greeting:oldschool"
  )
  .text(
    "modern",
    greetingData.pack({
      type: "modern",
    }), // callback data is equal to "greeting:modern"
  );

bot.command("start", (ctx) =>
  ctx.reply("How to greet?", {
    reply_markup: greetingKeyboard,
  }));

bot.callbackQuery(
  greetingData.filter({
    type: "oldschool",
  }),
  (ctx) => ctx.answerCallbackQuery("Hello"),
);

bot.callbackQuery(
  greetingData.filter({
    type: "modern",
  }),
  (ctx) => ctx.answerCallbackQuery("Yo"),
);

bot.start();

There's more complex example counter-bot.

Usage

Create callback data builder

const callbackData = createCallbackData(
  // unique prefix for callback data
  "data",
  // callback data fields
  {
    id: Number,
    name: String,
    isAdmin: Boolean,
    // only Number, String, Boolean data types are supported
  },
);

Pack callback data

const packedData = callbackData.pack({
  id: 1337,
  name: "John",
  isAdmin: true,
});

console.log(packedData); // data:1337:John:1

Unpack callback data

const unpackedData = callbackData.unpack(packedData);

console.log(unpackedData);
// {
//   id: 1337,
//   name: "John",
//   isAdmin: true,
// }

Filter by callback data

const regex = callbackData.filter({
  id: 1337,
});

console.log(regex); // /^data:1337:(.+)?:(.+)?$/