• Модуль: pull
  • Путь к файлу: ~/bitrix/modules/pull/classes/general/pull_push.php
  • Класс: CPushManager
  • Вызов: CPushManager::SendMessage
public function SendMessage(array $arMessages = [], array $arDevices = []): bool
{
	if (empty($arMessages))
	{
		return false;
	}

	$uniqueHashes = [];
	$arTmpMessages = [];
	$arVoipMessages = [];
	foreach ($arMessages as $message)
	{
		if (!$this->shouldSendMessage($message))
		{
			continue;
		}
		if($message["ADVANCED_PARAMS"]["isVoip"])
		{
			if (!array_key_exists("USER_" . $message["USER_ID"], $arVoipMessages))
			{
				$arVoipMessages["USER_" . $message["USER_ID"]] = [];
			}
			$arVoipMessages["USER_" . $message["USER_ID"]][] = htmlspecialcharsback($message);
		}
		else
		{
			if (!array_key_exists("USER_" . $message["USER_ID"], $arTmpMessages))
			{
				$arTmpMessages["USER_" . $message["USER_ID"]] = [];
			}
			$arTmpMessages["USER_" . $message["USER_ID"]][] = htmlspecialcharsback($message);
		}

		array_push($uniqueHashes, ...$this->getUniqueHashes($message["USER_ID"], $message["APP_ID"]));
	}
	if (empty($arDevices))
	{
		$arDevices = BitrixPullModelPushTable::getList([
			'filter' => [
				"=UNIQUE_HASH" => array_unique($uniqueHashes)
			]
		])->fetchAll();

		if (empty($arDevices))
		{
			return false;
		}
	}

	$arPushMessages = [];

	foreach ($arDevices as $arDevice)
	{
		$arDevice["APP_ID"] = BitrixMainConfigOption::get("mobileapp", "app_id_replaced_".$arDevice["APP_ID"], $arDevice["APP_ID"]);
		$mode = $this->getAppMode($arDevice["APP_ID"]);

		$tmpMessage = $arTmpMessages["USER_" . $arDevice["USER_ID"]];
		$voipMessage = $arVoipMessages["USER_" . $arDevice["USER_ID"]];

		if(is_array($tmpMessage))
		{
			$deviceType = $arDevice["DEVICE_TYPE"];
			$deviceToken = $arDevice["DEVICE_TOKEN"];
			$filteredMessages = static::filterMessagesBeforeSend($tmpMessage, $deviceType, $deviceToken);
			if(isset(static::$pushServices[$deviceType]) && count($filteredMessages) > 0)
			{
				$arPushMessages[$deviceType][$deviceToken] = [
					"messages" => $filteredMessages,
					"mode" => $mode
				];
			}
		}
		if(is_array($voipMessage))
		{
			$deviceType = $arDevice["VOIP_TYPE"] && $arDevice["VOIP_TOKEN"] ? $arDevice["VOIP_TYPE"]: $arDevice["DEVICE_TYPE"];
			$deviceToken = $arDevice["VOIP_TYPE"] && $arDevice["VOIP_TOKEN"] ? $arDevice["VOIP_TOKEN"] : $arDevice["DEVICE_TOKEN"];
			$filteredMessages = static::filterMessagesBeforeSend($voipMessage, $deviceType, $deviceToken);
			if(isset(static::$pushServices[$deviceType]) && count($filteredMessages) > 0)
			{
				$arPushMessages[$deviceType][$deviceToken] = [
					"messages" => $filteredMessages,
					"mode" => $mode
				];
			}
		}
	}

	if (empty($arPushMessages))
	{
		return false;
	}

	$batches = [];

	$batchMessageCount = CPullOptions::GetPushMessagePerHit();
	$useChunks = ($batchMessageCount > 0);
	if(!$useChunks)
	{
		$batches[0] = "";
	}
	foreach (static::$pushServices as $serviceID => $serviceFields)
	{
		$className = $serviceFields["CLASS"];
		if (!$arPushMessages[$serviceID])
		{
			continue;
		}
		// replace with check of interface implementation maybe
		$service = new $className;
		if (!($service instanceof PushService))
		{
			continue;
		}

		if(!$useChunks)
		{
			$batches[0] .= $service->getBatch($arPushMessages[$serviceID]);
		}
		else
		{
			$offset = 0;
			$messages = null;
			while($messages = array_slice($arPushMessages[$serviceID],$offset, $batchMessageCount))
			{
				$batches[] = $service->getBatch($messages);
				$offset += count($messages);
			}
		}
	}

	foreach ($batches as $chunkBatch)
	{
		$this->sendBatch($chunkBatch);
	}

	return true;
}