• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/lib/V2/Message/Send/PushService.php
  • Класс: BitrixImV2MessageSendPushService
  • Вызов: PushService::sendPushGroupChat
public function sendPushGroupChat(GroupChat $chat, Message $message, array $counters = []): void
{
	if (!$this->isPullEnable())
	{
		return;
	}

	$fromUserId = $message->getAuthorId();

	$skippedRelations = [];
	$pushUserSkip = [];
	$pushUserSend = [];

	foreach ($chat->getRelations() as $relation)
	{
		if ($this->sendingConfig->addRecent() !== true)
		{
			$skippedRelations[$relation->getId()] = true;
			continue;
		}
		if ($relation->getUser()->getExternalAuthId() == BitrixImBot::EXTERNAL_AUTH_ID)
		{
		}
		elseif ($relation->getUser()->isActive() !== true)
		{
			$skippedRelations[$relation->getId()] = true;
			continue;
		}

		if ($chat->getEntityType() == Chat::ENTITY_TYPE_LINE)
		{
			if ($relation->getUser()->getExternalAuthId() == 'imconnector')
			{
				$skippedRelations[$relation->getId()] = true;
				continue;
			}
		}

		if ($relation->getUserId() == $fromUserId)
		{
			CPushManager::DeleteFromQueueBySubTag($fromUserId, 'IM_MESS');
		}
		elseif ($relation->getNotifyBlock() && !$this->sendingConfig->sendPushImmediately())
		{
			$pushUserSkip[] = $relation->getChatId();
			$pushUserSend[] = $relation->getChatId();
		}
		elseif (!$this->sendingConfig->sendPush())
		{
		}
		else
		{
			$pushUserSend[] = $relation['USER_ID'];
		}
	}

	$pullMessage = [
		'module_id' => 'im',
		'command' => 'messageChat',
		'params' => $this->getFormatGroupChatMessage($message, $chat),
		'extra' => BitrixImCommon::getPullExtra()
	];
	$events = [];
	foreach ($chat->getRelations() as $relation)
	{
		if (isset($skippedRelations[$relation->getId()]))
		{
			continue;
		}
		$events[$relation->getUserId()] = $pullMessage;
		$events[$relation->getUserId()]['params']['counter'] = $counters[$relation->getUserId()] ?? 0;
		$events[$relation->getUserId()]['groupId'] =
			'im_chat_'
			. $chat->getChatId()
			. '_'. $message->getMessageId()
			. '_'. $events[$relation['USER_ID']]['params']['counter']
		;
	}

	if ($chat->getType() == Chat::IM_TYPE_OPEN || $chat->getType() == Chat::IM_TYPE_OPEN_LINE)
	{
		$watchPullMessage = $pullMessage;
		$watchPullMessage['params']['message']['params']['NOTIFY'] = 'N';
		CPullWatch::AddToStack('IM_PUBLIC_'. $chat->getChatId(), $watchPullMessage);
	}

	$groups = $this->getEventByCounterGroup($events);
	foreach ($groups as $group)
	{
		BitrixPullEvent::add($group['users'], $group['event']);

		$userList = array_intersect($pushUserSend, $group['users']);
		if (!empty($userList))
		{
			$pushParams = $group['event'];

			$pushParams = $this->preparePushForChat($pushParams);

			if ($this->sendingConfig->sendPushImmediately())
			{
				$pushParams['push']['important'] = 'Y';
			}

			$pushParams['skip_users'] = $pushUserSkip;

			if ($message->getPushMessage())
			{
				$pushParams['push']['message'] = $message->getPushMessage();
				$pushParams['push']['advanced_params']['senderMessage'] = $message->getPushMessage();
			}
			$pushParams['push']['advanced_params']['counter'] = $group['event']['params']['counter'];

			BitrixPullPush::add($userList, $pushParams);
		}
	}
}