• Модуль: pull
  • Путь к файлу: ~/bitrix/modules/pull/classes/general/pull_push.php
  • Класс: CPushManager
  • Вызов: CPushManager::AddQueue
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;
}