public function MarkNotifyRead($id = 0, $setThisAndHigher = false, $appId = 'Bitrix24')
{
$id = intval($id);
if ($id < 0)
return false;
/*global $DB;
if ($id === 0)
{
$query = [
'select' => ['CHAT_ID'],
'filter' => [
'=USER_ID' => $this->user_id,
'=MESSAGE_TYPE' => IM_MESSAGE_SYSTEM
]
];
$chatResult = BitrixImModelRelationTable::getList($query)->fetch();
$chatId = (int)$chatResult['CHAT_ID'];
if (!$chatId)
{
return false;
}
}
else
{
$query = [
'select' => ['ID', 'CHAT_ID', 'NOTIFY_TAG'],
'filter' => [
'=RELATION.MESSAGE_TYPE' => IM_MESSAGE_SYSTEM,
'=RELATION.USER_ID' => $this->user_id,
'=ID' => $id
]
];
$message = BitrixImModelMessageTable::getList($query)->fetch();
if (!$message)
{
return false;
}
$chatId = (int)$message['CHAT_ID'];
}
$messages = array();
$filter = [
'=CHAT_ID' => $chatId,
'=NOTIFY_READ' => 'N',
];
if ($id > 0)
{
$filterId = ($setThisAndHigher? '>=': '=').'ID';
$filter[$filterId] = $id;
}
$orm = BitrixImModelMessageTable::getList(Array(
'select' => ['ID', 'CHAT_ID', 'NOTIFY_TAG'],
'filter' => $filter
));
while ($row = $orm->fetch())
{
$messages[$row['ID']] = $row;
}
if ($messages)
{
$DB->Query("UPDATE b_im_message SET NOTIFY_READ = 'Y' WHERE ID IN (".implode(',', array_keys($messages)).")");
}
if (!empty($message['NOTIFY_TAG']))
{
$orm = BitrixImModelMessageTable::getList(Array(
'select' => Array('ID', 'CHAT_ID', 'NOTIFY_TYPE'),
'filter' => Array(
'=CHAT_ID' => $chatId,
'=NOTIFY_READ' => 'N',
'=NOTIFY_TAG' => $message['NOTIFY_TAG'],
)
));
$tagIds = Array();
while ($row = $orm->fetch())
{
$messages[$row['ID']] = $row;
$tagIds[] = $row['ID'];
}
if ($tagIds)
{
$DB->Query("UPDATE b_im_message SET NOTIFY_READ = 'Y' WHERE ID IN (".implode(',', $tagIds).")");
}
}
if (!$messages)
{
self::SetLastId($chatId, $this->user_id);
return false;
}
$lastId = max(array_keys($messages));
self::SetLastId($chatId, $this->user_id, $lastId);*/
$findResult = NotifyChat::find(['TO_USER_ID' => $this->user_id]);
if (!$findResult->isSuccess())
{
return false;
}
$chatId = (int)$findResult->getResult()['ID'];
$readService = new IMV2MessageReadService($this->user_id);
$counterService = $readService->getCounterService();
if ($id === 0)
{
$readService->readAllInChat($chatId);
if (CModule::IncludeModule("pull"))
{
BitrixPullEvent::add($this->user_id, Array(
'module_id' => 'im',
'command' => 'notifyReadAll',
'params' => Array(
'chatId' => $chatId,
),
'extra' => BitrixImCommon::getPullExtra()
));
BitrixPullMobileCounter::send($this->user_id, $appId);
}
return true;
}
$messages = [];
$operator = $setThisAndHigher ? '>=' : '=';
$query = IMModelMessageUnreadTable::query()
->setSelect(['MESSAGE_ID'])
->where('USER_ID', $this->user_id)
->where('CHAT_ID', $chatId)
->where('MESSAGE_ID', $operator, $id)
->exec()
;
$messageCollection = new IMV2MessageCollection();
while ($row = $query->fetch())
{
$messages[] = (int)$row['MESSAGE_ID'];
$message = new BitrixImV2Message();
$message->setMessageId((int)$row['MESSAGE_ID'])->setChatId($chatId)->setAuthorId(0);
$messageCollection->add($message);
}
if (empty($messages))
{
return false;
}
$counter = $readService->readNotifications($messageCollection, [$chatId => $this->user_id])->getResult()['COUNTERS'][$chatId];
if (CModule::IncludeModule("pull"))
{
BitrixPullEvent::add($this->user_id, Array(
'module_id' => 'im',
'command' => 'notifyRead',
'params' => Array(
'chatId' => $chatId,
'list' => $messages,
'counter' => $counter
),
'extra' => BitrixImCommon::getPullExtra()
));
BitrixPullMobileCounter::send($this->user_id, $appId);
}
CIMMessenger::SpeedFileDelete($this->user_id, IM_SPEED_NOTIFY);
return true;
}