• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/classes/general/im_notify.php
  • Класс: CIMNotify
  • Вызов: CIMNotify::MarkNotifyReadBySubTag
public function MarkNotifyReadBySubTag($subTagList = array())
{
	global $DB;

	if (empty($subTagList))
	{
		return false;
	}

	if (!is_array($subTagList))
	{
		$subTagList = array($subTagList);
	}

	$result = IMModelMessageTable::query()
		->setSelect(['ID', 'CHAT_ID', 'USER_ID' => 'RELATION.USER_ID'])
		->whereIn('NOTIFY_SUB_TAG', $subTagList)
		->withUnreadOnly()
		->exec()
	;

	/*$sqlTags = Array();
	foreach ($subTagList as $value)
	{
		$value = (string)$value;
		$sqlTags[] = "'".$DB->ForSQL($value)."'";
	}*/

	$users = array();
	$chats = array();
	$messages = array();
	$messagesByUser = array();

	$messageCollection = new IMV2MessageCollection();

	while ($row = $result->fetch())
	{
		$messages[] = (int)$row['ID'];
		$users[$row['CHAT_ID']] = $row['USER_ID'];
		$chats[$row['CHAT_ID']] = $row['CHAT_ID'];
		$messagesByUser[$row['CHAT_ID']][] = $row['ID'];
		$message = new IMV2Message();
		$message->setMessageId((int)$row['ID'])->setChatId((int)$row['CHAT_ID']);
		$messageCollection->add($message);
	}

	if (empty($messages))
	{
		return true;
	}

	$readService = new IMV2MessageReadService();
	$counters = $readService->readNotifications($messageCollection, $users)->getResult()['COUNTERS'];

	$isLoadPull = Loader::includeModule("pull");
	foreach ($messagesByUser as $chatId => $messagesList)
	{
		//BitrixImCounter::clearCache($users[$chatId]);
		CIMMessenger::SpeedFileDelete($users[$chatId], IM_SPEED_NOTIFY);

		if ($isLoadPull)
		{
			BitrixPullEvent::add($users[$chatId], Array(
				'module_id' => 'im',
				'command' => 'notifyRead',
				'params' => Array(
					'chatId' => $chatId,
					'list' => array_values($messagesList),
					'counter' => (int)$counters[$chatId]
				),
				'extra' => BitrixImCommon::getPullExtra()
			));
		}
	}

	/*$strSql ="
		SELECT M.ID, M.CHAT_ID, R.USER_ID
		FROM b_im_message M
		LEFT JOIN b_im_relation R ON R.CHAT_ID = M.CHAT_ID
		WHERE
			M.NOTIFY_SUB_TAG IN (".implode(",", $sqlTags).")
			AND M.NOTIFY_READ='N'";
	$res = $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__); while ($message = $res->fetch()) { $messages[$message["ID"]] = $message; $messagesByUser[$message["CHAT_ID"]][] = $message["ID"]; $users[$message["CHAT_ID"]] = $message["USER_ID"]; $chats[$message["CHAT_ID"]] = $message["CHAT_ID"]; } if (!empty($messages)) { $strSql ="UPDATE b_im_message SET NOTIFY_READ = 'Y' WHERE ID IN (".implode(",", array_keys($messages)).")"; $DB->Query($strSql); $counters = CIMNotify::GetRealCounters($chats); foreach ($counters as $chatId => $counter) { $DB->Query("UPDATE b_im_relation SET COUNTER = {$counter} WHERE CHAT_ID = {$chatId}"); } $isLoadPull = Loader::includeModule("pull"); foreach ($messagesByUser as $chatId => $messagesList) { BitrixImCounter::clearCache($users[$chatId]); CIMMessenger::SpeedFileDelete($users[$chatId], IM_SPEED_NOTIFY); if ($isLoadPull) { BitrixPullEvent::add($users[$chatId], Array( 'module_id' => 'im', 'command' => 'notifyRead', 'params' => Array( 'chatId' => $chatId, 'list' => array_values($messagesList), 'counter' => (int)$counters[$chatId] ), 'extra' => BitrixImCommon::getPullExtra() )); } } }*/ return true; }