• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/lib/recent.php
  • Класс: BitrixImRecent
  • Вызов: Recent::unread
static function unread($dialogId, $unread, $userId = null, ?int $markedId = null)
{
	$userId = BitrixImCommon::getUserId($userId);
	if (!$userId)
	{
		return false;
	}

	$unread = $unread === true? 'Y': 'N';

	$id = $dialogId;
	if (mb_substr($dialogId, 0, 4) === 'chat')
	{
		$itemTypes = BitrixImChat::getTypes();
		$id = mb_substr($dialogId, 4);
	}
	else
	{
		$itemTypes = IM_MESSAGE_PRIVATE;
	}

	$element = BitrixImModelRecentTable::getList([
		'select' => ['USER_ID', 'ITEM_TYPE', 'ITEM_ID', 'UNREAD', 'MUTED' => 'RELATION.NOTIFY_BLOCK', 'ITEM_CID', 'MARKED_ID'],
		'filter' => [
			'=USER_ID' => $userId,
			'=ITEM_TYPE' => $itemTypes,
			'=ITEM_ID' => $id
		]
	])->fetch();
	if (!$element)
	{
		return false;
	}
	if ($element['UNREAD'] === $unread && !isset($markedId))
	{
		return true;
	}

	$updatedFields = [
		'UNREAD' => $unread,
		'DATE_UPDATE' => new BitrixMainTypeDateTime(),
	];

	if ($unread === 'N')
	{
		$markedId = 0;
	}
	if (isset($markedId))
	{
		$updatedFields['MARKED_ID'] = $markedId;
	}

	BitrixImModelRecentTable::update(
		[
			'USER_ID' => $element['USER_ID'],
			'ITEM_TYPE' => $element['ITEM_TYPE'],
			'ITEM_ID' => $element['ITEM_ID'],
		],
		$updatedFields
	);

	self::clearCache($element['USER_ID']);
	//BitrixImCounter::clearCache($element['USER_ID']);
	CounterService::clearCache((int)$element['USER_ID']);

	$pullInclude = BitrixMainLoader::includeModule("pull");
	if ($pullInclude)
	{
		$chatId = (int)$element['ITEM_CID'];
		$readService = new ReadService($userId);
		$counter = $readService->getCounterService()->getByChat($chatId);
		//$readService->sendPush($chatId, [$userId], $counter, $time);

		BitrixPullEvent::add(
			$userId,
			[
				'module_id' => 'im',
				'command' => 'chatUnread',
				'expiry' => 3600,
				'params' => [
					'chatId' => $chatId,
					'dialogId' => $dialogId,
					'active' => $unread === 'Y',
					'muted' => $element['MUTED'] === 'Y',
					'counter' => $counter,
					'markedId' => $markedId ?? $element['MARKED_ID'],
					'lines' => $element['ITEM_TYPE'] === IM_MESSAGE_OPEN_LINE,
				],
				'extra' => BitrixImCommon::getPullExtra()
			]
		);
	}

	return true;
}