- Модуль: 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;
}