src/Library/TelegramBot/BaseTelegramBot.php line 44

Open in your IDE?
  1. <?php
  2. namespace App\Library\TelegramBot;
  3. use App\Entity\Image;
  4. use App\Entity\TelegramUser;
  5. use App\Exception\TelegramBot\MessageEditedBySameTextException;
  6. use App\Exception\TelegramBot\MessageToEditNotFoundException;
  7. use App\Library\TelegramBot\TelegramObject\Update;
  8. use App\Library\Utils\Other\Other;
  9. use App\Service\EntityManagerService;
  10. use App\Service\Image\ImageService;
  11. use App\Service\TelegramBot\TelegramBotService;
  12. use App\Service\TelegramBotNavigation\TelegramBotNavigationService;
  13. use App\Service\TelegramMessage\TelegramMessageService;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Psr\Log\LoggerInterface;
  16. abstract class BaseTelegramBot extends AbstractTelegramBot
  17. {
  18.     /**
  19.      * @var string
  20.      */
  21.     private $innerBotId;
  22.     /**
  23.      * @var TelegramBotService
  24.      */
  25.     protected $telegramBotService;
  26.     /**
  27.      * @var TelegramBotNavigationService
  28.      */
  29.     protected $telegramBotNavigationService;
  30.     /**
  31.      * @var ImageService
  32.      */
  33.     protected $imageService;
  34.     public function __construct(LoggerInterface $loggerEntityManagerInterface $em,
  35.                                 TelegramMessageService $telegramMessageServiceEntityManagerService $emService,
  36.                                 TelegramBotService $telegramBotService,
  37.                                 TelegramBotNavigationService $telegramBotNavigationService,
  38.                                 ImageService $imageService)
  39.     {
  40.         parent::__construct($logger$em$telegramMessageService$emService);
  41.         $this->telegramBotService $telegramBotService;
  42.         $this->telegramBotNavigationService $telegramBotNavigationService;
  43.         $this->imageService $imageService;
  44.     }
  45.     public function getInnerBotId(): ?string
  46.     {
  47.         if (!$this->innerBotId) {
  48.             throw new \Exception("Inner bot id is not set");
  49.         }
  50.         return $this->innerBotId;
  51.     }
  52.     protected function setInnerBotId(string $botId): void
  53.     {
  54.         $this->innerBotId $botId;
  55.     }
  56.     public function getTelegramBotEntity(): \App\Entity\TelegramBot
  57.     {
  58.         return $this->telegramBotService->createOrGetDefault(["innerBotId" => $this->getInnerBotId()]);
  59.     }
  60.     public function setNavigationItems(TelegramUser $userstring $navigationGroupId, array $navigationItems): void
  61.     {
  62.         foreach ($navigationItems as $key => $value) {
  63.             if (strpos($key$navigationGroupId "__") !== 0) {
  64.                 throw new \Exception("Navigation item keys should start with " $navigationGroupId "__");
  65.             }
  66.         }
  67.         $nav $this->telegramBotNavigationService->getOrCreateNavigation($user$this->getInnerBotId());
  68.         $nav->setNavigationGroupData($navigationGroupId$navigationItems);
  69.         $this->em->flush();
  70.     }
  71.     public function getNavigationItems(TelegramUser $userstring $navigationGroupId): ?array
  72.     {
  73.         $nav $this->telegramBotNavigationService->getOrCreateNavigation($user$this->getInnerBotId());
  74.         return $nav->getNavigationGroupData($navigationGroupId);
  75.     }
  76.     public function getNavigationData(TelegramUser $user): ?array
  77.     {
  78.         $nav $this->telegramBotNavigationService->getOrCreateNavigation($user$this->getInnerBotId());
  79.         return $nav->getData();
  80.     }
  81.     public function setNavigationSelectedItemId(TelegramUser $userstring $navigationGroupId, ?string $selectedItemId): void
  82.     {
  83.         $nav $this->telegramBotNavigationService->getOrCreateNavigation($user$this->getInnerBotId());
  84.         $nav->setSelectedItemId($navigationGroupId$selectedItemId);
  85.         $this->em->flush();
  86.     }
  87.     public function getNavigationSelectedItem(TelegramUser $userstring $navigationGroupId)
  88.     {
  89.         $nav $this->telegramBotNavigationService->getOrCreateNavigation($user$this->getInnerBotId());
  90.         return $nav->getSelectedItem($navigationGroupId);
  91.     }
  92.     public function setNavigationSelectedItemIdByUpdate(TelegramUser $userUpdate $update): void
  93.     {
  94.         $selectedItemId $update->getCallbackQuery()->getDataField();
  95.         $navigationGroupId $this->getNavigationMenuIdByUpdate($update);
  96.         $this->setNavigationSelectedItemId($user$navigationGroupId$selectedItemId);
  97.         $this->em->flush();
  98.     }
  99.     public function getNavigationMenuIdByUpdate(Update $update): string
  100.     {
  101.         $selectedItemId $update->getCallbackQuery()->getDataField();
  102.         $navigationGroupId explode("__"$selectedItemId)[0];
  103.         return $navigationGroupId;
  104.     }
  105.     public function downloadMessagePhoto(Update $update): Image
  106.     {
  107.         $path parent::downloadMessagePhoto($update);
  108.         $image $this->imageService->createOrGetDefault(["path" => $path]);
  109.         return $image;
  110.     }
  111.     public function setEditableMessageId(TelegramUser $userstring $messageId, ?string $telegramMessageId): self
  112.     {
  113.         $nav $this->telegramBotNavigationService->getOrCreateNavigation($user$this->getInnerBotId());
  114.         $nav->setEditableMessageId($messageId$telegramMessageId);
  115.         $this->em->flush();
  116.         return $this;
  117.     }
  118.     public function getEditableMessageId(TelegramUser $userstring $messageId): ?string
  119.     {
  120.         $nav $this->telegramBotNavigationService->getOrCreateNavigation($user$this->getInnerBotId());
  121.         return $nav->getEditableMessageId($messageId);
  122.     }
  123.     public function editOrSendEditableMessage(TelegramUser $userstring $chatIdstring $messageId,
  124.         string $text null, array $replyMarkup nullstring $imageFileId null): void
  125.     {
  126.         $telegramMessageId $this->getEditableMessageId($user$messageId);
  127.         try {
  128.             $this->editRemoteMessage($chatId$telegramMessageId$text$replyMarkup$imageFileId);
  129.         } catch (MessageToEditNotFoundException $e) {
  130.             $telegramMessageId null;
  131.             $sentMessage $this->sendMessage($chatId$text$replyMarkup$imageFileId);
  132.             $telegramMessageId $sentMessage->getMessageId();
  133.             $this->setEditableMessageId($user$messageId$telegramMessageId);
  134.         } catch (MessageEditedBySameTextException $e) {
  135.             //do nothing
  136.         }
  137.     }
  138. }