@kkolorid

Telegram bot API PHP — почему ответ приходит три раза?

Прикручиваю https://github.com/TelegramBot/Api к фреймворку yii2. Почему-то после того, как я добавил 2ую функцию on() для обработки текста пришедшего сообщение - ответы с первого on() (которая обрабатывает кнопки) приходят по три (3) раза... Если убирать вторую on() - работает, как надо - один ответ. Раньше на нативном php такой код работал. На фреймворке что-то магия какая-то...

Код экшна, где лежит бот:
function start($bot, $message) {

            //global $db;

            // $db->query('DELETE FROM `actions` WHERE `login` = {?}', array($message->getChat()->getUserName()));

            $mess = 'Приветствую тебя!';

            $keyboard = new \TelegramBot\Api\Types\Inline\InlineKeyboardMarkup(
                [
                    [
                        ['callback_data' => 'start', 'text' => ' Начать']
                    ],
                    [
                        ['callback_data' => 'start2', 'text' => ' Магазин']
                    ],
                    [
                        ['url' => 'http://google.com/', 'text' => ' Инструкция'],
                    ],
                ]
            );

            $bot->sendMessage($message->getChat()->getId(), $mess, false, null, null, $keyboard);

        }

        if(true){
            error_reporting(E_ALL & ~(E_NOTICE | E_USER_NOTICE | E_DEPRECATED));
            ini_set('display_errors', 1);
        }

        $token = Yii::$app->params['botToken'];

        try {

            $bot = new \TelegramBot\Api\Client($token, null);

            $bot->command('start', function ($message) use ($bot) {

                if (!BotUsers::findOne(['user_id' => $message->getChat()->getId()])) {

                    $user = new BotUsers();
                    $user->user_id = $message->getChat()->getId();
                    $user->date = Yii::$app->formatter->asDate('now', 'php:Y-m-d');
                    $user->time = Yii::$app->formatter->asTime('now', 'php:H:i:s');
                    $user->last_login = $message->getChat()->getUserName();
                    $user->save(false);

                } else {

                    $user = BotUsers::findOne(['user_id' => $message->getChat()->getId()]);

                    if ($user->last_login != $message->getChat()->getUserName()) {

                        $user->last_login = $message->getChat()->getUserName();
                        $user->save(false);

                    }

                }

                start($bot, $message);

            });

            $bot->on(function($update) use ($bot){

                $callback = $update->getCallbackQuery();
                $message = $callback->getMessage();
                $data = $callback->getData();

                $bot->answerCallbackQuery($callback->getId());

                $user = BotUsers::find()->where(['user_id' => $message->getChat()->getId()])->one();

                if($data == 'start'){

                    start($bot, $message);

                }

                if($data == 'start2'){

                    $bot->sendMessage($message->getChat()->getId(), $data);

                }

            }, function($update) {
                $callback = $update->getCallbackQuery();
                if (is_null($callback) || !strlen($callback->getData()))
                    return false;
                return true;
            });

            // Отлов любых сообщений + обрабтка reply-кнопок
            $bot->on(function($update2) use ($bot){

                $message2 = $update2->getMessage();
                $mtext = $message2->getText();
                $cid = $message2->getChat()->getId();

                if(mb_stripos($mtext,"власть советам") !== false){
                    $bot->sendMessage($message2->getChat()->getId(), "Смерть богатым!");
                }

            }, function($message2) use ($bot){
                return true; // когда тут true - команда проходит
            });

            $bot->run();

        } catch (\TelegramBot\Api\Exception $e) {
            $e->getMessage();
        }
  • Вопрос задан
  • 1348 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы