You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

258 lines
7.4 KiB

<?php
/**
* This file is part of the PHP Telegram Bot example-bot package.
* https://github.com/php-telegram-bot/example-bot/
*
* (c) PHP Telegram Bot Team
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
/**
* User "/survey" command
*
* Example of the Conversation functionality in form of a simple survey.
*/
namespace Longman\TelegramBot\Commands\UserCommands;
use Longman\TelegramBot\Commands\UserCommand;
use Longman\TelegramBot\Conversation;
use Longman\TelegramBot\Entities\Keyboard;
use Longman\TelegramBot\Entities\KeyboardButton;
use Longman\TelegramBot\Entities\ServerResponse;
use Longman\TelegramBot\Exception\TelegramException;
use Longman\TelegramBot\Request;
class SurveyCommand extends UserCommand
{
/**
* @var string
*/
protected $name = 'survey';
/**
* @var string
*/
protected $description = 'Survey for bot users';
/**
* @var string
*/
protected $usage = '/survey';
/**
* @var string
*/
protected $version = '0.4.0';
/**
* @var bool
*/
protected $need_mysql = true;
/**
* @var bool
*/
protected $private_only = true;
/**
* Conversation Object
*
* @var Conversation
*/
protected $conversation;
/**
* Main command execution
*
* @return ServerResponse
* @throws TelegramException
*/
public function execute(): ServerResponse
{
$message = $this->getMessage();
$chat = $message->getChat();
$user = $message->getFrom();
$text = trim($message->getText(true));
$chat_id = $chat->getId();
$user_id = $user->getId();
// Preparing response
$data = [
'chat_id' => $chat_id,
// Remove any keyboard by default
'reply_markup' => Keyboard::remove(['selective' => true]),
];
if ($chat->isGroupChat() || $chat->isSuperGroup()) {
// Force reply is applied by default so it can work with privacy on
$data['reply_markup'] = Keyboard::forceReply(['selective' => true]);
}
// Conversation start
$this->conversation = new Conversation($user_id, $chat_id, $this->getName());
// Load any existing notes from this conversation
$notes = &$this->conversation->notes;
!is_array($notes) && $notes = [];
// Load the current state of the conversation
$state = $notes['state'] ?? 0;
$result = Request::emptyResponse();
// State machine
// Every time a step is achieved the state is updated
switch ($state) {
case 0:
if ($text === '') {
$notes['state'] = 0;
$this->conversation->update();
$data['text'] = 'Type your name:';
$result = Request::sendMessage($data);
break;
}
$notes['name'] = $text;
$text = '';
// No break!
case 1:
if ($text === '') {
$notes['state'] = 1;
$this->conversation->update();
$data['text'] = 'Type your surname:';
$result = Request::sendMessage($data);
break;
}
$notes['surname'] = $text;
$text = '';
// No break!
case 2:
if ($text === '' || !is_numeric($text)) {
$notes['state'] = 2;
$this->conversation->update();
$data['text'] = 'Type your age:';
if ($text !== '') {
$data['text'] = 'Age must be a number';
}
$result = Request::sendMessage($data);
break;
}
$notes['age'] = $text;
$text = '';
// No break!
case 3:
if ($text === '' || !in_array($text, ['M', 'F'], true)) {
$notes['state'] = 3;
$this->conversation->update();
$data['reply_markup'] = (new Keyboard(['M', 'F']))
->setResizeKeyboard(true)
->setOneTimeKeyboard(true)
->setSelective(true);
$data['text'] = 'Select your gender:';
if ($text !== '') {
$data['text'] = 'Choose a keyboard option to select your gender';
}
$result = Request::sendMessage($data);
break;
}
$notes['gender'] = $text;
// No break!
case 4:
if ($message->getLocation() === null) {
$notes['state'] = 4;
$this->conversation->update();
$data['reply_markup'] = (new Keyboard(
(new KeyboardButton('Share Location'))->setRequestLocation(true)
))
->setOneTimeKeyboard(true)
->setResizeKeyboard(true)
->setSelective(true);
$data['text'] = 'Share your location:';
$result = Request::sendMessage($data);
break;
}
$notes['longitude'] = $message->getLocation()->getLongitude();
$notes['latitude'] = $message->getLocation()->getLatitude();
// No break!
case 5:
if ($message->getPhoto() === null) {
$notes['state'] = 5;
$this->conversation->update();
$data['text'] = 'Insert your picture:';
$result = Request::sendMessage($data);
break;
}
$photo = $message->getPhoto()[0];
$notes['photo_id'] = $photo->getFileId();
// No break!
case 6:
if ($message->getContact() === null) {
$notes['state'] = 6;
$this->conversation->update();
$data['reply_markup'] = (new Keyboard(
(new KeyboardButton('Share Contact'))->setRequestContact(true)
))
->setOneTimeKeyboard(true)
->setResizeKeyboard(true)
->setSelective(true);
$data['text'] = 'Share your contact information:';
$result = Request::sendMessage($data);
break;
}
$notes['phone_number'] = $message->getContact()->getPhoneNumber();
// No break!
case 7:
$this->conversation->update();
$out_text = '/Survey result:' . PHP_EOL;
unset($notes['state']);
foreach ($notes as $k => $v) {
$out_text .= PHP_EOL . ucfirst($k) . ': ' . $v;
}
$data['photo'] = $notes['photo_id'];
$data['caption'] = $out_text;
$this->conversation->stop();
$result = Request::sendPhoto($data);
break;
}
return $result;
}
}