Skip to content

Easy callback data management for inline keyboards

Notifications You must be signed in to change notification settings

deptyped/callback-data

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

41 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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:(.+)?:(.+)?$/