• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/classes/general/im_message.php
  • Класс: CIMMessage
  • Вызов: CIMMessage::SetReadMessage
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
	);
}