1.0.3 • Published 6 months ago

grammy-callback-data v1.0.3

Weekly downloads
-
License
MIT
Repository
github
Last release
6 months ago

grammy-callback-data

Type-safe utility for handling callback data in grammY bots.

Installation

npm install grammy-callback-data
# or
bun add grammy-callback-data

Quick Start

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

// 1. Define your callback data
const PostCD = new CallbackData("post", {
  action: { type: DataType.string },
  postId: { type: DataType.number },
  isConfirmed: { type: DataType.boolean, required: false },
});

// 2. Create keyboard with callback data
const keyboard = new InlineKeyboard()
  .text("👍 Like", PostCD.pack({ action: "like", postId: 123 }))
  .text("❌ Delete", PostCD.pack({ action: "delete", postId: 123 }));

// 3. Use keyboard in your bot
bot.command("post", async (ctx) => {
  await ctx.reply("Post actions:", {
    reply_markup: keyboard,
  });
});

// 4. Handle specific actions using filter
bot.callbackQuery(PostCD.filter({ action: "like" }), async (ctx) => {
  const { postId } = PostCD.unpack(ctx.callbackQuery.data);
  await ctx.reply(`Post ${postId} liked!`);
});

// Handle delete with confirmation
bot.callbackQuery(PostCD.filter({ action: "delete" }), async (ctx) => {
  const { postId, isConfirmed } = PostCD.unpack(ctx.callbackQuery.data);

  if (!isConfirmed) {
    const confirmKeyboard = new InlineKeyboard().text(
      "Confirm Delete",
      PostCD.pack({ action: "delete", postId, isConfirmed: true })
    );

    await ctx.reply("Are you sure?", {
      reply_markup: confirmKeyboard,
    });
    return;
  }

  await ctx.reply(`Post ${postId} deleted!`);
});

Features

  • 🔒 Type-safe callback data handling with TypeScript
  • 🎯 Built-in data validation
  • 🔍 Powerful filtering by action and fields
  • 💪 Support for string, number and boolean values
  • 🎭 Compact data format for Telegram's 64-byte limit

API

Creating Callback Data

const callback = new CallbackData(prefix, {
  field1: { type: DataType.string },
  field2: { type: DataType.number, required: false },
  field3: { type: DataType.boolean },
});

Packing Data

const data = callback.pack({
  field1: "value",
  field2: 123,
  field3: true,
});

Unpacking Data

const { field1, field2, field3 } = callback.unpack(ctx.callbackQuery.data);

Filtering Callbacks

// Filter by prefix only
bot.callbackQuery(callback.filter(), handler);

// Filter by specific fields
bot.callbackQuery(callback.filter({ field1: "value" }), handler);

Documentation

For detailed documentation and examples, visit the package directory.

License

MIT

1.0.3

6 months ago

1.0.2

6 months ago

1.0.1

6 months ago

1.0.0

6 months ago