Эта уже третья статья по разбору библиотеки SimpleVK3, в то же время это уже третья статья, посвященная цепочкам сообщений. В первой такой статье в кач-ве хранилища мы использователи базу данных, во второй написали простенький класс для хранения данных в файлах. А поскольку в третьей ветке SimpleVK тоже появилась такая система - будем ковырять и этот вариант.
На сайте было множество уроков по VK API, и в каждой разбиралась настройка сообщества для бота. Думаю, в этот раз сей шаг пропущу и перейду сразу к написанию кода. Внизу на всякий случай будут ссылки на статьи с инструкциями по настройке группы.
Сегодня сделаем опять же пошаговую анкету с несколькими вопросами для пользователей, заставим бота всю эту инфу запоминать и показывать по команде. И начинаем мы с подключения библиотеки и добавления некоторых констант:
<?php
require_once __DIR__ . '/vendor/digitalstars/simplevk/autoload.php'; // Подключение библиотеки
const VK_KEY = '*******************'; // Ключ сообщества
const ACCESS_KEY = '********'; // Строка, которую должен вернуть сервер
const VERSION = '5.131'; // Версия VK API
const ADMIN_ID = ''; // ID своей страницы (для быстрого просмотра ошибок у себя в личке)
Создаём экземпляры классов SimpleVK и Bot:
$vk = \DigitalStars\SimpleVK\SimpleVK::create( VK_KEY, VERSION ) // Экземпляр класса SimpleVK
->setConfirm( ACCESS_KEY ) // Подтверждение callback-сервера
->setUserLogError( ADMIN_ID ) // Логирование ошибок себе в личку
->initUserID( $user_id ); // Инициализация ID страницы написавшего нам пользователя
$bot = \DigitalStars\SimpleVK\Bot::create( $vk ); // Экземпляр класса Bot
Далее загружаем хранилище и получаем статус анкеты с помощью метода get() по ключу status:
$ctx = \DigitalStars\SimpleVK\Store::load( $user_id ); // Загружаем данные из хранилища (для каждого юзера будет создаваться файл по ID его страницы)
$status = $ctx->get( 'status' ); // Получаем статус анкеты юзера из хранилища
Вообще, загрузку хранилища лучше помещать внутри блока обработки команды, чтобы файл в кэше не создавался при любом сообщении от юзера. Но поскольку нам придётся получать неизвестные значения в анкете (имя, возраст, рассказ о себе), то сделаем пока что иначе.
Создадим команду /анкета для старта заполнения, а также воспользуемся методом sset( $key, $value ) для установки статуса 1 в анкете юзера ($key - какой-то любой ключ, $value - значение). В дальнейшем по статусу будем определять, на каком этапе заполнения анкеты находится человек:
$bot->cmd( 'cmd1', '/анкета' )->text( 'Укажите своё имя' )->func( function() use ( $ctx )
{
$ctx->sset( 'status', 1 ); // Устанавливаем статус 1
} );
По такому же принципу заполняем все остальные поля анкеты (имя, возраст и инфу о юзере), походу дела проверяя статус:
$bot->preg_cmd( 'cmd4', '!(.*)!' )->func( function( $msg, $params ) use ( $ctx, $status ) // Заполнение анкета
{
switch ( $status )
{
case 1:
{
$ctx->sset( 'status', 2 ); // Устанавливаем статус 2
$ctx->sset( 'name', $params[0] ); // Устанавливаем имя
$msg->text( 'Укажите возраст' ); // Просим пользователя указать возраст
break;
}
case 2:
{
$ctx->sset( 'status', 3 ); // Устанавливаем статус 3
$ctx->sset( 'age', (int)$params[0] ); // Устанавливаем возраст
$msg->text( 'Расскажите о себе' ); // Просим пользователя рассказать о себе
break;
}
case 3:
{
$ctx->sset( 'status', 4 ); // Устанавливаем статус 4
$ctx->sset( 'about', $params[0] ); // Записываем рассказ пользователя о себе
$msg->text( "Анкета заполнена. Доступные команды:\n/мояанкета - посмотреть свою анкету\n/удалить - удалить анкету" ); // Говорим, что всё окей, предлагаем на выбор список команд
break;
}
}
} );
Далее реализуем возможность чтения и удаления анкет. С помощью метода get( $key ) по очереди вытащим из кэша все данные пользователя по ключу, запишем всё в переменную $mess и отправим через бота:
$bot->cmd( 'cmd2', '/мояанкета' )->func( function( $msg ) use ( $ctx ) // Команда /мояанкета (для просмотра анкеты)
{
$mess = "Твоя анкета:\n\n";
$mess .= "Имя: {$ctx->get( 'name' )}\n";
$mess .= "Возраст: {$ctx->get( 'age' )}\n";
$msg->text( $mess .= "О себе: {$ctx->get( 'about' )}" ); // В переменную $mess записали анкету, далее формируем сообщение юзеру
} );
Для удаления анкет будем юзать встроенную в PHP функцию unlink():
$bot->cmd( 'cmd3', '/удалить' )->func( function( $msg ) use ( $user_id ) // Команда /удалить (для удаления анкеты)
{
unlink( './cache/' . $user_id . '.php' ); // Удаляем файл-хранилище юзера по ID его страницы
$msg->text( '+' ); // Говорим пользователю, что всё ок
} );
И в конце запускаем бота, используя метод run():
$bot->run(); // Запуск бота
Ну, и смотрим, что получилось 🤗:
Перед публикацией, советую ознакомится с правилами!
Нашли ошибку?
Вы можете сообщить об этом администрации.
Выделив текст нажмите CTRL+Enter