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

vk-io-question

v4.0.0

Published

Система "Вопрос-Ответ" для библиотеки VK-IO

Downloads

483

Readme

VK-IO-QUESTION

Описание

Небольшой модуль для системы "Вопрос-Ответ". Интегрируется в цепь middleware vk-io

npm package

Установка

npm

npm i -S vk-io-question

yarn

yarn add vk-io-question

Использование

JavaScript

const { VK } = require('vk-io');
const { HearManager } = require('@vk-io/hear');
const { QuestionManager } = require('vk-io-question');

const vk = new VK({
    token: process.env.TOKEN,
    pollingGroupId: process.env.GROUP_ID
});

const questionManager = new QuestionManager();
const hearManager = new HearManager();

vk.updates.use(questionManager.middleware);
vk.updates.on(['message_new'], hearManager.middleware);

hearManager.hear('/reg', async (context) => {
    const answer = await context.question(
        'Согласны-ли Вы на обработку персональных данных?'
    );

    if (!/да|yes|согласен|конечно/i.test(answer.text)) {
        await context.send('Тогда, мы не можем совершить регистрацию');

        return;
    }

    await context.send('Отлично, тогда продолжим');

    const age = await context.question('Введите Ваш возраст');
    const email = await context.question('Введите Ваш имейл');
    const phone = await context.question('Введите Ваш номер телефона');

    await context.send(
        `Возраст: ${age.text}\nЭл. адрес: ${email.text}\nТелефон: ${phone.text}`
    );
});

vk.updates.startPolling();

TypeScript

import { VK, MessageContext } from 'vk-io';
import { HearManager } from '@vk-io/hear';
import {
    QuestionManager,
    QuestionMessageContext
} from 'vk-io-question';

type Context = MessageContext & QuestionMessageContext;

const vk = new VK({
    token: process.env.TOKEN,
    pollingGroupId: process.env.GROUP_ID
});

const questionManager = new QuestionManager();
const hearManager = new HearManager<Context>();

vk.updates.use(questionManager.middleware);
vk.updates.on(['message_new'], hearManager.middleware);

hearManager.hear('/reg', async (context) => {
    const answer = await context.question(
        'Согласны-ли Вы на обработку персональных данных?'
    );

    if (!/да|yes|согласен|конечно/i.test(answer.text)) {
        await context.send('Тогда, мы не можем совершить регистрацию');

        return;
    }

    await context.send('Отлично, тогда продолжим');

    const age = await context.question('Введите Ваш возраст');
    const email = await context.question('Введите Ваш имейл');
    const phone = await context.question('Введите Ваш номер телефона');

    await context.send(
        `Возраст: ${age.text}\nЭл. адрес: ${email.text}\nТелефон: ${phone.text}`
    );
});

vk.updates.startPolling();

Параметры конструктора |Параметр|Тип|Обязатален|Описание| |-|-|-|-| |answerTimeLimit|number (ms)|Нет|Устанавливает ограничение по времени на ответ. После истечения лимита будет выброшено исключение TimeoutError|


Метод отправки вопроса

const answer = await context.question(message, params);

|Параметр|Тип|Описание| |-|-|-| |message|string|Задаваемый вопрос| |params|MessagesSendParams|Параметры ссобщения|

В переменной answer будет MessageContext ответного сообщения

Специальные возможности


targetUserId - задаёт вопрос определённому пользователю

Проще говоря, бот будет ждать ответа именно от пользователя, айди которого был указан в targetUserId.

По умолчанию вопрос задаётся отправителю сообщения (context.senderId)


Получение payload

Давайте на команду /choice давать пользователю выбор из двух цветов, по нажатию на любую из которых, он получит факт о выбранном цвете

const { Keyboard } = require('vk-io');

hearManager.hear('/choice', async (context) => {
    const answer = await context.question(
        'Зелёный или синий?',
        {
            keyboard: Keyboard.keyboard([
                [
                    Keyboard.textButton({
                        label: 'Зелёный',
                        color: 'positive',
                        payload: {
                            choice: 'green'
                        }
                    }),
                    Keyboard.textButton({
                        label: 'Синий',
                        color: 'positive',
                        payload: {
                            choice: 'blue'
                        }
                    })
                ]
            ]).oneTime()
        }
    );

    if (!answer.messagePayload) {
        return context.send('Отвечать нужно было нажатием на кнопку');
    }

    if (answer.messagePayload.choice === 'green') {
        return context.send('Человеский глаз наиболее хорошо различает оттенки именно зеленого цвета.');
    }

    if (answer.messagePayload.choice === 'blue') {
        return context.send('Синий краситель долгое время был одним из самых дорогих, потому что его изготавливали из лазурита.');
    }
});

attachments, forwards, replyMessage, etc.

Мы можем получать в ответ любое вложение. Например давайте сделаем функцию обработки фотографии:

hearManager.hear('/обработка фото', async (context) => {
    const answer = await context.question(
        'Отправьте фото, которое хотите обработать'
    );

    // Благодаря тому, что в ответе объект MessageContext, мы имеем доступ к его функционалу
    if (!answer.hasAttachments('photo')) {
        return context.send('В ответе должно быть фото');
    }

    const [photo] = answer.getAllAttachments('photo');

    const filter = await context.question(
        'Теперь название фильтра *список доступных фильтров*'
    );

    if (!filter.hasText) {
        return context.send('В ответе должен быть текст');
    }

    const newPhoto = await myAwesomeFunction(
        photo.largeSizeUrl, filter.text
    );

    return context.sendPhotos(newPhoto, {
        message: 'Вот твоя новая фотография!'
    });
});

Таким же образом, благодаря MessageContext в ответном объекте у нас есть доступ к таким полям и методам как forwards, messagePayload, replyMessage и так далее


answerTimeLimit

Мы можем задавать ограничение по времени на ответ

hearManager.hear('/q', async (context) => {
    const answer = await context.question('Сколько будет 2 + 2?', {
        answerTimeLimit: 5_000 // Ограничение в 5 секунд
    }).catch((error) => {
        if (error instanceof TimeoutError) {
            console.error('Превышено время ожидания ответа');
            return null;
        }

        console.error(error);
        return null;
    });

    /**
     * Пользователь не успел ответить
     * или возникла другая ошибка
     */
    if (answer === null) {
        return context.send('Вы не успели ответить :(');
    }

    if (answer.hasText && answer.text === '4') {
        return context.send('Правильно!');
    }

    else {
        return context.send('Oh my... wrong!');
    }
});