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,275 @@
1
+ <?php
2
+
3
+ namespace App\Service\MessengerService;
4
+
5
+ use App\Entity\Chat;
6
+ use CURLFile;
7
+ use Exception;
8
+
9
+ class MaxService implements MessengerInterface
10
+ {
11
+ private ?string $token = null;
12
+ private ?Chat $chat = null;
13
+
14
+ public function __construct(?Chat $chat = null)
15
+ {
16
+ $this->chat = $chat;
17
+ $this->token = $_ENV['MAX_TOKEN'];
18
+ }
19
+
20
+ public function normalizeMessage(array $message): array
21
+ {
22
+ $data = $message['update_type'] === 'message_callback' ? array(
23
+ 'callback_query' => array(
24
+ 'message' => array(
25
+ 'chat' => array('id' => $message['message']['recipient']['chat_id']),
26
+ 'message_id' => $message['message']['body']['mid'],
27
+ ),
28
+ 'data' => $message['callback']['payload'],
29
+ ),
30
+ ) : array(
31
+ 'message' => $message['message']['body']['text'] ?? null,
32
+ 'chatId' => $message['chat_id'] ?? $message['message']['recipient']['chat_id'],
33
+ 'from' => $message['chat_id'] ?? $message['message']['recipient']['chat_id'],
34
+ 'username' => array_key_exists('user', $message) ? $message['user']['last_name'] . ' ' . $message['user']['first_name'] : null,
35
+ 'userId' => $message['user']['user_id'] ?? $message['message']['recipient']['user_id'],
36
+ 'type' => 'MAX',
37
+ );
38
+ if (array_key_exists('message', $message) && array_key_exists('body', $message['message']) && array_key_exists('attachments', $message['message']['body'])) {
39
+ $phone = 'fuck';
40
+ foreach ($message['message']['body']['attachments'] as $attachment) {
41
+ if ($attachment['type'] === 'contact') {
42
+ $str = $attachment['payload']['vcf_info'];
43
+ $str = explode('cell:', $str)[1];
44
+ if (is_string($str)) {
45
+ $str = explode('\r\n', $str)[0];
46
+ }
47
+ if (is_string($str)) {
48
+ $phone = preg_replace('/[^0-9+]/', '', $str);
49
+ $phone = substr($phone, -10);
50
+ }
51
+ }
52
+ }
53
+ if ($phone /*&& strlen($phone) === 10*/) $data['phone'] = $phone;
54
+ }
55
+ if ($message['update_type'] === 'bot_started') $data['message'] = '/start';
56
+ $data['type'] = 'MAX';
57
+
58
+ return $data;
59
+ }
60
+
61
+ public function sendMessage(string $message, ?array $buttons = null, ?array $photos = null)
62
+ {
63
+ $data = array ("text" => $message, 'format' => 'html',);
64
+ if ($buttons !== null && count($buttons) > 0) {
65
+ $buttonsAttach = array();
66
+ foreach ($buttons as $key => $buttonLine) {
67
+ $buttonsAttach[] = array();
68
+ foreach ($buttonLine as $button) {
69
+ if (array_key_exists('request_contact', $button)) $buttonsAttach[$key][] = array(
70
+ "text" => $button['text'],
71
+ 'type' => 'request_contact',
72
+ );
73
+ else $buttonsAttach[$key][] = array(
74
+ "text" => $button['text'],
75
+ 'type' => 'callback',
76
+ 'payload' => $button['callback_data'],
77
+ );
78
+ }
79
+ }
80
+
81
+ $data['attachments'] = array(
82
+ array(
83
+ 'type' => 'inline_keyboard',
84
+ 'payload' => array(
85
+ 'buttons' => $buttonsAttach,
86
+ ),
87
+ )
88
+ );
89
+ }
90
+
91
+ $resp = $this->sendRequest('messages?chat_id=' . $this->chat->getChatId(), 'POST', json_encode($data));
92
+
93
+ return $resp;
94
+ }
95
+
96
+ public function sendKeyboardMessage(string $message, ?array $buttons = null)
97
+ {
98
+ return $this->sendMessage($message, $buttons);
99
+ }
100
+
101
+ public function sendVideo(string $message, ?string $video = null)
102
+ {
103
+ // $curl = curl_init();
104
+ //
105
+ // curl_setopt_array($curl, array(
106
+ // CURLOPT_URL => 'https://api.telegram.org/bot' . $this->token . '/sendVideo?',
107
+ // CURLOPT_RETURNTRANSFER => true,
108
+ // CURLOPT_ENCODING => '',
109
+ // CURLOPT_MAXREDIRS => 10,
110
+ // CURLOPT_TIMEOUT => 0,
111
+ // CURLOPT_FOLLOWLOCATION => true,
112
+ // CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
113
+ // CURLOPT_CUSTOMREQUEST => 'POST',
114
+ // CURLOPT_POSTFIELDS => array('video' => new CURLFILE($video), 'caption' => $message, 'chat_id' => $this->chatId,
115
+ // 'width' => 1920, 'height' => 1080, 'cover' => new CURLFILE('/var/www/html/public/files/1.png')),
116
+ // ));
117
+ //
118
+ // $resp = curl_exec($curl);
119
+ // curl_close($curl);
120
+ //
121
+ // return json_decode($resp, true);
122
+ }
123
+
124
+ public function getFile(array|string $id)
125
+ {
126
+ // $curl = curl_init();
127
+ // curl_setopt_array($curl, array(
128
+ // CURLOPT_URL => 'https://api.telegram.org/bot' . $this->token . '/getFile?file_id=' . $id,
129
+ // CURLOPT_RETURNTRANSFER => true,
130
+ // CURLOPT_ENCODING => '',
131
+ // CURLOPT_MAXREDIRS => 10,
132
+ // CURLOPT_TIMEOUT => 0,
133
+ // CURLOPT_FOLLOWLOCATION => true,
134
+ // CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
135
+ // CURLOPT_CUSTOMREQUEST => 'GET',
136
+ // ));
137
+ // $response = json_decode(curl_exec($curl), true);
138
+ // curl_close($curl);
139
+ //
140
+ // if (array_key_exists('result', $response)) {
141
+ // $response = $response['result'];
142
+ //
143
+ // $fileUrl = "https://api.telegram.org/file/bot" . $this->token . "/" . $response['file_path'];
144
+ // $fileContents = file_get_contents($fileUrl);
145
+ // $filename = basename($response['file_path']);
146
+ //
147
+ // file_put_contents("/var/www/html/public/downloads/$filename", $fileContents);
148
+ //
149
+ // return $filename;
150
+ // }
151
+ //
152
+ // return false;
153
+ }
154
+
155
+ public function deleteMessage(string $id)
156
+ {
157
+ $resp = $this->sendRequest('messages?message_id=' . $id, 'DELETE');
158
+ return $resp;
159
+ }
160
+
161
+ public function checkSubscribe($userId)
162
+ {
163
+ // $channelId = '@SrbRF';
164
+ // $channelId = '@yourtar';
165
+ // $curl = curl_init();
166
+ // curl_setopt_array($curl, array(
167
+ // CURLOPT_URL => 'https://api.telegram.org/bot' . $this->token . '/getChatMember?chat_id=' . $channelId . '&user_id=' . $userId,
168
+ // CURLOPT_RETURNTRANSFER => true,
169
+ // CURLOPT_ENCODING => '',
170
+ // CURLOPT_MAXREDIRS => 10,
171
+ // CURLOPT_TIMEOUT => 0,
172
+ // CURLOPT_FOLLOWLOCATION => true,
173
+ // CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
174
+ // CURLOPT_CUSTOMREQUEST => 'GET',
175
+ // ));
176
+ // $resp = json_decode(curl_exec($curl), true);
177
+ // curl_close($curl);
178
+ //
179
+ // return $resp;
180
+ }
181
+
182
+ public function sendDocument(string $message, string $document, ?array $buttons = null)
183
+ {
184
+ //get link for file upload
185
+ $resp = $this->sendRequest('uploads?type=file', 'POST');
186
+
187
+ //upload file
188
+ if (!array_key_exists('url', $resp)) return []; //fix correct error data
189
+ $curl = curl_init($resp['url']);
190
+ curl_setopt($curl, CURLOPT_POST, true);
191
+ curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
192
+ curl_setopt($curl, CURLOPT_POSTFIELDS, array('data' => new CURLfile($document)));
193
+ $resp = json_decode(curl_exec($curl), true);
194
+ $error = curl_error($curl);
195
+ curl_close($curl);
196
+ $fileToken = $resp['token'];
197
+
198
+ //send file
199
+ $data = array ("text" => $message, 'format' => 'html',);
200
+ if ($buttons !== null && count($buttons) > 0) {
201
+ $buttonsAttach = array();
202
+ foreach ($buttons as $key => $buttonLine) {
203
+ $buttonsAttach[] = array();
204
+ foreach ($buttonLine as $button) {
205
+ $buttonsAttach[$key][] = array(
206
+ "text" => $button['text'],
207
+ 'type' => 'callback',
208
+ 'payload' => $button['callback_data'],
209
+ );
210
+ }
211
+ }
212
+
213
+ $data['attachments'] = array(
214
+ array(
215
+ 'type' => 'inline_keyboard',
216
+ 'payload' => array(
217
+ 'buttons' => $buttonsAttach,
218
+ ),
219
+ )
220
+ );
221
+ }
222
+ if (!array_key_exists('attachments', $data)) $data['attachments'] = array();
223
+ $data['attachments'][] = array(
224
+ 'type' => 'file',
225
+ 'payload' => array('token' => $fileToken),
226
+ );
227
+
228
+ sleep(2);
229
+ $resp = $this->sendRequest('messages?chat_id=' . $this->chat->getChatId(), 'POST', json_encode($data));
230
+
231
+ return $resp;
232
+ }
233
+
234
+ /**
235
+ * @throws Exception
236
+ */
237
+ private function sendRequest(string $uri, string $method = 'GET', null|array|string $body = null) {
238
+ $curl = curl_init();
239
+ curl_setopt_array($curl, array(
240
+ CURLOPT_URL => 'https://platform-api.max.ru/' . $uri,
241
+ CURLOPT_RETURNTRANSFER => true,
242
+ CURLOPT_ENCODING => '',
243
+ CURLOPT_MAXREDIRS => 10,
244
+ CURLOPT_TIMEOUT => 0,
245
+ CURLOPT_FOLLOWLOCATION => true,
246
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
247
+ CURLOPT_CUSTOMREQUEST => $method,
248
+ CURLOPT_HTTPHEADER => is_string($body) ? array(
249
+ 'Content-Type: application/json',
250
+ 'Authorization: ' . $this->token,
251
+ ) : array(
252
+ 'Authorization: ' . $this->token,
253
+ ),
254
+ ));
255
+ if (!is_null($body)) curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
256
+
257
+ $resp = curl_exec($curl);
258
+
259
+ if (curl_errno($curl)) {
260
+ throw new Exception('Connection Error: ' . curl_error($curl));
261
+ } else {
262
+ $http_status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
263
+
264
+ if ($http_status != 200) {
265
+ throw new Exception("Request failed with HTTP Code: " . $http_status);
266
+ }
267
+ }
268
+
269
+ $resp = json_decode($resp, true);
270
+
271
+ curl_close($curl);
272
+
273
+ return $resp;
274
+ }
275
+ }
@@ -0,0 +1,22 @@
1
+ <?php
2
+
3
+ namespace App\Service\MessengerService;
4
+
5
+ use App\Entity\Chat;
6
+
7
+ interface MessengerInterface
8
+ {
9
+ public function normalizeMessage(array $message): array;
10
+
11
+ public function sendMessage(string $message, ?array $buttons = null, ?array $photos = null);
12
+
13
+ public function sendKeyboardMessage(string $message, ?array $buttons = null);
14
+
15
+ public function sendVideo(string $message, string $video);
16
+
17
+ public function getFile(array|string $id);
18
+
19
+ public function deleteMessage(string $id);
20
+
21
+ public function sendDocument(string $message, string $document, ?array $buttons = null);
22
+ }
@@ -0,0 +1,195 @@
1
+ <?php
2
+
3
+ namespace App\Service\MessengerService;
4
+
5
+ use App\Entity\Chat;
6
+ use CURLFile;
7
+ use Exception;
8
+
9
+ class TelegramService implements MessengerInterface
10
+ {
11
+
12
+ private ?Chat $chat = null;
13
+ private ?string $token = null;
14
+
15
+ public function __construct(?Chat $chat = null)
16
+ {
17
+ $this->token = $_ENV['TG_TOKEN'];
18
+ $this->chat = $chat;
19
+ }
20
+
21
+ public function normalizeMessage(array $message): array
22
+ {
23
+ $result = array();
24
+
25
+ if (array_key_exists('message', $message)) {
26
+ //user and chat
27
+ if (array_key_exists('chat', $message['message']) && array_key_exists('id', $message['message']['chat']))
28
+ $result['from'] = $message['message']['chat']['id'];
29
+ if (array_key_exists('chat', $message['message']) && array_key_exists('username', $message['message']['chat']))
30
+ $result['username'] = $message['message']['chat']['username'];
31
+ if (array_key_exists('from', $message['message']) && array_key_exists('id', $message['message']['from']))
32
+ $result['userId'] = $message['message']['from']['id'];
33
+ if (array_key_exists('contact', $message['message']) && array_key_exists('phone_number', $message['message']['contact']))
34
+ $result['phone'] = $message['message']['contact']['phone_number'];
35
+
36
+ //text
37
+ if (array_key_exists('text', $message['message'])) $result['message'] = $message['message']['text'];
38
+ else $result['message'] = '';
39
+
40
+ //files
41
+ if (array_key_exists('media_group_id', $message['message'])) $result['media_group_id'] = $message['message']['media_group_id'];
42
+ if (array_key_exists('document', $message['message'])) $result['documents'] = array($message['message']['document']['file_id']);
43
+ if (array_key_exists('photo', $message['message'])) {
44
+ $result['photos'] = array();
45
+ foreach ($message['message']['photo'] as $item) {
46
+ $result['photos'][] = $item['file_id'];
47
+ }
48
+ }
49
+ } elseif (array_key_exists('callback_query', $message)) {
50
+ if (array_key_exists('message', $message['callback_query']) && array_key_exists('chat', $message['callback_query']['message']) &&
51
+ array_key_exists('id', $message['callback_query']['message']['chat'])) $result['from'] = $message['callback_query']['message']['chat']['id'];
52
+ if (array_key_exists('data', $message['callback_query'])) $result['data'] = $message['callback_query']['data'];
53
+ if (array_key_exists('message', $message['callback_query']) && array_key_exists('message_id', $message['callback_query']['message']))
54
+ $result['message_id'] = $message['callback_query']['message']['message_id'];
55
+
56
+ }
57
+ $result['type'] = 'TG';
58
+
59
+ return $result;
60
+ }
61
+
62
+ public function sendMessage(string $message, ?array $buttons = null, ?array $photos = null)
63
+ {
64
+ $keyboard = "&parse_mode=HTML" . (is_array($buttons) ? '&reply_markup=' . urlencode(json_encode([
65
+ "inline_keyboard" => $buttons,
66
+ "remove_keyboard" => true,
67
+ ])) : '');
68
+
69
+ $method = is_array($photos) ? 'POST' : 'GET';
70
+ $body = null; $path = null;
71
+
72
+ if ($method === 'POST') {
73
+ if (count($photos) === 1) {
74
+ $photo = end($photos);
75
+ if (!str_contains($photo, '/var/www/html/public/downloads/')) $photo = '/var/www/html/public/downloads/' . $photo;
76
+ $body = array('photo' => new CURLFILE($photo), 'caption' => $message, 'chat_id' => $this->chat->getChatId());
77
+ $path = 'sendPhoto?' . $keyboard;
78
+ } else {
79
+ $body = array('chat_id' => $this->chat->getChatId());
80
+ $media = array();
81
+ foreach ($photos as $key => $photo) {
82
+ if (!str_contains($photo, '/var/www/html/public/downloads/')) $photo = '/var/www/html/public/downloads/' . $photo;
83
+ $body[$photo] = new CURLFILE($photo);
84
+ $media[$key] = array(
85
+ 'type' => 'photo',
86
+ 'media' => 'attach://' . $photo,
87
+ );
88
+ }
89
+ $body['media'] = json_encode($media);
90
+
91
+ $resp = $this->sendRequest('sendMediaGroup', 'POST', $body);
92
+ }
93
+ } else $path = 'sendMessage?chat_id=' . $this->chat->getChatId() . $keyboard . '&text=' . urlencode($message);
94
+
95
+ $resp = $this->sendRequest($path, $method, $body);
96
+
97
+ return $resp;
98
+ }
99
+
100
+ public function sendKeyboardMessage(string $message, ?array $buttons = null)
101
+ {
102
+ $keyboard = "&parse_mode=HTML" . (is_array($buttons) ? '&reply_markup=' . urlencode(json_encode([
103
+ "keyboard" => $buttons,
104
+ "resize_keyboard" => true,
105
+ "one_time_keyboard" => true,
106
+ "hide_keyboard" => true,
107
+ ])) : '');
108
+
109
+ $resp = $this->sendRequest('sendMessage?chat_id=' . $this->chat->getChatId() . $keyboard . '&text=' . urlencode($message));
110
+
111
+ return $resp;
112
+ }
113
+
114
+ public function sendVideo(string $message, ?string $video = null)
115
+ {
116
+ $body = array('video' => new CURLFILE($video), 'caption' => $message, 'chat_id' => $this->chat->getChatId(),
117
+ 'width' => 1920, 'height' => 1080, 'cover' => new CURLFILE('/var/www/html/public/files/1.png'));
118
+ $resp = $this->sendRequest('sendVideo', 'POST', $body);
119
+
120
+ return $resp;
121
+ }
122
+
123
+ public function getFile(array|string $id): bool|string
124
+ {
125
+ $resp = $this->sendRequest('getFile?file_id=' . $id);
126
+
127
+ if (array_key_exists('result', $resp)) {
128
+ $resp = $resp['result'];
129
+
130
+ $fileUrl = "https://api.telegram.org/file/bot" . $this->token . "/" . $resp['file_path'];
131
+ $fileContents = file_get_contents($fileUrl);
132
+ $filename = basename($resp['file_path']);
133
+
134
+ file_put_contents("/var/www/html/public/downloads/$filename", $fileContents);
135
+
136
+ return $filename;
137
+ }
138
+
139
+ return false;
140
+ }
141
+
142
+ public function deleteMessage(string $id)
143
+ {
144
+ $resp = $this->sendRequest('deleteMessage?chat_id=' . $this->chat->getChatId() . '&message_id=' . $id);
145
+ }
146
+
147
+ public function checkSubscribe($userId)
148
+ {
149
+ $channelId = '@igromania';
150
+ $resp = $this->sendRequest('getChatMember?chat_id=' . $channelId . '&user_id=' . $userId);
151
+ return $resp;
152
+ }
153
+
154
+ public function sendDocument(string $message, string $document, ?array $buttons = null)
155
+ {
156
+ $body = array('document' => new CURLFILE($document), 'caption' => $message, 'chat_id' => $this->chat->getChatId());
157
+ $resp = $this->sendRequest('sendDocument', 'POST', $body);
158
+ }
159
+
160
+ /**
161
+ * @throws Exception
162
+ */
163
+ private function sendRequest(string $uri, string $method = 'GET', ?array $body = null) {
164
+ $curl = curl_init();
165
+ curl_setopt_array($curl, array(
166
+ CURLOPT_URL => 'https://api.telegram.org/bot' . $this->token . '/' . $uri,
167
+ CURLOPT_RETURNTRANSFER => true,
168
+ CURLOPT_ENCODING => '',
169
+ CURLOPT_MAXREDIRS => 10,
170
+ CURLOPT_TIMEOUT => 0,
171
+ CURLOPT_FOLLOWLOCATION => true,
172
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
173
+ CURLOPT_CUSTOMREQUEST => $method,
174
+ ));
175
+ if (!is_null($body)) curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
176
+
177
+ $resp = curl_exec($curl);
178
+
179
+ if (curl_errno($curl)) {
180
+ throw new Exception('Connection Error: ' . curl_error($curl));
181
+ } else {
182
+ $http_status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
183
+
184
+ if ($http_status != 200) {
185
+ throw new Exception("Request failed with HTTP Code: " . $http_status);
186
+ }
187
+ }
188
+
189
+ $resp = json_decode($resp, true);
190
+
191
+ curl_close($curl);
192
+
193
+ return $resp;
194
+ }
195
+ }