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