• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/lib/update/notifyreadrecount.php
  • Класс: BitrixImUpdateNotifyReadRecount
  • Вызов: NotifyReadRecount::execute
public function execute(array &$result): bool
{
	Option::delete(self::$moduleId, ['name' => self::OPTION_NAME]);
	return false;
	global $DB;

	if (!Loader::includeModule(self::$moduleId))
	{
		return false;
	}

	$return = false;

	$params = Option::get(self::$moduleId, self::OPTION_NAME);
	$params = ($params !== '' ? @unserialize($params, ['allowed_classes' => false]) : []);
	$params = (is_array($params) ? $params : []);

	if (empty($params))
	{
		$params = [
			'lastId' => 0,
			'number' => 0,
			'count' => RelationTable::getCount([
				'>COUNTER' => 0,
				'=MESSAGE_TYPE' => BitrixImChat::TYPE_SYSTEM
			]),
		];
	}

	if ($params['count'] > 0)
	{
		$result['steps'] = '';
		$result['count'] = $params['count'];

		$cursor = RelationTable::getList([
			'select' => ['ID', 'CHAT_ID'],
			'filter' => [
				'>ID' => $params['lastId'],
				'>COUNTER' => 0,
				'=MESSAGE_TYPE' => BitrixImChat::TYPE_SYSTEM
			],
			'order' => ['ID' => 'ASC'],
			'limit' => 1000
		]);

		$found = false;
		while ($row = $cursor->fetch())
		{
			$DB->Query("
				UPDATE b_im_message M
				SET M.NOTIFY_READ = 'Y'
				WHERE M.CHAT_ID = " . $row['CHAT_ID'] . "
				AND M.NOTIFY_READ <> 'Y'
				AND M.DATE_CREATE < DATE_SUB(NOW(), INTERVAL 30 DAY)
			");

			$counterResult = $DB->Query("
				SELECT COUNT(1) as CNT
                    FROM b_im_message M
				WHERE M.CHAT_ID = " . $row['CHAT_ID'] . "
				AND NOTIFY_READ <> 'Y'
			")->GetNext();

			RelationTable::update($row['ID'], [
				'COUNTER' => $counterResult['CNT']
			]);

			$params['lastId'] = $row['ID'];
			$params['number']++;
			$found = true;
		}

		if ($found)
		{
			Option::set(self::$moduleId, self::OPTION_NAME, serialize($params));
			$return = true;
		}
		else
		{
			BitrixImCounter::clearCache();
			Option::delete(self::$moduleId, ['name' => self::OPTION_NAME]);
		}

		$result['steps'] = $params['number'];
	}

	return $return;
}