yourtar-cli 1.3.3 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/bin/backTemplate/Makefile +7 -0
  2. package/bin/backTemplate/config/packages/monolog.yaml +61 -0
  3. package/bin/backTemplate/docker/config/promtail/config.yml +18 -0
  4. package/bin/backTemplate/docker/docker-compose.prod.yml +11 -0
  5. package/bin/backTemplate/docker/docker-compose.stage.yml +11 -0
  6. package/bin/backTemplate/src/Logging/YTExtraDataProcessor.php +20 -0
  7. package/bin/botTemplate/.env.dev-example +4 -2
  8. package/bin/botTemplate/.env.prod-example +4 -2
  9. package/bin/botTemplate/.env.stage-example +4 -2
  10. package/bin/botTemplate/Makefile +21 -2
  11. package/bin/botTemplate/config/packages/monolog.yaml +61 -0
  12. package/bin/botTemplate/docker/config/promtail/config.yml +18 -0
  13. package/bin/botTemplate/docker/docker-compose.prod.yml +11 -0
  14. package/bin/botTemplate/docker/docker-compose.stage.yml +11 -0
  15. package/bin/botTemplate/src/Controller/MessageController.php +74 -11
  16. package/bin/botTemplate/src/Entity/Chat.php +39 -25
  17. package/bin/botTemplate/src/Entity/DialogContext.php +1 -32
  18. package/bin/botTemplate/src/Entity/User.php +93 -0
  19. package/bin/botTemplate/src/Logging/YTExtraDataProcessor.php +20 -0
  20. package/bin/botTemplate/src/Repository/UserRepository.php +43 -0
  21. package/bin/botTemplate/src/Service/Service/MessageProcessService.php +34 -0
  22. package/bin/botTemplate/src/Service/Service/MessageThemeService/CustomMessageService.php +164 -0
  23. package/bin/botTemplate/src/Service/Service/MessageThemeService/MessageServiceTemplate.php +79 -0
  24. package/bin/botTemplate/src/Service/Service/MessageThemeService/MessageThemeInterface.php +8 -0
  25. package/bin/botTemplate/src/Service/Service/MessengerService/MaxService.php +275 -0
  26. package/bin/botTemplate/src/Service/Service/MessengerService/MessengerInterface.php +22 -0
  27. package/bin/botTemplate/src/Service/Service/MessengerService/TelegramService.php +195 -0
  28. package/bin/botTemplate/src/Service/Service/MessengerService/VkService.php +590 -0
  29. package/bin/index.js +5 -2
  30. package/package.json +1 -1
  31. package/bin/botTemplate/src/Service/MessageProcessService.php +0 -256
  32. package/bin/botTemplate/src/Service/TelegramService.php +0 -227
@@ -0,0 +1,93 @@
1
+ <?php
2
+
3
+ namespace App\Entity;
4
+
5
+ use App\Repository\UserRepository;
6
+ use Doctrine\Common\Collections\ArrayCollection;
7
+ use Doctrine\Common\Collections\Collection;
8
+ use Doctrine\ORM\Mapping as ORM;
9
+
10
+ #[ORM\Entity(repositoryClass: UserRepository::class)]
11
+ class User
12
+ {
13
+ #[ORM\Id]
14
+ #[ORM\GeneratedValue]
15
+ #[ORM\Column]
16
+ private ?int $id = null;
17
+
18
+ #[ORM\Column(length: 255, nullable: true)]
19
+ private ?string $phone = null;
20
+
21
+ /**
22
+ * @var Collection<int, Chat>
23
+ */
24
+ #[ORM\OneToMany(targetEntity: Chat::class, mappedBy: 'user', orphanRemoval: true)]
25
+ private Collection $chats;
26
+
27
+ #[ORM\Column(length: 255, nullable: true)]
28
+ private ?string $role = null;
29
+
30
+ public function __construct()
31
+ {
32
+ $this->chats = new ArrayCollection();
33
+ }
34
+
35
+ public function getId(): ?int
36
+ {
37
+ return $this->id;
38
+ }
39
+
40
+ public function getPhone(): ?string
41
+ {
42
+ return $this->phone;
43
+ }
44
+
45
+ public function setPhone(?string $phone): static
46
+ {
47
+ $this->phone = $phone;
48
+
49
+ return $this;
50
+ }
51
+
52
+ /**
53
+ * @return Collection<int, Chat>
54
+ */
55
+ public function getChats(): Collection
56
+ {
57
+ return $this->chats;
58
+ }
59
+
60
+ public function addChat(Chat $chat): static
61
+ {
62
+ if (!$this->chats->contains($chat)) {
63
+ $this->chats->add($chat);
64
+ $chat->setUser($this);
65
+ }
66
+
67
+ return $this;
68
+ }
69
+
70
+ public function removeChat(Chat $chat): static
71
+ {
72
+ if ($this->chats->removeElement($chat)) {
73
+ // set the owning side to null (unless already changed)
74
+ if ($chat->getUser() === $this) {
75
+ $chat->setUser(null);
76
+ }
77
+ }
78
+
79
+ return $this;
80
+ }
81
+
82
+ public function getRole(): ?string
83
+ {
84
+ return $this->role;
85
+ }
86
+
87
+ public function setRole(?string $role): static
88
+ {
89
+ $this->role = $role;
90
+
91
+ return $this;
92
+ }
93
+ }
@@ -0,0 +1,20 @@
1
+ <?php
2
+
3
+ namespace App\Logging;
4
+
5
+ use Monolog\Attribute\AsMonologProcessor;
6
+ use Monolog\LogRecord;
7
+ use Monolog\Processor\ProcessorInterface;
8
+
9
+ #[AsMonologProcessor]
10
+ class YTExtraDataProcessor implements ProcessorInterface
11
+ {
12
+ public function __invoke(LogRecord $record): LogRecord
13
+ {
14
+ // Add data to the 'extra' array
15
+ $record->extra['yourtar_log'] = true;
16
+ $record->extra['project'] = '{{name}}';
17
+
18
+ return $record;
19
+ }
20
+ }
@@ -0,0 +1,43 @@
1
+ <?php
2
+
3
+ namespace App\Repository;
4
+
5
+ use App\Entity\User;
6
+ use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
7
+ use Doctrine\Persistence\ManagerRegistry;
8
+
9
+ /**
10
+ * @extends ServiceEntityRepository<User>
11
+ */
12
+ class UserRepository extends ServiceEntityRepository
13
+ {
14
+ public function __construct(ManagerRegistry $registry)
15
+ {
16
+ parent::__construct($registry, User::class);
17
+ }
18
+
19
+ // /**
20
+ // * @return User[] Returns an array of User objects
21
+ // */
22
+ // public function findByExampleField($value): array
23
+ // {
24
+ // return $this->createQueryBuilder('u')
25
+ // ->andWhere('u.exampleField = :val')
26
+ // ->setParameter('val', $value)
27
+ // ->orderBy('u.id', 'ASC')
28
+ // ->setMaxResults(10)
29
+ // ->getQuery()
30
+ // ->getResult()
31
+ // ;
32
+ // }
33
+
34
+ // public function findOneBySomeField($value): ?User
35
+ // {
36
+ // return $this->createQueryBuilder('u')
37
+ // ->andWhere('u.exampleField = :val')
38
+ // ->setParameter('val', $value)
39
+ // ->getQuery()
40
+ // ->getOneOrNullResult()
41
+ // ;
42
+ // }
43
+ }
@@ -0,0 +1,34 @@
1
+ <?php
2
+
3
+ namespace App\Service;
4
+
5
+ use App\Entity\Chat;
6
+ use App\Entity\DialogContext;
7
+ use App\Service\MessageThemeService\CustomMessageService;
8
+ use Doctrine\ORM\EntityManagerInterface;
9
+ use Psr\Log\LoggerInterface;
10
+
11
+ class MessageProcessService
12
+ {
13
+ private ?EntityManagerInterface $em = null;
14
+ private ?LoggerInterface $logger;
15
+
16
+ public function __construct(EntityManagerInterface $em, LoggerInterface $logger)
17
+ {
18
+ $this->em = $em;
19
+ $this->logger = $logger;
20
+ }
21
+
22
+ public function processMessage(array $message): bool
23
+ {
24
+ $this->logger->error('msg '. json_encode($message));
25
+
26
+ $messageIsProcessed = false;
27
+ // add Message services
28
+ if (!$messageIsProcessed) $messageIsProcessed = new CustomMessageService($this->em, $this->logger)->processMessage($message);
29
+ /* ADD Service */
30
+
31
+ return $messageIsProcessed;
32
+ }
33
+
34
+ }
@@ -0,0 +1,164 @@
1
+ <?php
2
+
3
+ namespace App\Service\MessageThemeService;
4
+
5
+ use App\Entity\Chat;
6
+ use App\Entity\DialogContext;
7
+ use App\Entity\User;
8
+ use App\Service\MessengerService\VkService;
9
+ use Doctrine\ORM\EntityManagerInterface;
10
+ use Psr\Log\LoggerInterface;
11
+
12
+ class CustomMessageService implements MessageThemeInterface
13
+ {
14
+ private ?EntityManagerInterface $em = null;
15
+
16
+ private ?LoggerInterface $logger;
17
+
18
+ private $paginationCount = 3;
19
+ private $comission = 10;
20
+
21
+ public function __construct(EntityManagerInterface $em, LoggerInterface $logger)
22
+ {
23
+ $this->em = $em;
24
+ $this->logger = $logger;
25
+ }
26
+
27
+ public function processMessage($message): bool
28
+ {
29
+ $this->logger->debug('Processing message', ['message' => $message]);
30
+ $isProcessed = true;
31
+
32
+ $chat = $this->em->getRepository(Chat::class)->findOneBy(array('chatId' => $message['from']), array('id' => 'desc'));
33
+ $context = $this->em->getRepository(DialogContext::class)->findOneBy(['chat' => $chat]);
34
+ if (array_key_exists('message', $message)) {
35
+ $arr = explode(' ', $message['message']);
36
+
37
+ //Comment: Это свитч для работы с командами и ручным вводом
38
+ switch (strtolower($arr[0])) {
39
+ case '/start':
40
+ $isInit = false;
41
+ if (!$chat instanceof Chat) {
42
+ $chat = new Chat();
43
+ if (array_key_exists('username', $message)) $chat->setUsername($message['username']);
44
+ if (array_key_exists('userId', $message)) $chat->setUserId($message['userId']);
45
+ $chat->setChatId($message['from']);
46
+ $chat->setType(match ($message['type']) {
47
+ 'MAX' => Chat::TYPE_MAX,
48
+ 'TG' => Chat::TYPE_TG,
49
+ 'VK' => Chat::TYPE_VK,
50
+ });
51
+
52
+ $user = new User();
53
+ $this->em->persist($user);
54
+ $chat->setUser($user);
55
+
56
+ $this->em->persist($chat);
57
+ $this->em->flush();
58
+ $isInit = true;
59
+ }
60
+
61
+ $responseText = "";
62
+
63
+ if ($isInit) $responseText = "Добрый день! Вы попали в чат-бота!";
64
+
65
+ if (strlen($responseText) > 0) $resp = $chat->getMessenger()->sendMessage($responseText);
66
+
67
+ if (is_null($chat->getPhone())) {
68
+ $resp = $chat->getMessenger()->sendKeyboardMessage("Поделитесь, пожалуйста, номером телефона", [
69
+ [['text' => 'Поделиться номером телефона', 'request_contact' => true]]
70
+ ]);
71
+ $this->logger->error('resp', $resp);
72
+ }
73
+ if ($chat->getMessenger() instanceof VkService) $chat->getMessenger()->sendKeyboardMessage("Воспользуйтесь меню для работы с ботом", [
74
+ [['text' => 'Меню'],],
75
+ ]);
76
+ break;
77
+ case '/example':
78
+ // $context = new DialogContext();
79
+ // $context->setChat($chat);
80
+ // $context->setContext(['data' => ['files'],]);
81
+ // $this->dialogRepo->add($context, true);
82
+ //
83
+ // $buttons = [];
84
+ // $responseText = "В данном разделе Вы можете заказать и оплатить услуги печати из Библиотеки ТУСУР с доставкой в корпус или общежитие\r\n\r\n" .
85
+ // "Прикрепите, пожалуйста, файлы для печати";
86
+ //
87
+ // $messenger->sendMessage($responseText, $from, $buttons);
88
+ break;
89
+ case '/help':
90
+ case '?':
91
+ $buttons = [];
92
+ if ($chat->getUser()->getRole() === Chat::ROLE_ADMIN) {
93
+ $responseText = "Приветствую! Я Вас узнал) Вы из администрации бота\r\n" .
94
+ "Что желаете сделать?\r\n\r\n" .
95
+ "P.S.: бот с любовью и заботой разработан командой @yourtar";
96
+ $buttons[] = [['text' => 'Админ. панель', 'callback_data' => json_encode(array('command' => 'adminMenu',)),]];
97
+ $buttons[] = [['text' => 'Статистика', 'callback_data' => json_encode(array('command' => 'stats',)),]];
98
+ } else {
99
+ $responseText = "Добро пожаловать в чат-бота !\r\n\r\n" .
100
+ "P.S.: бот с любовью и заботой разработан командой @yourtar!";
101
+ }
102
+
103
+ $chat->getMessenger()->sendMessage($responseText, $buttons);
104
+ break;
105
+ default:
106
+ if ($context instanceof DialogContext) {
107
+ //Comment: Это свитч для работы с контектом ввода (когда вводят ответ на вопрос бота)
108
+ switch ($context->getContext()['data'][0]) {
109
+ case 'example':
110
+
111
+ break;
112
+ default:
113
+ $isProcessed = false;
114
+ break;
115
+ }
116
+ }
117
+ // else if (array_key_exists('photo', $message['message']) && count($message['message']['photo']) > 1 && array_key_exists('media_group_id', $message)) {
118
+ // $ms = $this->em->getRepository(MessageSending::class)->findOneBy(array('photoMediaGroupId' => $message['media_group_id']));
119
+
120
+ // if ($ms instanceof MessageSending) {
121
+ // $file = $messenger->getFile(end($message['message']['photo'])['file_id']);
122
+
123
+ // $files = $ms->getImage();
124
+ // $files[] = $file;
125
+ // $ms->setImage($files);
126
+ // $this->em->flush();
127
+ // }
128
+ // }
129
+ else $isProcessed = false;
130
+ break;
131
+ }
132
+ }
133
+ else if (array_key_exists('data', $message)) {
134
+ $arr = json_decode($message['data'], true);
135
+
136
+ //Comment: Это свитч для работы с командами и ручным вводом
137
+ switch ($arr['command']) {
138
+ case 'adminMenu':
139
+ $chat->getMessenger()->deleteMessage($message['message_id']);
140
+ $chat->getMessenger()->sendMessage("Чем хотите управлять?", [
141
+ [['text' => 'Адреса', 'callback_data' => json_encode(array('command' => 'branchList',)),]],
142
+ [['text' => 'Услуги', 'callback_data' => json_encode(array('command' => 'serviceList',)),]],
143
+ [['text' => 'Пользоваатели', 'callback_data' => json_encode(array('command' => 'users',)),]],
144
+ ]);
145
+ break;
146
+ default:
147
+ $isProcessed = false;
148
+ break;
149
+ }
150
+ }
151
+
152
+ if (array_key_exists('phone', $message) && $chat) {
153
+ $phone = preg_replace('/[^0-9+]/', '', $chat->getPhone());
154
+ $phone = substr($phone, -10);
155
+ $chat->setPhone($phone);
156
+ if (is_null($chat->getUser()->getPhone())) $chat->getUser()->setPhone($phone);
157
+ $chat->getMessenger()->sendMessage("Спасибо, что поделились номером!");
158
+
159
+ $this->em->flush();
160
+ }
161
+
162
+ return $isProcessed;
163
+ }
164
+ }
@@ -0,0 +1,79 @@
1
+ <?php
2
+
3
+ namespace App\Service\MessageThemeService;
4
+
5
+ use App\Entity\Chat;
6
+ use App\Entity\DialogContext;
7
+ use App\Service\MessengerService\VkService;
8
+ use Doctrine\ORM\EntityManagerInterface;
9
+ use Psr\Log\LoggerInterface;
10
+
11
+ class MessageServiceTemplate implements MessageThemeInterface
12
+ {
13
+ private ?EntityManagerInterface $em = null;
14
+
15
+ private ?LoggerInterface $logger;
16
+
17
+ private $paginationCount = 3;
18
+ private $comission = 10;
19
+
20
+ public function __construct(EntityManagerInterface $em, LoggerInterface $logger)
21
+ {
22
+ $this->em = $em;
23
+ $this->logger = $logger;
24
+ }
25
+
26
+ public function processMessage(array $message):bool
27
+ {
28
+ $isProcessed = true;
29
+
30
+ $chat = $this->em->getRepository(Chat::class)->findOneBy(array('chatId' => $message['from']), array('id' => 'desc'));
31
+ $context = $this->em->getRepository(DialogContext::class)->findOneBy(['chat' => $chat]);
32
+ if (array_key_exists('message', $message)) {
33
+ $from = $message['from'];
34
+
35
+ $arr = explode(' ', $message['message']);
36
+
37
+ //Comment: Это свитч для работы с командами и ручным вводом
38
+ switch (strtolower($arr[0])) {
39
+ case 'example':
40
+
41
+ break;
42
+ default:
43
+ if ($context instanceof DialogContext) {
44
+ //Comment: Это свитч для работы с контектом ввода (когда вводят ответ на вопрос бота)
45
+ switch ($context->getContext()['data'][0]) {
46
+ case 'example':
47
+
48
+ break;
49
+ default:
50
+ $isProcessed = false;
51
+ break;
52
+ }
53
+ }
54
+ else $isProcessed = false;
55
+ break;
56
+ }
57
+ }
58
+ else if (array_key_exists('data', $message)) {
59
+ $arr = json_decode($message['data'], true);
60
+
61
+ //Comment: Это свитч для работы с командами и ручным вводом
62
+ switch ($arr['command']) {
63
+ case 'example':
64
+ // $chat->getMessenger()->deleteMessage($message['message_id'], $chat);
65
+ // $chat->getMessenger()->sendMessage("Чем хотите управлять?", $chat, [
66
+ // [['text' => 'Адреса', 'callback_data' => json_encode(array('command' => 'branchList',)),]],
67
+ // [['text' => 'Услуги', 'callback_data' => json_encode(array('command' => 'serviceList',)),]],
68
+ // [['text' => 'Пользоваатели', 'callback_data' => json_encode(array('command' => 'users',)),]],
69
+ // ]);
70
+ break;
71
+ default:
72
+ $isProcessed = false;
73
+ break;
74
+ }
75
+ }
76
+
77
+ return $isProcessed;
78
+ }
79
+ }
@@ -0,0 +1,8 @@
1
+ <?php
2
+
3
+ namespace App\Service\MessageThemeService;
4
+
5
+ interface MessageThemeInterface
6
+ {
7
+ public function processMessage(array $message): bool;
8
+ }