public function SetReadMessage($fromUserId, $lastId = null, $byEvent = false)
{
global $DB;
$fromUserId = intval($fromUserId);
if ($fromUserId <= 0)
return false;
CIMMessenger::SpeedFileDelete($this->user_id, IM_SPEED_MESSAGE);
$chat = BitrixImV2EntityUserUser::getInstance($this->user_id)->getChatWith($fromUserId);
if ($chat === null)
{
return false;
}
$readService = new BitrixImV2MessageReadService($this->user_id);
$startId = $readService->getLastIdByChatId($chat->getChatId());
$counter = 0;
$viewedMessages = [];
if (isset($lastId))
{
$message = new BitrixImV2Message();
$message->setMessageId((int)$lastId)->setChatId($chat->getChatId());
$readResult = $readService->readTo($message);
$counter = $readResult->getResult()['COUNTER'];
$viewedMessages = $readResult->getResult()['VIEWED_MESSAGES'];
}
else
{
$counter = $readService->readAllInChat($chat->getChatId())->getResult()['COUNTER'];
}
/*BitrixMainApplication::getConnection()->query(
"UPDATE b_im_recent SET DATE_UPDATE = NOW() WHERE USER_ID = ".$this->user_id." AND ITEM_CID = ".$chat->getChatId()
);*/
$endId = $readService->getLastIdByChatId($chat->getChatId());
if (CModule::IncludeModule("pull"))
{
CPushManager::DeleteFromQueueBySubTag($this->user_id, 'IM_MESS');
BitrixPullEvent::add($this->user_id, Array(
'module_id' => 'im',
'command' => 'readMessage',
'params' => Array(
'dialogId' => $fromUserId,
'chatId' => $chat->getChatId(),
'senderId' => $this->user_id,
'id' => $fromUserId,
'userId' => $fromUserId,
'lastId' => $endId,
'counter' => $counter,
'muted' => false,
'unread' => BitrixImRecent::isUnread($this->user_id, IM_MESSAGE_PRIVATE, $fromUserId),
'viewedMessages' => $viewedMessages,
),
'extra' => BitrixImCommon::getPullExtra()
));
BitrixPullEvent::add($fromUserId, Array(
'module_id' => 'im',
'command' => 'readMessageOpponent',
'expiry' => 3600,
'params' => Array(
'dialogId' => $this->user_id,
'chatId' => $chat->getChatId(),
'userId' => $this->user_id,
'userName' => BitrixImUser::getInstance($this->user_id)->getFullName(false),
'lastId' => $endId,
'date' => date('c', time()),
'chatMessageStatus' => (new BitrixImV2MessageReadService($fromUserId))->getChatMessageStatus($chat->getChatId()),
'viewedMessages' => $viewedMessages,
),
'extra' => BitrixImCommon::getPullExtra()
));
}
foreach(GetModuleEvents("im", "OnAfterUserRead", true) as $arEvent)
{
ExecuteModuleEventEx($arEvent, array(Array(
'DIALOG_ID' => $fromUserId,
'CHAT_ID' => $chat->getChatId(),
'CHAT_ENTITY_TYPE' => 'USER',
'CHAT_ENTITY_ID' => '',
'START_ID' => $startId,
'END_ID' => $endId,
'COUNT' => $counter,
'USER_ID' => $this->user_id,
'BY_EVENT' => $byEvent
)));
}
return Array(
'DIALOG_ID' => $fromUserId,
'CHAT_ID' => $chat->getChatId(),
'LAST_ID' => $endId,
'COUNTER' => $counter
);
}