npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

telegram-node-bot-extensions

v1.0.4

Published

extensions of telegram-node-bot module

Downloads

3

Readme

telegram-node-bot-extensions

Этот небольшой проект представляет собой расширения стандартного функционала для библиотеки telegram-node-bot.

Установка

Добавление пакета в проект через npm:

npm install --save telegram-node-bot-extensions

Инициализация модуля:

require('telegram-node-bot-extensions')(Telegram, tg)

Мульти-формы

Вы можете создавать сложные формы с высокой степенью вложенности. Используйте $.runMultiForm для запуска.

const form = {
	category: {
		question: 'Выбери категорию',
		error: 'Ты неправильно ввел категорию!',
		keyboard: [['Курьер', 'Ремонт']],
		'Курьер': {
			subcategory: {
				question: 'Выбери подкатегорию',
				error: 'Ты неправильно ввел подкатегорию!',
				keyboard: [['Пеший курьер', 'Доставка продуктов']]
			},
			size: {
				question: 'Установить размер посылки?',
				keyboard: [['Да', 'Нет']],
				values: {'Да': true, 'Нет': false},
				'Да': {
					length: {
						question: 'Задай длину посылки (см)',
						validator: message => {return Number.isInteger(parseInt(message.text))}
					},
					width: {
						question: 'Задай ширину посылки (см)',
						validator: message => {return Number.isInteger(parseInt(message.text))}
					}
				}
			},
			weight: {
				question: 'Задай вес посылки',
				validator: message => {return Number.isInteger(parseInt(message.text))}
			}
		},
		'Ремонт': {
			subcategory: {
				question: 'Выбери подкатегорию',
				keyboard: [['Ремонт мебели', 'Отделочные работы']]
			}
		}
	},
	contacts: {
		question: 'Оставить контакты?',
		keyboard: [['Да', 'Нет']]
	}
}

const config = {
	buttons: {
		cancel: 'Отменить',
		back: 'Назад'
	},
	messages: {
		canceled: 'Заполнение формы отменено.',
		completed: 'Форма успешно заполнена.'
	},
	disable_notification: true,
	disable_web_page_preview: true,
	parse_mode: 'HTML'
}

$.runMultiForm(form, result => console.log(result), config)

Структура формы

Каждая форма состоит из вопросов, на которые должен ответить пользователь. Каждый вопрос должен включать в себя текст вопроса и ответ на него. В качестве проверки ответа выступает функция-валидатор, возвращающая логическое значение, либо текст из кнопок клавиатуры. Если указано и то и другое, функция-валидатор будет иметь приоритет.

...
	validator: message => {return Number.isInteger(parseInt(message.text))}
...

В случае, если ответ не прошел проверку, может быть выведено сообщение об ошибке, которое устанавливается полем error.

...
	question: 'Выбери подкатегорию',
	error: 'Ты неправильно ввел подкатегорию!',
...

При каждом правильном ответе на вопрос производится поиск дочерней формы, объект которой называется именем этого ответа.

...
	question: 'Выбери категорию',
	error: 'Ты неправильно ввел категорию!',
	keyboard: [['Курьер', 'Ремонт']],
	'Курьер': {...},
	'Ремонт': {...}
...

Есть возможность переопределения текстовых значений, которые будут записаны в результат. Для этого служит поле values.

...
	question: 'Установить размер посылки?',
	keyboard: [['Да', 'Нет']],
	values: {'Да': true, 'Нет': false},
...

Настройка формы

Доступна установка дополнительных параметров формы через конфиг, который можно передать в конструктор.

const config = {
	buttons: {
		cancel: 'Отменить',
		back: 'Назад'
	},
	messages: {
		canceled: 'Заполнение формы отменено.',
		completed: 'Форма успешно заполнена.'
	},
	disable_notification: true,
	disable_web_page_preview: true,
	parse_mode: 'HTML'
}

В объекте buttons задается использование кнопок. Можно включить кнопки отмены и возвращения к предыдущему вопросу. Аналогичным образом, в объекте messages можно включить сообщения при завершении и при отмене формы.

Помимо этого, доступен к изменению ряд стандартных параметров: disable_notification, disable_web_page_preview и parse_mode.

Важно отметить, что конфиг совершенно опционален. Все функции, которыми он управляет по умолчанию выключены. Поэтому, если вы не хотите, допустим, использовать кнопку "Назад", просто не указывайте ее в конфиге.

Инлайновые меню с вкладками

Для создания таких меню можно воспользоваться методом $.runInlineTabsMenu.

const tabs = [
	{
		message: 'Первая вкладка',
		menu: [
			[
				{text: 'Один', callback: callbackQuery => console.log('one')},
				{text: 'Два', callback: callbackQuery => console.log('two')}
			],
			[
				{text: 'Три', callback: callbackQuery => console.log('three')}
			]
		]
	},
	{
		message: 'Вторая вкладка',
		menu: [
			[
				{text: 'Четыре', callback: callbackQuery => console.log('four')}
			],
			[
				{text: 'Пять', callback: callbackQuery => console.log('five')}
			]
		]
	},
	{
		message: 'Третья вкладка'
	},
	{
		message: 'Четвертая вкладка'
	},
	{
		message: 'Пятая вкладка'
	},
	{
		message: 'Шестая вкладка'
	}
]

const config = {
	title: '<b>Заголовок</b>',
	max_buttons: 5,
	disable_notification: true,
	disable_web_page_preview: true,
	parse_mode: 'HTML'
}

$.runInlineTabsMenu(tabs, config)

Структура меню

Массив вкладок содержит объекты, которые описывают каждую отдельную вкладку. В свою очередь, вкладка должна содержать текст (поле message) и может содержать меню с инлайновыми кнопками (поле menu).

...
	message: 'Первая вкладка',
	menu: [
		[
			{text: 'Один', callback: callbackQuery => console.log('one')},
			{text: 'Два', callback: callbackQuery => console.log('two')}
		],
		[
			{text: 'Три', callback: callbackQuery => console.log('three')}
		]
	]
...

Меню описывает набор строк и кнопок в них. Каждая кнопка должна содержать текст (поле text) и функцию-колбек (поле callback), который будет вызван при нажатии на эту кнопку.

...
	{text: 'Один', callback: callbackQuery => console.log('one')},
...

Настройка меню

В конфиге, который передается вторым необязательным параметром в конструктор, можно задать использование заголовка (поле title), который будет добавляться перед текстом вкладки. Поле max_buttons устанавливает максимальное количество кнопок для навигации по вкладкам (по умолчанию 5). Количество кнопок должно быть нечетным.

const config = {
	title: '<b>Заголовок</b>',
	max_buttons: 5,
	disable_notification: true,
	disable_web_page_preview: true,
	parse_mode: 'HTML'
}

Также можно установить значения для стандартных параметров: disable_notification, disable_web_page_preview и parse_mode.

Инлайновые клавиатуры

Появился простой механизм для создания инлайновых клавиатур:

let keyboard = $.genInlineKeyboard('Один', 'one', 'Два', 'two')
$.sendMessage('Выбери действие', {reply_markup: keyboard})

Метод $.genInlineKeyboard генерирует инлайновую клавиатуру из переданных пар аргументов: первый параметр устанавливает текст кнопки, второй устанавливает данные (callback_data). Оба переданных значения должны быть строкового типа.

Также параметры могут быть переданы в виде массива:

let buttons = ['Один', 'one', 'Два', 'two']
$.sendMessage('Выбери действие', {reply_markup: $.genInlineKeyboard(buttons)})

Можно использовать вложенные массивы для создания нескольких кнопок на одной строке:

let buttons = [['Один', 'one'], ['Два', 'two', 'Три', 'three'], 'Четыре', 'four', ['Пять', 'five']]
$.sendMessage('Выбери действие', {reply_markup: $.genInlineKeyboard(buttons)})