DEV Community

Cover image for Телеграм-бот на NodeJS. Создание справки
Stanislav Karol
Stanislav Karol

Posted on • Updated on

Телеграм-бот на NodeJS. Создание справки

В этой заметке я расскажу о том, как сделал справку по командам бота, показанную на скриншоте.
Когда программист будет знать, какие команды понимает его бот, то он может задать команды используя бота BotFather для того, чтобы задать эти команды. Задаём ему команду /help, чтобы увидеть список команд, далее видим /setcoomands, запустив её, выбираем своего бота и далее заводим эти команды.
BotFather
Я вижу такие минусы в этом способе:

  • Этот способ задаёт команды для авто подстановки, но не даёт возможность задать содержимое команды /help (да и новый бот не знает такую команду)
  • Когда изменится текст/список команд, то придётся снова его вводить.

Тогда предлагаю такой способ: Завести команды в программе, используя метод setMyCommands. И сразу же, не отходя далеко, напишем команду /help.

Сперва нам нужно задать константу, в которой будут команды бота:

const COMMANDS = [
  {
    command: "friday",
    description: "Показать пятничную подборку",
  },
  {
    command: "video",
    description: "Найти и показать видеоконтент",
  },
  {
    command: "subscribe",
    description:
      "Подписаться на пятничную подборку (рассылка выходит по пятницам)",
  },
  {
    command: "unsubscribe",
    description: "Отписаться от рассылки",
  },
  {
    command: "help",
    description: "Показать справку",
  },
  {
    command: "quit",
    description: "Отписаться от рассылки, выйти из чата",
  },
];

module.exports = COMMANDS;
Enter fullscreen mode Exit fullscreen mode

Затем, после инициализации бота (об этом я писал в предыдущих заметках) , сделайте такую команду:

// Импортировать массив
const COMMANDS = require("../const/commands");
// Задать команды боту
bot.setMyCommands(COMMANDS);
Enter fullscreen mode Exit fullscreen mode

Пару слов о содержимом этого массива. Это не произвольный массив объектов, эти объекты должны соответствовать типу BotCommand:
command это название команды,
description - её описание.

Второй шаг- научить бота эти команды показывать по команде help.
Для этого нужно составить текст вывода по этой команде, основываясь на массиве COMMANDS. Я так сделал:

const getHelp = () => {
  let helpText = `Телеграм-бот, созданный для развлечения, а не для работы.\n*Доступные команды:*\n`;
  helpText += COMMANDS.map(
    (command) => `*/${command.command}* ${command.description}`
  ).join(`\n`);
  return helpText;
};


bot.command("audio", (ctx) => {
  return ctx.replyWithMarkdown(getHelp());
});
Enter fullscreen mode Exit fullscreen mode

Сейчас я не использую библиотеку telegraf, о которой я ранее писал, я использую node-telegram-bot-api текст функции у меня выглядит по-другому, вот её полный текст:

const TelegramBot = require("node-telegram-bot-api");

const COMMANDS = require("../const/commands");

/**
 * Генератор содержимого команды help
 * @param {string|number} chatId
 * @param {TelegramBot} bot
 */
const help = (chatId, bot) => {
  let helpText = `Телеграм-бот, созданный для развлечения, а не для работы.\n*Доступные команды:*\n`;
  helpText += COMMANDS.map(
    (command) => `*/${command.command}* ${command.description}`
  ).join(`\n`);
  return bot.sendMessage(chatId, helpText, {
    parse_mode: "Markdown",
  });
};

module.exports = help;
Enter fullscreen mode Exit fullscreen mode

Что ещё можно сделать по оформлению справки? - Можно для массива COMMANDS сделать немного другое наполнение, например такое:

const COMMANDS = [
  {
    command: "friday",
    description: "Показать пятничную подборку",
    hint: true,    
  },
  {
    command: "video",
    description: "Найти и показать видеоконтент",
    hint: true,
    help: true,
  },
  {
    command: "subscribe",
    description:
      "Подписаться на пятничную подборку (рассылка выходит по пятницам)",
  },
///
Enter fullscreen mode Exit fullscreen mode

Добавить два поля: hint и help. И если значение в них true то выводить содержимое соответственно в подсказке командной строки или в окне справки. Для этого нам пригодятся методы массива filter и map или можно обойтись одним методом - reduce.

P.S.
В дальнейших заметках я буду приводить примеры используя только "node-telegram-bot-api" - мне эта библиотека показалась более удобной, чем telegraf.

Top comments (0)