function processUpdate(Update $update)
{
    $updateId = $update->updateId;
    printf("Got update #%d\n", $updateId);
    if (!empty($update->message)) {
        $message = $update->message;
        if (!empty($update->message->text)) {
            printf("  Got message: %s\n", $message->text);
            $button1 = (new InlineKeyboardButton('Go to GitHub'))->setUrl('https://github.com');
            $button2 = (new InlineKeyboardButton('Switch to inline'))->setSwitchInlineQuery("test query");
            $button3 = (new InlineKeyboardButton('Show text'))->setCallbackData('text');
            $button4 = (new InlineKeyboardButton('Show alert'))->setCallbackData('alert');
            $markupData = [[$button1, $button2], [$button3, $button4]];
            $inlineReplyMarkup = new InlineKeyboardMarkup($markupData);
            if (!empty($message->from) && !empty($message->chat)) {
                switch ($message->chat->type) {
                    case Chat::TYPE_PRIVATE:
                        printf("  Sending answer to a user %s\n", $message->chat->id);
                        $method = new SendMessage($message->chat->id, $message->text);
                        $method->setReplyMarkup($inlineReplyMarkup);
                        return $method;
                        break;
                    case Chat::TYPE_GROUP:
                    case Chat::TYPE_SUPERGROUP:
                        printf("  Inline keyboard is available only for private chats\n");
                        break;
                }
            }
        }
    } elseif (!empty($update->callbackQuery)) {
        $callbackQuery = $update->callbackQuery;
        printf(" CallbackQuery received:\n");
        print_r($callbackQuery);
        $method = new AnswerCallbackQuery($callbackQuery->id);
        if ($callbackQuery->data == 'text') {
            $method->setText("Show text");
        } elseif ($callbackQuery->data == 'alert') {
            $method->setShowAlert(true);
            $method->setText("Show alert");
        }
        return $method;
    }
    return null;
}
 protected function stateWaitingCommand(Update $update) : \Generator
 {
     if (!empty($update->message)) {
         $message = $update->message;
         if (!empty($update->message->text)) {
             printf("  Got message: %s\n", $message->text);
             if (!empty($message->from) && !empty($message->chat)) {
                 switch ($message->chat->type) {
                     case Chat::TYPE_PRIVATE:
                         switch ($message->text) {
                             case '/text':
                                 yield from $this->textCommand();
                                 break;
                             case '/markup':
                                 yield from $this->markupCommand();
                                 break;
                             case '/end':
                                 yield from $this->endCommand();
                                 break;
                         }
                         break;
                     case Chat::TYPE_GROUP:
                     case Chat::TYPE_SUPERGROUP:
                         printf("  Edit message is available only for private chats\n");
                         break;
                 }
             }
         }
     } elseif (!empty($update->callbackQuery)) {
         $callbackQuery = $update->callbackQuery;
         printf(" CallbackQuery received:\n");
         print_r($callbackQuery);
         $method = new AnswerCallbackQuery($callbackQuery->id);
         if ($callbackQuery->data == 'text') {
             $method->setText("Show text");
         } elseif ($callbackQuery->data == 'alert') {
             $method->setShowAlert(true);
             $method->setText("Show alert");
         } elseif ($callbackQuery->data == 'edit') {
             $newText = $this->message->text . ' edit-callback';
             $editMethod = new EditMessageText($newText);
             $editMethod->setMessageId($this->message->messageId);
             $editMethod->setChatId($this->message->chat->id);
             $editMethod->setReplyMarkup($this->inlineKeyboardMarkup);
             $this->message = (yield from $this->api->execute($editMethod));
         }
         yield from $this->api->execute($method);
     }
     return null;
 }