3namespace Bitrix\Im\V2\Message;
5use Bitrix\Im\Model\EO_Message_Collection;
6use Bitrix\Im\Model\MessageTable;
7use Bitrix\Im\Model\MessageViewedTable;
9use Bitrix\Im\V2\Common\ContextCustomer;
10use Bitrix\Im\V2\Message;
11use Bitrix\Im\V2\MessageCollection;
12use Bitrix\Im\V2\Result;
13use Bitrix\Im\V2\Service\Context;
14use Bitrix\Main\ORM\Fields\ExpressionField;
15use Bitrix\Main\Type\DateTime;
33 $messagesToView = $this->filterMessageToInsert(
$messages);
35 $insertFields = $this->prepareInsertFields($messagesToView);
36 MessageViewedTable::multiplyInsertWithoutDuplicate($insertFields, [
'DEADLOCK_SAFE' =>
true]);
37 $messagesToView->setViewedByOthers()->save(
true);
43 $includeBound =
false;
44 if ($lowerBound ===
null)
46 $lowerBound =
$message->getChat()->getStartId($this->getContext()->getUserId());
50 $messages = $this->getLastMessageIdsBetween(
$message, $lowerBound, $includeBound);
53 $userId = $this->getContext()->getUserId();
62 'MESSAGE_ID' => $messageEntity->getId(),
63 'DATE_CREATE' => $dateViewed,
65 if (!$messageEntity->getNotifyRead())
67 $messageEntity->setNotifyRead(
true);
68 $messagesToViewByOthers->add($messageEntity);
72 MessageViewedTable::multiplyInsertWithoutDuplicate($insertFields, [
'DEADLOCK_SAFE' =>
true]);
73 if ($messagesToViewByOthers->count() !== 0)
75 $messagesToViewByOthers->save(
true);
78 return (
new Result())->setResult([
'VIEWED_MESSAGES' =>
$messages->getIdList()]);
83 $result = MessageViewedTable::query()
84 ->setSelect([
'LAST_VIEWED' =>
new ExpressionField(
'LAST_VIEWED',
'MAX(%s)', [
'MESSAGE_ID'])])
85 ->where(
'CHAT_ID', $chatId)
86 ->where(
'USER_ID', $this->getContext()->getUserId())
95 $result = MessageViewedTable::query()
96 ->setSelect([
'DATE_CREATE'])
97 ->where(
'USER_ID', $this->getContext()->getUserId())
112 $result = MessageViewedTable::query()
113 ->setSelect([
'DATE_CREATE',
'USER_ID'])
114 ->whereIn(
'USER_ID', $userIds)
119 $dateViewedByUsers = [];
123 $dateViewedByUsers[(int)$row[
'USER_ID']] = $row[
'DATE_CREATE'];
126 return $dateViewedByUsers;
131 $isMessageRead = MessageTable::query()
132 ->setSelect([
'ID',
'NOTIFY_READ'])
143 $query = MessageViewedTable::query()
144 ->setSelect([
'USER_ID'])
146 ->setOrder([
'ID' =>
'ASC'])
155 $query->setOffset($offset);
158 $viewedMessages =
$query->fetchCollection();
161 foreach ($viewedMessages as $viewedMessage)
163 $userId = $viewedMessage->getUserId();
173 $userId = $this->getContext()->getUserId();
174 MessageViewedTable::deleteByFilter([
'>=MESSAGE_ID' =>
$message->getMessageId(),
'=CHAT_ID' =>
$message->getChatId(),
'=USER_ID' =>
$userId]);
179 MessageViewedTable::deleteByFilter([
'=MESSAGE_ID' =>
$messageId]);
184 MessageViewedTable::deleteByFilter([
'=MESSAGE_ID' => $messagesIds]);
189 MessageViewedTable::deleteByFilter([
'=CHAT_ID' => $chatId,
'=USER_ID' => $this->getContext()->getUserId()]);
195 $userId = $this->getContext()->getUserId();
203 'MESSAGE_ID' =>
$message->getMessageId(),
204 'DATE_CREATE' => $dateCreate,
208 return $insertFields;
213 $operator = $includeBound ?
'>=' :
'>';
215 $query = MessageTable::query()
216 ->setSelect([
'ID',
'NOTIFY_READ'])
217 ->where(
'CHAT_ID',
$message->getChatId())
218 ->where(
'ID',
'<=',
$message->getMessageId())
219 ->where(
'ID', $operator, $lowerBound)
220 ->setOrder([
'DATE_CREATE' =>
'DESC',
'ID' =>
'DESC'])
225 $query->whereNot(
'AUTHOR_ID', $this->getContext()->getUserId());
228 return $query->fetchCollection();
231 private function filterMessageToInsert(MessageCollection
$messages): MessageCollection
233 $userId = $this->getContext()->getUserId();
if(! $messageFields||!isset($messageFields['message_id'])||!isset($messageFields['status'])||!CModule::IncludeModule("messageservice")) $messageId
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
__construct(?int $userId=null)
deleteByChatId(int $chatId)
getDateViewedByMessageId(int $messageId)
deleteByMessagesIdsForAll(array $messagesIds)
deleteByMessageIdForAll(int $messageId)
add(MessageCollection $messages)
deleteStartingFrom(Message $message)
getMessageViewersIds(int $messageId, ?int $limit=null, ?int $offset=null)
getMessageStatus(int $messageId)
getLastViewedMessageId(int $chatId)
getDateViewedByMessageIdForEachUser(int $messageId, array $userIds)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
const IM_MESSAGE_STATUS_DELIVERED
const IM_MESSAGE_STATUS_RECEIVED