import { Composer } from "https://dotland.deno.dev/x/grammy@v1.17.1/mod.ts";
Registers some middleware that will only be executed when a certain command is found.
// Reacts to /start commands
bot.command('start', ctx => { ... })
// Reacts to /help commands
bot.command('help', ctx => { ... })
The rest of the message (excluding the command, and trimmed) is provided
via ctx.match
.
Did you know? You can use deep linking (https://core.telegram.org/bots/features#deep-linking) to let users start your bot with a custom payload. As an example, send someone the link https://t.me/name-of-your-bot?start=custom-payload and register a start command handler on your bot with grammY. As soon as the user starts your bot, you will receive
custom-payload
in thectx.match
property!bot.command('start', ctx => { const payload = ctx.match // will be 'custom-payload' })
Note that commands are not matched in captions or in the middle of the text.
bot.command('start', ctx => { ... })
// ... does not match:
// A message saying: “some text /start some more text”
// A photo message with the caption “/start”
By default, commands are detected in channel posts, too. This means that
ctx.message
is potentially undefined
, so you should use ctx.msg
instead to grab both messages and channel posts. Alternatively, if you
want to limit your bot to finding commands only in private and group
chats, you can use bot.on('message').command('start', ctx => { ... })
,
or even store a message-only version of your bot in a variable like so:
const m = bot.on('message')
m.command('start', ctx => { ... })
m.command('help', ctx => { ... })
// etc
If you need more freedom matching your commands, check out the commands
plugin.