- Модуль: 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;
}