1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
event.php
См. документацию.
1<?php
2
3namespace Bitrix\Pull;
4
5use Bitrix\Main;
6use Bitrix\Main\Localization\Loc;
7use Bitrix\Main\Config\Option;
8use Bitrix\Pull\DTO\Message;
9
10class Event
11{
12 const SHARED_CHANNEL = 0;
13 private static bool $isSendingScheduled = false;
14
15 private static bool $backgroundContext = false;
16
17 private static array $messages = [];
18 private static array $deferredMessages = [];
19 private static array $push = [];
20 private static $error = false;
21
22 public static function add($recipient, array $parameters, $channelType = \CPullChannel::TYPE_PRIVATE)
23 {
24 if (!isset($parameters['module_id']))
25 {
26 self::$error = new Error(__METHOD__, 'EVENT_PARAMETERS_FORMAT', Loc::getMessage('PULL_EVENT_PARAMETERS_FORMAT_ERROR'), $parameters);
27 return false;
28 }
29
30 $badUnicodeSymbolsPath = Common::findInvalidUnicodeSymbols($parameters);
31 if ($badUnicodeSymbolsPath)
32 {
33 $warning = 'Parameters array contains invalid UTF-8 characters by the path ' . $badUnicodeSymbolsPath;
34 self::$error = new Error(__METHOD__, 'EVENT_BAD_ENCODING', $warning, $parameters);
35 return false;
36 }
37
38 if (isset($parameters['command']) && !empty($parameters['command']))
39 {
40 if (!Config::isJsonRpcUsed() && (isset($parameters['user_params']) || isset($parameters['dictionary'])))
41 {
42 self::generateEventsForUsers($recipient, $parameters, $channelType);
43 }
44 else
45 {
46 $result = self::addEvent($recipient, $parameters, $channelType);
47 }
48 }
49 else if (isset($parameters['push']) || isset($parameters['pushParamsCallback']))
50 {
51 $result = self::addPush($recipient, $parameters);
52 }
53 else
54 {
55 self::$error = new Error(__METHOD__, 'EVENT_PARAMETERS_FORMAT', Loc::getMessage('PULL_EVENT_PARAMETERS_FORMAT_ERROR'), $parameters);
56 return false;
57 }
58
59 return $result;
60 }
61
62 private static function addEvent($recipient, $parameters, $channelType = \CPullChannel::TYPE_PRIVATE)
63 {
64 if (!is_array($recipient))
65 {
66 $recipient = [$recipient];
67 }
68
69 $entities = self::getEntitiesByType($recipient);
70 if ($entities === null)
71 {
72 self::$error = new Error(__METHOD__, 'RECIPIENT_FORMAT', Loc::getMessage('PULL_EVENT_RECIPIENT_FORMAT_ERROR'), [
73 'recipient' => $recipient,
74 'eventParameters' => $parameters,
75 ]);
76
77 return false;
78 }
79
80 $parameters = self::prepareParameters($parameters);
81 if (!$parameters)
82 {
83 return false;
84 }
85 $parameters['channel_type'] = $channelType;
86
87 if (empty($entities['users']) && empty($entities['channels']))
88 {
89 return true;
90 }
91
92 if (isset($parameters['push']))
93 {
94 $pushParameters = $parameters['push'];
95 unset($parameters['push']);
96 }
97 else
98 {
99 $pushParameters = null;
100 }
101
102 if (isset($parameters['pushParamsCallback']))
103 {
104 $pushParametersCallback = $parameters['pushParamsCallback'];
105 unset($parameters['pushParamsCallback']);
106 }
107 else
108 {
109 $pushParametersCallback = null;
110 }
111
112 if (isset($parameters['hasCallback']) && $parameters['hasCallback'])
113 {
114 self::addMessage(self::$deferredMessages, $entities['channels'], $entities['users'], $parameters);
115 }
116 else
117 {
118 self::addMessage(self::$messages, $entities['channels'], $entities['users'], $parameters);
119 }
120
121 if (defined('BX_CHECK_AGENT_START') && !defined('BX_WITH_ON_AFTER_EPILOG'))
122 {
123 self::send();
124 }
125 else
126 {
127 self::scheduleSending();
128 }
129
130 if ($pushParameters || $pushParametersCallback)
131 {
132 if ($pushParameters)
133 {
134 $parameters['push'] = $pushParameters;
135 }
136 if ($pushParametersCallback)
137 {
138 $parameters['pushParamsCallback'] = $pushParametersCallback;
139 }
140 unset($parameters['channel_type']);
141 self::addPush($entities['users'], $parameters);
142 }
143
144 return true;
145 }
146
147 private static function addMessage(array &$destination, array $channels, array $users, array $parameters)
148 {
149 $eventCode = self::getParamsCode($parameters);
150 unset($parameters['hasCallback']);
151
152 if (isset($destination[$eventCode]))
153 {
154 $waitingToReceiveUserList = $destination[$eventCode]['users'] ?? [];
155 $newUserList = $users ?? [];
156 $destination[$eventCode]['users'] = array_unique(array_merge($waitingToReceiveUserList, $newUserList));
157
158 $waitingToReceiveChannelList = $destination[$eventCode]['channels'] ?? [];
159 $newChannelList = $channels ?? [];
160 $destination[$eventCode]['channels'] = array_unique(array_merge($waitingToReceiveChannelList, $newChannelList));
161 }
162 else
163 {
164 $destination[$eventCode] = [
165 'event' => $parameters,
166 'users' => array_unique($users),
167 'channels' => array_unique($channels),
168 ];
169 }
170 }
171
172 private static function generateEventsForUsers($recipients, $parameters, $channelType = \CPullChannel::TYPE_PRIVATE)
173 {
174 if (!is_array($recipients))
175 {
176 $recipients = [$recipients];
177 }
178 if (is_array($parameters['dictionary']))
179 {
180 $dictionary = $parameters['dictionary'];
181 unset($parameters['dictionary']);
182 $parameters['params'] = array_merge($parameters['params'], $dictionary);
183 }
184
185 $processed = [];
186 if (is_array($parameters['user_params']))
187 {
188 $params = $parameters['params'];
189 $paramsByUser = $parameters['user_params'];
190 unset($parameters['user_params']);
191
192 foreach ($recipients as $recipient)
193 {
194 if (isset($paramsByUser[$recipient]) && is_array($paramsByUser[$recipient]))
195 {
196 $userParams = $parameters;
197 $userParams['params'] = array_merge($params, $paramsByUser[$recipient]);
198 self::addEvent($recipient, $userParams, $channelType);
199
200 $processed[] = $recipient;
201 }
202 }
203 }
204 $left = array_diff($recipients, $processed);
205 if (!empty($left))
206 {
207 self::addEvent($left, $parameters, $channelType);
208 }
209 }
210
211 private static function addPush($users, $parameters)
212 {
213 if (!\CPullOptions::GetPushStatus())
214 {
215 self::$error = new Error(__METHOD__, 'PUSH_DISABLED', Loc::getMessage('PULL_EVENT_PUSH_DISABLED_ERROR'), [
216 'recipient' => $users,
217 'eventParameters' => $parameters,
218 ]);
219
220 return false;
221 }
222 if (!is_array($users))
223 {
224 $users = [$users];
225 }
226
227 foreach ($users as $id => $entity)
228 {
229 $entity = intval($entity);
230 if ($entity <= 0)
231 {
232 unset($users[$id]);
233 }
234 }
235
236 if (empty($users))
237 {
238 self::$error = new Error(__METHOD__, 'RECIPIENT_FORMAT', Loc::getMessage('PULL_EVENT_RECIPIENT_FORMAT_ERROR'), [
239 'recipient' => $users,
240 'eventParameters' => $parameters,
241 ]);
242
243 return false;
244 }
245
246 if (isset($parameters['skip_users']))
247 {
248 if (!isset($parameters['push']['skip_users']))
249 {
250 $parameters['push']['skip_users'] = [];
251 }
252 $parameters['push']['skip_users'] = array_merge($parameters['skip_users'], $parameters['push']['skip_users']);
253 }
254
255 if (!empty($parameters['push']['type']))
256 {
257 foreach ($users as $userId)
258 {
259 if (!\Bitrix\Pull\Push::getConfigTypeStatus($parameters['module_id'], $parameters['push']['type'], $userId))
260 {
261 $parameters['push']['skip_users'][] = $userId;
262 }
263 }
264 }
265
266 $parameters = self::preparePushParameters($parameters);
267 if (!$parameters)
268 {
269 return false;
270 }
271
272 $pushCode = self::getParamsCode($parameters['push']);
273 if (isset(self::$push[$pushCode]))
274 {
275 self::$push[$pushCode]['users'] = array_unique(array_merge(self::$push[$pushCode]['users'], array_values($users)));
276 }
277 else
278 {
279 $hasPushCallback = $parameters['hasPushCallback'];
280 unset($parameters['hasPushCallback']);
281
282 self::$push[$pushCode]['push'] = $parameters['push'];
283 self::$push[$pushCode]['extra'] = $parameters['extra'];
284 self::$push[$pushCode]['hasPushCallback'] = $hasPushCallback;
285 self::$push[$pushCode]['users'] = array_unique(array_values($users));
286 }
287
288 if (defined('BX_CHECK_AGENT_START') && !defined('BX_WITH_ON_AFTER_EPILOG'))
289 {
290 self::send();
291 }
292 else
293 {
294 self::scheduleSending();
295 }
296
297 return true;
298 }
299
300 private static function processDeferredMessages()
301 {
302 foreach (self::$deferredMessages as $eventCode => $message)
303 {
304 $callback = $message['event']['paramsCallback'];
305 if (Main\Loader::includeModule($callback['module_id']) && method_exists($callback['class'], $callback['method']))
306 {
307 $messageParameters = call_user_func_array([$callback['class'], $callback['method']], [$callback['params']]);
308 self::addMessage(self::$messages, $message['users'], $message['channels'], $messageParameters);
309 }
310 }
311 self::$deferredMessages = [];
312 }
313
314 private static function executePushEvent($parameters)
315 {
316 if (!self::$backgroundContext && $parameters['hasPushCallback'])
317 {
318 return null;
319 }
320
321 $data = [];
322 if ($parameters['hasPushCallback'])
323 {
324 $callback = $parameters['push']['pushParamsCallback'];
325 Main\Loader::includeModule($callback['module_id']);
326 if (method_exists($callback['class'], $callback['method']))
327 {
328 $data = call_user_func_array(
329 [
330 $callback['class'],
331 $callback['method'],
332 ],
333 [
334 $callback['params'],
335 ]
336 );
337 }
338 }
339 else
340 {
341 $data = $parameters['push'];
342 }
343
344 $data['message'] = str_replace("\n", " ", trim($data['message'] ?? ''));
345 $data['params'] = $data['params'] ?? [];
346 $data['advanced_params'] = $data['advanced_params'] ?? [];
347 $data['advanced_params']['extra'] = $parameters['extra'] ?? [];
348 $data['badge'] = isset($data['badge']) ? (int)$data['badge'] : '';
349 $data['sound'] = $data['sound'] ?? '';
350 $data['tag'] = $data['tag'] ?? '';
351 $data['sub_tag'] = $data['sub_tag'] ?? '';
352 $data['app_id'] = $data['app_id'] ?? '';
353 $data['send_immediately'] = isset($data['send_immediately']) && $data['send_immediately'] == 'Y' ? 'Y' : 'N';
354 $data['important'] = isset($data['important']) && $data['important'] == 'Y' ? 'Y' : 'N';
355
356 $users = [];
357 foreach ($parameters['users'] as $userId)
358 {
359 $users[] = $userId;
360 }
361
362 if (empty($users))
363 {
364 return true;
365 }
366
367 $manager = new \CPushManager();
368 $manager->AddQueue([
369 'USER_ID' => $users,
370 'SKIP_USERS' => isset($data['skip_users']) && is_array($data['skip_users']) ? $data['skip_users'] : [],
371 'MESSAGE' => $data['message'],
372 'EXPIRY' => $data['expiry'],
373 'PARAMS' => $data['params'],
374 'ADVANCED_PARAMS' => $data['advanced_params'],
375 'BADGE' => $data['badge'],
376 'SOUND' => $data['sound'],
377 'TAG' => $data['tag'],
378 'SUB_TAG' => $data['sub_tag'],
379 'APP_ID' => $data['app_id'],
380 'SEND_IMMEDIATELY' => $data['send_immediately'],
381 'IMPORTANT' => $data['important'],
382 ]);
383
384 return true;
385 }
386
387 public static function send()
388 {
389 if (self::$backgroundContext)
390 {
391 self::processDeferredMessages();
392 }
393
394 $executeResult = static::executeEvents();
395 if (!$executeResult->isSuccess())
396 {
397 foreach ($executeResult->getErrors() as $error)
398 {
399 $message = $error->getCode() ? $error->getCode() . ": " . $error->getMessage() : $error->getMessage();
400 trigger_error("Pull send error; {$message}; remote endpoint: {$executeResult->getRemoteAddress()}", E_USER_WARNING);
401 }
402 }
403
404 static::executePushEvents();
405
406 return true;
407 }
408
409 public static function executeEvents(): TransportResult
410 {
411 $result = new TransportResult();
412 if (empty(self::$messages))
413 {
414 return $result;
415 }
416
417 if (!\CPullOptions::GetQueueServerStatus())
418 {
419 self::$messages = [];
420
421 return $result;
422 }
423
424 self::fillChannels(self::$messages);
425
426 if (Config::isJsonRpcUsed())
427 {
428 $messageList = self::convertEventsToMessages(self::$messages);
429 $sendResult = (new JsonRpcTransport())->sendMessages($messageList);
430 if ($sendResult->isSuccess())
431 {
432 self::$messages = [];
433 }
434 else
435 {
436 $result->withRemoteAddress($sendResult->getRemoteAddress());
437 $result->addErrors($sendResult->getErrors());
438 }
439 }
440 else
441 {
442 if (Config::isProtobufUsed())
443 {
444 $sendResult = ProtobufTransport::sendMessages(self::$messages);
445 if (!$sendResult->isSuccess())
446 {
447 $result->withRemoteAddress($sendResult->getRemoteAddress());
448 $result->addErrors($sendResult->getErrors());
449 }
450 }
451 else
452 {
453 self::sendEventsLegacy();
454 }
455
456 self::$messages = [];
457 }
458
459 return $result;
460 }
461
462
463 public static function executePushEvents()
464 {
465 foreach (self::$push as $pushCode => $event)
466 {
467 $result = self::executePushEvent($event);
468 if (!is_null($result))
469 {
470 unset(self::$push[$pushCode]);
471 }
472 }
473 }
474
475 private static function sendEventsLegacy()
476 {
477 foreach (self::$messages as $eventCode => $event)
478 {
480 {
481 // TODO change code after release - $parameters['hasCallback']
482 $currentHits = ceil(count($event['channels']) / \CPullOptions::GetCommandPerHit());
483 $hitCount += $currentHits;
484
485 $currentChannelCount = count($event['channels']);
486 $channelCount += $currentChannelCount;
487
488 $currentMessagesBytes = self::getBytes($event['event']) + self::getBytes($event['channels']);
489 $messagesBytes += $currentMessagesBytes;
490 $logs[] = 'Command: ' . $event['event']['module_id'] . '/' . $event['event']['command'] . '; Hits: ' . $currentHits . '; Channel: ' . $currentChannelCount . '; Bytes: ' . $currentMessagesBytes . '';
491 }
492
493 if (empty($event['channels']))
494 {
495 continue;
496 }
497
498 $data = [
499 'module_id' => $event['event']['module_id'],
500 'command' => $event['event']['command'],
501 'params' => is_array($event['event']['params']) ? $event['event']['params'] : [],
502 'extra' => $event['event']['extra'],
503 ];
504 $options = ['expiry' => $event['event']['expiry']];
505
506 if (\CPullChannel::Send($event['channels'], \Bitrix\Pull\Common::jsonEncode($data), $options))
507 {
508 unset(self::$messages[$eventCode]);
509 }
510 }
511
512 if ($logs && \Bitrix\Pull\Log::isEnabled())
513 {
514 if (count($logs) > 1)
515 {
516 $logs[] = 'Total - Hits: ' . $hitCount . '; Channel: ' . $channelCount . '; Messages: ' . $messagesCount . '; Bytes: ' . $messagesBytes . '';
517 }
518
519 if (count($logs) > 1 || $hitCount > 1 || $channelCount > 1 || $messagesBytes > 1000)
520 {
521 $logTitle = '!! Pull messages stats - important !!';
522 }
523 else
524 {
525 $logTitle = '-- Pull messages stats --';
526 }
527
528 \Bitrix\Pull\Log::write(implode("\n", $logs), $logTitle);
529 }
530 }
531
532 public static function onAfterEpilog()
533 {
534 self::scheduleSending();
535 return true;
536 }
537
538 protected static function scheduleSending(): void
539 {
540 if (self::$isSendingScheduled)
541 {
542 return;
543 }
544
545 self::$isSendingScheduled = true;
546 Main\Application::getInstance()->addBackgroundJob([__CLASS__, "sendInBackground"], [], Main\Application::JOB_PRIORITY_LOW);
547 }
548
549 public static function sendInBackground()
550 {
551 self::$backgroundContext = true;
552 self::send();
553 self::$isSendingScheduled = false;
554 }
555
556 public static function fillChannels(array &$messages)
557 {
558 foreach ($messages as $key => &$message)
559 {
560 $users = $message['users'] ?? [];
561 if (!empty($messages[$key]['channels']) && is_array($messages[$key]['channels']))
562 {
563 $messages[$key]['channels'] = array_merge($messages[$key]['channels'], self::getChannelIds($users, $message['event']['channel_type']));
564 }
565 else
566 {
567 $messages[$key]['channels'] = self::getChannelIds($users, $message['event']['channel_type']);
568 }
569 unset($message['event']['channel_type']);
570 }
571 }
572
573 public static function getChannelIds(array $users, $type = \CPullChannel::TYPE_PRIVATE)
574 {
575 $result = [];
576 foreach ($users as $userId)
577 {
578 $data = \CPullChannel::Get($userId, true, false, $type);
579 if ($data)
580 {
581 $result[] = $data['CHANNEL_ID'];
582 }
583 }
584
585 return $result;
586 }
587
588 public static function getUserIds(array $channels)
589 {
590 $result = array_fill_keys($channels, null);
591 $orm = \Bitrix\Pull\Model\ChannelTable::getList([
592 'select' => ['USER_ID', 'CHANNEL_ID', 'USER_ACTIVE' => 'USER.ACTIVE'],
593 'filter' => [
594 '=CHANNEL_ID' => $channels,
595 ],
596 ]);
597 while ($row = $orm->fetch())
598 {
599 if ($row['USER_ID'] > 0 && $row['USER_ACTIVE'] !== 'N')
600 {
601 $result[$row['CHANNEL_ID']] = $row['USER_ID'];
602 }
603 else
604 {
605 unset($result[$row['CHANNEL_ID']]);
606 }
607 }
608
609 return $result;
610 }
611
612 private static function prepareParameters(array $parameters)
613 {
614 if (empty($parameters['command']))
615 {
616 self::$error = new Error(__METHOD__, 'EVENT_PARAMETERS_FORMAT', Loc::getMessage('PULL_EVENT_PARAMETERS_FORMAT_ERROR'), $parameters);
617 return false;
618 }
619
620 $parameters['module_id'] = mb_strtolower($parameters['module_id']);
621 $parameters['expiry'] = (int)($parameters['expiry'] ?? 86400);
622
623 if (isset($parameters['paramsCallback']))
624 {
625 if (empty($parameters['paramsCallback']['class']) || empty($parameters['paramsCallback']['method']))
626 {
627 self::$error = new Error(__METHOD__, 'EVENT_CALLBACK_FORMAT', Loc::getMessage('PULL_EVENT_CALLBACK_FORMAT_ERROR'), $parameters);
628 return false;
629 }
630
631 if (empty($parameters['paramsCallback']['module_id']))
632 {
633 $parameters['paramsCallback']['module_id'] = $parameters['module_id'];
634 }
635
636 Main\Loader::includeModule($parameters['paramsCallback']['module_id']);
637
638 if (!method_exists($parameters['paramsCallback']['class'], $parameters['paramsCallback']['method']))
639 {
640 self::$error = new Error(__METHOD__, 'EVENT_CALLBACK_NOT_FOUND', Loc::getMessage('PULL_EVENT_CALLBACK_FORMAT_ERROR'), $parameters);
641 return false;
642 }
643 if (!isset($parameters['paramsCallback']['params']))
644 {
645 $parameters['paramsCallback']['params'] = [];
646 }
647
648 $parameters['params'] = [];
649 $parameters['hasCallback'] = true;
650 }
651 else
652 {
653 if (!isset($parameters['params']) || !is_array($parameters['params']))
654 {
655 $parameters['params'] = [];
656 }
657 }
658
659 $parameters['extra']['server_time'] ??= date('c');
660 $parameters['extra']['server_time_unix'] ??= microtime(true);
661
662 $parameters['extra']['server_name'] = Option::get('main', 'server_name', $_SERVER['SERVER_NAME']);
663 $parameters['extra']['revision_web'] = PULL_REVISION_WEB;
664 $parameters['extra']['revision_mobile'] = PULL_REVISION_MOBILE;
665
666 return $parameters;
667 }
668
669 private static function preparePushParameters(array $parameters)
670 {
671 $parameters['module_id'] = mb_strtolower($parameters['module_id']);
672
673 if (isset($parameters['pushParamsCallback']))
674 {
675 if (
676 empty($parameters['pushParamsCallback']['class'])
677 || empty($parameters['pushParamsCallback']['method'])
678 )
679 {
680 self::$error = new Error(__METHOD__, 'EVENT_PUSH_CALLBACK_FORMAT', Loc::getMessage('PULL_EVENT_PUSH_CALLBACK_FORMAT_ERROR'), $parameters);
681 return false;
682 }
683
684 if (empty($parameters['pushParamsCallback']['module_id']))
685 {
686 $parameters['pushParamsCallback']['module_id'] = $parameters['module_id'];
687 }
688
689 Main\Loader::includeModule($parameters['pushParamsCallback']['module_id']);
690
691 if (!method_exists($parameters['pushParamsCallback']['class'], $parameters['pushParamsCallback']['method']))
692 {
693 self::$error = new Error(__METHOD__, 'EVENT_PUSH_CALLBACK_NOT_FOUND', Loc::getMessage('PULL_EVENT_PUSH_CALLBACK_FORMAT_ERROR'), $parameters);
694 return false;
695 }
696 if (!isset($parameters['pushParamsCallback']['params']))
697 {
698 $parameters['pushParamsCallback']['params'] = [];
699 }
700 $parameters['push']['pushParamsCallback'] = $parameters['pushParamsCallback'];
701 $parameters['hasPushCallback'] = true;
702 }
703 else
704 {
705 $parameters['hasPushCallback'] = false;
706 $parameters['pushParamsCallback'] = [];
707
708 if (isset($parameters['badge']) && $parameters['badge'] == 'Y')
709 {
710 $parameters['send_immediately'] = 'Y';
711 unset($parameters['badge']);
712 }
713
714 if (empty($parameters['push']))
715 {
716 self::$error = new Error(__METHOD__, 'EVENT_PUSH_PARAMETERS_FORMAT', Loc::getMessage('PULL_EVENT_PUSH_PARAMETERS_FORMAT_ERROR'), $parameters);
717 return false;
718 }
719 }
720
721 if (!isset($parameters['extra']['server_time']))
722 {
723 $parameters['extra']['server_time'] = date('c');
724 }
725 if (!$parameters['extra']['server_time_unix'])
726 {
727 $parameters['extra']['server_time_unix'] = microtime(true);
728 }
729
730 return $parameters;
731 }
732
733 public static function getParamsCode($params)
734 {
735 if (isset($params['groupId']) && !empty($params['groupId']))
736 {
737 return md5($params['groupId']);
738 }
739 else
740 {
741 $paramsWithoutTime = $params;
742
743 unset($paramsWithoutTime['extra']['server_time']);
744 unset($paramsWithoutTime['extra']['server_time_unix']);
745 unset($paramsWithoutTime['advanced_params']['filterCallback']);
746
747 return serialize($paramsWithoutTime);
748 }
749 }
750
751 private static function getEntitiesByType(array $recipientList): ?array
752 {
753 $result = [
754 'users' => [],
755 'channels' => [],
756 'count' => 0,
757 ];
758 foreach ($recipientList as $entity)
759 {
760 if ($entity instanceof \Bitrix\Pull\Model\Channel)
761 {
762 $result['channels'][] = $entity->getPrivateId();
763 $result['count']++;
764 }
765 else if (self::isChannelEntity($entity))
766 {
767 $result['channels'][] = $entity;
768 $result['count']++;
769 }
770 else
771 {
772 $result['users'][] = intval($entity);
773 $result['count']++;
774 }
775 }
776
777 return $result['count'] > 0 ? $result : null;
778 }
779
780 private static function getBytes($variable)
781 {
782 $bytes = 0;
783
784 if (is_string($variable))
785 {
786 $bytes += mb_strlen($variable);
787 }
788 else if (is_array($variable))
789 {
790 foreach ($variable as $value)
791 {
792 $bytes += self::getBytes($value);
793 }
794 }
795 else
796 {
797 $bytes += mb_strlen((string)$variable);
798 }
799
800 return $bytes;
801 }
802
803 private static function isChannelEntity($entity)
804 {
805 return is_string($entity) && mb_strlen($entity) == 32;
806 }
807
812 private static function convertEventsToMessages(array $events): array
813 {
814 return array_map(
815 function ($event) {
816 return Message::fromEvent($event);
817 },
818 $events
819 );
820 }
821
822 public static function getLastError()
823 {
824 return self::$error;
825 }
826
827}
$type
Определения options.php:106
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
const JOB_PRIORITY_LOW
Определения application.php:32
static getInstance()
Определения application.php:98
Определения error.php:15
Определения event.php:5
send($sender=null)
Определения event.php:139
$parameters
Определения event.php:8
static includeModule($moduleName)
Определения loader.php:67
Определения channel.php:6
static findInvalidUnicodeSymbols(array $input, $currentPath="")
Определения common.php:32
static getParamsCode($params)
Определения event.php:733
static send()
Определения event.php:387
static add($recipient, array $parameters, $channelType=\CPullChannel::TYPE_PRIVATE)
Определения event.php:22
static getChannelIds(array $users, $type=\CPullChannel::TYPE_PRIVATE)
Определения event.php:573
static scheduleSending()
Определения event.php:538
static sendInBackground()
Определения event.php:549
static executeEvents()
Определения event.php:409
static getLastError()
Определения event.php:822
static getUserIds(array $channels)
Определения event.php:588
static executePushEvents()
Определения event.php:463
const SHARED_CHANNEL
Определения event.php:12
static fillChannels(array &$messages)
Определения event.php:556
static onAfterEpilog()
Определения event.php:532
static isEnabled()
Определения log.php:6
static sendMessages(array $messages, array $options=[])
Определения protobuftransport.php:18
static Get(int $userId, $cache=true, $reOpen=false, $channelType=self::TYPE_PRIVATE)
Определения pull_channel.php:46
static Send($channelId, $message, $options=array())
Определения pull_channel.php:386
const TYPE_PRIVATE
Определения pull_channel.php:9
$options
Определения commerceml2.php:49
$bytes
Определения cron_html_pages.php:17
$data['IS_AVAILABLE']
Определения .description.php:13
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
$entity
$_SERVER["DOCUMENT_ROOT"]
Определения cron_frame.php:9
Определения channel.php:3
trait Error
Определения error.php:11
$manager
Определения office365push.php:39
$message
Определения payment.php:8
$event
Определения prolog_after.php:141
const PULL_REVISION_MOBILE
Определения include.php:4
const PULL_REVISION_WEB
Определения include.php:3
if(empty($signedUserToken)) $key
Определения quickway.php:257
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799