public function AddQueue($arParams)
{
if (!CPullOptions::GetPushStatus())
{
return false;
}
global $DB;
if (is_array($arParams['USER_ID']))
{
foreach ($arParams['USER_ID'] as $key => $userId)
{
$userId = intval($userId);
if ($userId > 0)
{
$arFields['USER_ID'][$userId] = $userId;
}
}
if (empty($arFields['USER_ID']))
{
return false;
}
}
else
{
if (isset($arParams['USER_ID']) && intval($arParams['USER_ID']) > 0)
{
$userId = intval($arParams['USER_ID']);
$arFields['USER_ID'][$userId] = $userId;
}
else
{
return false;
}
}
$arFields['SKIP_USERS'] = array();
if (is_array($arParams['SKIP_USERS']))
{
foreach ($arParams['SKIP_USERS'] as $key => $userId)
{
$userId = intval($userId);
if ($userId > 0)
{
$arFields['SKIP_USERS'][] = $userId;
}
}
}
if (isset($arParams['MESSAGE']) && trim($arParams['MESSAGE']) <> '')
{
$arFields['MESSAGE'] = str_replace(["rn", "nr", "n", "r"], " ", trim($arParams['MESSAGE']));
}
$arFields['TAG'] = '';
if (isset($arParams['TAG']) && trim($arParams['TAG']) <> '' && mb_strlen(trim($arParams['TAG'])) <= 255)
{
$arFields['TAG'] = trim($arParams['TAG']);
}
$arFields['SUB_TAG'] = '';
if (isset($arParams['SUB_TAG']) && trim($arParams['SUB_TAG']) <> '' && mb_strlen(trim($arParams['SUB_TAG'])) <= 255)
{
$arFields['SUB_TAG'] = trim($arParams['SUB_TAG']);
}
$arFields['BADGE'] = -1;
if (isset($arParams['BADGE']) && $arParams['BADGE'] != '' && intval($arParams['BADGE']) >= 0)
{
$arFields['BADGE'] = intval($arParams['BADGE']);
}
$arFields['PARAMS'] = '';
if (isset($arParams['PARAMS']))
{
if (is_array($arParams['PARAMS']) || trim($arParams['PARAMS']) <> '')
{
$arFields['PARAMS'] = $arParams['PARAMS'];
}
}
$arFields['ADVANCED_PARAMS'] = [];
if (isset($arParams['ADVANCED_PARAMS']) && is_array($arParams['ADVANCED_PARAMS']))
{
$arFields['ADVANCED_PARAMS'] = $arParams['ADVANCED_PARAMS'];
}
if (!isset($arParams['ADVANCED_PARAMS']['id']) && $arFields['SUB_TAG'] <> '')
{
$arFields['ADVANCED_PARAMS']['id'] = $arFields['SUB_TAG'];
}
if (!isset($arFields['ADVANCED_PARAMS']['extra']['server_time']))
{
$arFields['ADVANCED_PARAMS']['extra']['server_time'] = date('c');
}
if (!isset($arFields['ADVANCED_PARAMS']['extra']['server_time_unix']))
{
$arFields['ADVANCED_PARAMS']['extra']['server_time_unix'] = microtime(true);
}
$arFields['EXPIRY'] = 43200;
if (isset($arParams['EXPIRY']) && intval($arParams['EXPIRY']) >= 0)
{
$arFields['EXPIRY'] = intval($arParams['EXPIRY']);
}
if ($arParams['SOUND'] <> '')
{
$arFields['SOUND'] = $arParams['SOUND'];
}
$arFields['APP_ID'] = ($arParams['APP_ID'] <> '') ? $arParams['APP_ID'] : self::DEFAULT_APP_ID;
$groupMode = [
self::SEND_IMMEDIATELY => [],
self::SEND_IMMEDIATELY_SILENT => [],
self::SEND_DEFERRED => [],
self::SEND_SKIP => [],
];
$devices = [];
$options = [];
if (isset($arParams['IMPORTANT']) && $arParams['IMPORTANT'] === 'Y')
{
$options['IMPORTANT'] = 'Y';
}
$info = self::GetDeviceInfo($arFields['USER_ID'], $options, $arFields['APP_ID']);
foreach ($info as $userId => $params)
{
if (in_array($userId, $arFields['SKIP_USERS']))
{
$params['mode'] = self::SEND_SKIP;
}
else if ($params['mode'] == self::SEND_DEFERRED && isset($arParams['SEND_IMMEDIATELY']) && $arParams['SEND_IMMEDIATELY'] === 'Y')
{
$params['mode'] = self::SEND_IMMEDIATELY;
}
elseif (
in_array($params['mode'], [self::SEND_IMMEDIATELY, self::SEND_IMMEDIATELY_SILENT])
&& isset($arParams['SEND_DEFERRED']) && $arParams['SEND_DEFERRED'] === 'Y'
)
{
$params['mode'] = self::SEND_DEFERRED;
}
if ($params['mode'] != self::RECORD_NOT_FOUND)
{
foreach(GetModuleEvents("pull", "OnBeforeSendPush", true) as $arEvent)
{
$resultEvent = ExecuteModuleEventEx($arEvent, [$userId, $params['mode'], $arFields]);
if ($resultEvent)
{
$resultEvent = mb_strtoupper($resultEvent);
if (in_array($resultEvent, [
self::SEND_IMMEDIATELY,
self::SEND_IMMEDIATELY_SILENT,
self::SEND_DEFERRED,
self::SEND_SKIP
]))
{
$params['mode'] = $resultEvent;
}
}
}
}
if (isset($groupMode[$params['mode']]))
{
$groupMode[$params['mode']][$userId] = $userId;
}
if (
in_array($params['mode'], [self::SEND_IMMEDIATELY, self::SEND_IMMEDIATELY_SILENT])
&& !empty($params['device'])
&& !(isset($arParams['SEND_IMMEDIATELY']) && $arParams['SEND_IMMEDIATELY'] == 'Y')
)
{
$devices = array_merge($devices, $params['device']);
}
}
$pushImmediately = [];
foreach ($groupMode as $type => $users)
{
foreach ($users as $userId)
{
$pushImmediately[] = self::prepareSend($userId, $arFields, $type);
}
}
if (!empty($pushImmediately))
{
$CPushManager = new CPushManager();
$CPushManager->SendMessage($pushImmediately, $devices);
}
foreach ($groupMode[self::SEND_DEFERRED] as $userId)
{
$arAdd = [
'USER_ID' => $userId,
'TAG' => $arFields['TAG'],
'SUB_TAG' => $arFields['SUB_TAG'],
'~DATE_CREATE' => $DB->CurrentTimeFunction()
];
if ($arFields['MESSAGE'] <> '')
{
$arAdd['MESSAGE'] = $arFields['MESSAGE'];
}
if (is_array($arFields['ADVANCED_PARAMS']))
{
$arAdd['ADVANCED_PARAMS'] = BitrixMainWebJson::encode($arFields['ADVANCED_PARAMS']);
}
if (is_array($arFields['PARAMS']))
{
$arAdd['PARAMS'] = BitrixMainWebJson::encode($arFields['PARAMS']);
}
else
{
if ($arFields['PARAMS'] <> '')
{
$arAdd['PARAMS'] = $arFields['PARAMS'];
}
}
$arAdd['APP_ID'] = $arFields['APP_ID'];
$DB->Add("b_pull_push_queue", $arAdd, ["MESSAGE", "PARAMS", "ADVANCED_PARAMS"]);
CAgent::AddAgent("CPushManager::SendAgent();", "pull", "N", 30, "", "Y", ConvertTimeStamp(time() + CTimeZone::GetOffset() + 30, "FULL"), 100, false, false);
}
return true;
}