29 public static function GetList($arOrder = [],
$arFilter = [], $arSelect = [], $arNavStartParams = [])
35 if (!empty($arSelect))
40 if (isset($arNavStartParams[
"nTopCount"]) && intval($arNavStartParams[
"nTopCount"]) > 0)
42 $params[
"limit"] = intval($arNavStartParams[
"nTopCount"]);
45 $res = \Bitrix\Pull\Model\PushTable::getList(
$params);
68 $handlers =
$eventManager->findEventHandlers(
"pull",
"onPushTokenUniqueHashGet");
69 foreach ($handlers as $handler)
78 return md5($user_id . $app_id);
104 $result = \Bitrix\Pull\Model\PushTable::delete(intval(
$ID));
108 public static function cleanTokens()
115 $killTime = ConvertTimeStamp(microtime(
true) - 24 * 3600 * 14,
"FULL");
116 $sqlString =
"DELETE FROM b_pull_push WHERE DATE_AUTH < " .
$DB->CharToDateFunction($killTime);
118 $DB->Query($sqlString);
120 return "CPullPush::cleanTokens();";
136 private string $remoteProviderUrl ;
140 if (!isset(self::$pushServices))
144 $this->remoteProviderUrl =
Option::get(
"pull",
"push_service_url");
150 if ($tag ==
'' || intval(
$userId) == 0)
155 $strSql =
"DELETE FROM b_pull_push_queue WHERE USER_ID = " . intval(
$userId) .
" AND TAG = '" .
$DB->ForSQL($tag) .
"'";
158 \Bitrix\Pull\Push::add(
$userId, [
159 'module_id' =>
'pull',
161 'advanced_params' => [
162 "notificationsToCancel" => [$tag],
164 'send_immediately' =>
'Y',
178 if (!CPullOptions::GetPushStatus())
228 $arFields[
'MESSAGE'] = str_replace([
"\r\n",
"\n\r",
"\n",
"\r"],
" ", trim(
$arParams[
'MESSAGE']));
267 if (!isset(
$arFields[
'ADVANCED_PARAMS'][
'extra'][
'server_time']))
269 $arFields[
'ADVANCED_PARAMS'][
'extra'][
'server_time'] = date(
'c');
271 if (!isset(
$arFields[
'ADVANCED_PARAMS'][
'extra'][
'server_time_unix']))
273 $arFields[
'ADVANCED_PARAMS'][
'extra'][
'server_time_unix'] = microtime(
true);
290 self::SEND_IMMEDIATELY => [],
291 self::SEND_IMMEDIATELY_SILENT => [],
292 self::SEND_DEFERRED => [],
293 self::SEND_SKIP => [],
309 $params[
'mode'] = self::SEND_SKIP;
311 else if (
$params[
'mode'] == self::SEND_DEFERRED && isset(
$arParams[
'SEND_IMMEDIATELY']) &&
$arParams[
'SEND_IMMEDIATELY'] ===
'Y')
313 $params[
'mode'] = self::SEND_IMMEDIATELY;
316 in_array(
$params[
'mode'], [self::SEND_IMMEDIATELY, self::SEND_IMMEDIATELY_SILENT])
320 $params[
'mode'] = self::SEND_DEFERRED;
323 if (
$params[
'mode'] != self::RECORD_NOT_FOUND)
330 $resultEvent = mb_strtoupper($resultEvent);
331 if (in_array($resultEvent, [
332 self::SEND_IMMEDIATELY,
333 self::SEND_IMMEDIATELY_SILENT,
338 $params[
'mode'] = $resultEvent;
344 if (isset($groupMode[
$params[
'mode']]))
349 in_array(
$params[
'mode'], [self::SEND_IMMEDIATELY, self::SEND_IMMEDIATELY_SILENT])
354 $devices = array_merge($devices,
$params[
'device']);
358 $pushImmediately = [];
359 foreach ($groupMode as
$type => $users)
366 if (!empty($pushImmediately))
369 $CPushManager->SendMessage($pushImmediately, $devices);
372 foreach ($groupMode[self::SEND_DEFERRED] as
$userId)
378 '~DATE_CREATE' =>
$DB->CurrentTimeFunction()
383 $arAdd[
'MESSAGE'] =
$arFields[
'MESSAGE'];
385 if (is_array(
$arFields[
'ADVANCED_PARAMS']))
403 $DB->Add(
"b_pull_push_queue", $arAdd, [
"MESSAGE",
"PARAMS",
"ADVANCED_PARAMS"]);
405 CAgent::AddAgent(
"CPushManager::SendAgent();",
"pull",
"N", 30,
"",
"Y", ConvertTimeStamp(time() + CTimeZone::GetOffset() + 30,
"FULL"), 100,
false,
false);
417 if (
$type != self::SEND_DEFERRED)
419 if (is_array(
$fields[
'PARAMS']))
421 if (isset(
$fields[
'PARAMS'][
'CATEGORY']))
424 unset(
$fields[
'PARAMS'][
'CATEGORY']);
442 else if (
$type == self::SEND_IMMEDIATELY_SILENT)
444 $result[
'SOUND'] =
'silence.aif';
453 if (
$type == self::SEND_SKIP)
456 unset(
$result[
'ADVANCED_PARAMS'][
'senderName']);
464 if (intval(
$fields[
'BADGE']) >= 0)
470 $result[
'BADGE'] = \Bitrix\Pull\MobileCounter::get(
$result[
'USER_ID']);
501 'mode' => self::RECORD_NOT_FOUND,
519 "CASE WHEN %s > %s THEN 'Y' ELSE 'N' END",
520 [
'LAST_ACTIVITY_DATE',
'SAGO']
524 ->addSelect(
'ACTIVE')
526 ->addSelect(
'IS_ONLINE_CUSTOM');
532 \
Bitrix\Im\Model\StatusTable::class,
533 [
'=this.ID' =>
'ref.USER_ID']
536 ->addSelect(
'im.IDLE',
'IDLE')
537 ->addSelect(
'im.DESKTOP_LAST_DATE',
'DESKTOP_LAST_DATE')
538 ->addSelect(
'im.MOBILE_LAST_DATE',
'MOBILE_LAST_DATE')
544 \
Bitrix\Pull\Model\PushTable::class,
545 [
'=this.ID' =>
'ref.USER_ID']
549 "CASE WHEN %s > 0 THEN 'Y' ELSE 'N' END",
553 ->addSelect(
'HAS_MOBILE')
554 ->addSelect(
'push.APP_ID',
'APP_ID')
555 ->addSelect(
'push.UNIQUE_HASH',
'UNIQUE_HASH')
556 ->addSelect(
'push.DEVICE_TYPE',
'DEVICE_TYPE')
557 ->addSelect(
'push.DEVICE_TOKEN',
'DEVICE_TOKEN')
558 ->addSelect(
'push.VOIP_TYPE',
'VOIP_TYPE')
559 ->addSelect(
'push.VOIP_TOKEN',
'VOIP_TOKEN');
562 $queryResult =
$query->exec();
564 while (
$user = $queryResult->fetch())
568 if (in_array(
$user[
'UNIQUE_HASH'], $uniqueHashes) &&
$user[
'ACTIVE'] ==
'Y')
571 'APP_ID' =>
$user[
'APP_ID'],
572 'USER_ID' =>
$user[
'ID'],
573 'DEVICE_TYPE' =>
$user[
'DEVICE_TYPE'],
574 'DEVICE_TOKEN' =>
$user[
'DEVICE_TOKEN'],
575 'VOIP_TYPE' =>
$user[
'VOIP_TYPE'],
576 'VOIP_TOKEN' =>
$user[
'VOIP_TOKEN'],
584 if (
$result[
$user[
'ID']][
'mode'] != self::RECORD_NOT_FOUND)
589 if (
$user[
'HAS_MOBILE'] ==
'N')
612 $isDesktopIdle =
false;
614 if (
$user[
'IS_ONLINE_CUSTOM'] ==
'Y')
623 $mobileLastDate =
$user[
'MOBILE_LAST_DATE']?
$user[
'MOBILE_LAST_DATE']->getTimestamp(): 0;
624 if ($mobileLastDate > 0 && $mobileLastDate + 300 > time())
629 $isDesktop = CIMMessenger::CheckDesktopStatusOnline(
$user[
'ID']);
630 if ($isDesktop && $isOnline && is_object(
$user[
'IDLE']))
632 if (
$user[
'IDLE']->getTimestamp() > 0 )
634 $isDesktopIdle =
true;
639 $status = self::SEND_IMMEDIATELY;
642 $status = self::SEND_IMMEDIATELY;
646 if (!\
Bitrix\Pull\PushSmartfilter::getStatus(
$user[
'ID']))
648 $status = self::SEND_IMMEDIATELY_SILENT;
658 $status = self::SEND_IMMEDIATELY;
673 private function getAppMode(
string $appId): string
675 return mb_strpos($appId,
"_bxdev") > 0 ?
"SANDBOX" :
"PRODUCTION";
678 static private function getPureAppId($appId): string
680 return str_replace(
"_bxdev",
"", $appId);
690 $shouldBeSent =
true;
691 foreach ($delegates as $delegate)
699 return $shouldBeSent;
709 if (empty($arMessages))
716 $arVoipMessages = [];
723 if(
$message[
"ADVANCED_PARAMS"][
"isVoip"])
725 if (!array_key_exists(
"USER_" .
$message[
"USER_ID"], $arVoipMessages))
727 $arVoipMessages[
"USER_" .
$message[
"USER_ID"]] = [];
733 if (!array_key_exists(
"USER_" .
$message[
"USER_ID"], $arTmpMessages))
735 $arTmpMessages[
"USER_" .
$message[
"USER_ID"]] = [];
742 if (!in_array(
$hash, $uniqueHashes))
744 $uniqueHashes[] =
$hash;
747 if (empty($arDevices))
749 $arDevices = \Bitrix\Pull\Model\PushTable::getList([
751 "=UNIQUE_HASH" => array_unique($uniqueHashes)
755 if (empty($arDevices))
761 $arPushMessages = [];
763 foreach ($arDevices as $arDevice)
766 $mode = $this->getAppMode($arDevice[
"APP_ID"]);
768 $tmpMessage = $arTmpMessages[
"USER_" . $arDevice[
"USER_ID"]] ??
null;
769 $voipMessage = $arVoipMessages[
"USER_" . $arDevice[
"USER_ID"]] ??
null;
771 if(is_array($tmpMessage))
773 $tmpMessage = array_map(
function(
$message) use ($arDevice) {
774 $message[
"APP_ID"] = self::getPureAppId($arDevice[
"APP_ID"]);
778 $deviceType = $arDevice[
"DEVICE_TYPE"];
779 $deviceToken = $arDevice[
"DEVICE_TOKEN"];
780 $filteredMessages = static::filterMessagesBeforeSend($tmpMessage, $deviceType, $deviceToken);
781 if(isset(static::$pushServices[$deviceType]) &&
count($filteredMessages) > 0)
783 $arPushMessages[$deviceType][$deviceToken] = [
784 "messages" => $filteredMessages,
789 if(is_array($voipMessage))
791 $voipMessage = array_map(
function(
$message) use ($arDevice) {
792 $message[
"APP_ID"] = self::getPureAppId($arDevice[
"APP_ID"]);
795 $deviceType = $arDevice[
"VOIP_TYPE"] && $arDevice[
"VOIP_TOKEN"] ? $arDevice[
"VOIP_TYPE"]: $arDevice[
"DEVICE_TYPE"];
796 $deviceToken = $arDevice[
"VOIP_TYPE"] && $arDevice[
"VOIP_TOKEN"] ? $arDevice[
"VOIP_TOKEN"] : $arDevice[
"DEVICE_TOKEN"];
797 $filteredMessages = static::filterMessagesBeforeSend($voipMessage, $deviceType, $deviceToken);
798 if(isset(static::$pushServices[$deviceType]) &&
count($filteredMessages) > 0)
800 $arPushMessages[$deviceType][$deviceToken] = [
801 "messages" => $filteredMessages,
808 if (empty($arPushMessages))
815 $batchMessageCount = CPullOptions::GetPushMessagePerHit();
816 $useChunks = ($batchMessageCount > 0);
821 foreach (static::$pushServices as $serviceID => $serviceFields)
823 $className = $serviceFields[
"CLASS"];
824 if (empty($arPushMessages[$serviceID]))
837 $batches[0] .=
$service->getBatch($arPushMessages[$serviceID]);
843 while(
$messages = array_slice($arPushMessages[$serviceID],$offset, $batchMessageCount))
855 foreach ($batches as $chunkBatch)
857 $this->sendBatch($chunkBatch);
863 private function sendBatch($batch)
869 new Web\Uri($this->remoteProviderUrl .
"?key=" . Application::getInstance()->getLicense()->getHashLicenseKey()),
872 "Action" =>
"SendMessage",
873 "MessageBody" => $batch
877 $httpClient->sendAsyncRequest(
$request);
889 if (isset(
$message[
'ADVANCED_PARAMS'][
'filterCallback']) && is_callable(
$message[
'ADVANCED_PARAMS'][
'filterCallback']))
891 $filterResult = call_user_func_array(
892 $message[
'ADVANCED_PARAMS'][
'filterCallback'],
895 'deviceType' => $deviceType,
896 'deviceToken' => $deviceToken
905 unset(
$messages[
$k][
'ADVANCED_PARAMS'][
'filterCallback']);
915 if ($tag ==
'' || intval(
$userId) == 0)
920 $strSql =
"DELETE FROM b_pull_push_queue WHERE USER_ID = " . intval(
$userId) .
" AND SUB_TAG = '" .
$DB->ForSQL($tag) .
"'";
923 \Bitrix\Pull\Push::add(
$userId, [
924 'module_id' =>
'pull',
926 'advanced_params' => [
927 "notificationsToCancel" => [$tag],
929 'send_immediately' =>
'Y',
941 if (!CPullOptions::GetPushStatus())
952 if (
$DB->type ==
"MYSQL" ||
$DB->type ==
"PGSQL")
955 $sqlDate =
" WHERE DATE_CREATE < ".$helper->addSecondsToDateTime(-15);
959 $sqlDate =
" WHERE DATE_CREATE < dateadd(SECOND, -15, getdate()) ";
963 $sqlDate =
" WHERE DATE_CREATE < SYSDATE-(1/24/60/60*15) ";
966 $strSql =
$DB->TopSql(
"SELECT ID, USER_ID, MESSAGE, PARAMS, ADVANCED_PARAMS, BADGE, APP_ID FROM b_pull_push_queue" . $sqlDate, 280);
970 if (
$arRes[
'BADGE'] ==
'')
983 if (is_array(
$arRes[
'PARAMS']))
985 if (isset(
$arRes[
'PARAMS'][
'CATEGORY']))
988 unset(
$arRes[
'PARAMS'][
'CATEGORY']);
998 $arRes[
'ADVANCED_PARAMS'] = [];
1007 $maxId = max($maxId,
$arRes[
'ID']);
1012 $strSql =
"DELETE FROM b_pull_push_queue WHERE ID <= " . $maxId;
1013 $DB->Query($strSql);
1017 foreach ($arPush as $arStack)
1019 $CPushManager->SendMessage($arStack);
1022 $strSql =
"SELECT COUNT(ID) CNT FROM b_pull_push_queue";
1030 return "CPushManager::SendAgent();";
1037 return "CPushManager::SendAgent();";
1047 return self::$pushServices;
1052 return \Bitrix\Pull\MobileCounter::send(
$userId, $appId);
if(!Loader::includeModule('catalog')) if(!AccessController::getCurrent() ->check(ActionDictionary::ACTION_PRICE_EDIT)) if(!check_bitrix_sessid()) $request
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
static getConnection($name="")
static get($moduleId, $name, $default="", $siteId=false)
static includeModule($moduleName)
static encode($data, $options=null)
static Update($ID, $arFields=Array())
static GetList($arOrder=[], $arFilter=[], $arSelect=[], $arNavStartParams=[])
static Add($arFields=Array())
static getUniqueHash($user_id, $app_id)
const SEND_IMMEDIATELY_SILENT
sendBadges($userId=null, $appId=self::DEFAULT_APP_ID)
static GetDeviceInfo($userId, $options=Array(), $appId=self::DEFAULT_APP_ID)
static DeleteFromQueueByTag($userId, $tag, $appId=self::DEFAULT_APP_ID)
shouldSendMessage($message)
static array $pushServices
static DeleteFromQueueBySubTag($userId, $tag, $appId=self::DEFAULT_APP_ID)
static filterMessagesBeforeSend(array $messages, string $deviceType, string $deviceToken)
SendMessage(array $arMessages=[], array $arDevices=[])
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
if($NS['step']==6) if( $NS[ 'step']==7) if(COption::GetOptionInt('main', 'disk_space', 0) > 0) $info
ExecuteModuleEventEx($arEvent, $arParams=[])
htmlspecialcharsback($str)
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if(empty($signedUserToken)) $key
</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."%"
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']