1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
ViewedService.php
См. документацию.
1<?php
2
3namespace Bitrix\Im\V2\Message;
4
5use Bitrix\Im\Model\EO_Message_Collection;
6use Bitrix\Im\Model\MessageTable;
7use Bitrix\Im\Model\MessageViewedTable;
8use Bitrix\Im\V2\Chat;
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;
16
18{
19 use ContextCustomer;
20
21 public function __construct(?int $userId = null)
22 {
23 if (isset($userId))
24 {
25 $context = new Context();
26 $context->setUser($userId);
27 $this->setContext($context);
28 }
29 }
30
31 public function add(MessageCollection $messages): void
32 {
33 $messagesToView = $this->filterMessageToInsert($messages);
34
35 $insertFields = $this->prepareInsertFields($messagesToView);
36 MessageViewedTable::multiplyInsertWithoutDuplicate($insertFields, ['DEADLOCK_SAFE' => true]);
37 $messagesToView->setViewedByOthers()->save(true);
38 }
39
40 public function addTo(Message $message): Result
41 {
42 $lowerBound = $this->getLastViewedMessageId($message->getChatId());
43 $includeBound = false;
44 if ($lowerBound === null)
45 {
46 $lowerBound = $message->getChat()->getStartId($this->getContext()->getUserId());
47 $includeBound = true;
48 }
49
50 $messages = $this->getLastMessageIdsBetween($message, $lowerBound, $includeBound);
51 $messagesToViewByOthers = new EO_Message_Collection();
52 $dateViewed = new DateTime();
53 $userId = $this->getContext()->getUserId();
54 $chatId = $message->getChatId();
55 $insertFields = [];
56
57 foreach ($messages as $messageEntity)
58 {
59 $insertFields[] = [
60 'USER_ID' => $userId,
61 'CHAT_ID' => $chatId,
62 'MESSAGE_ID' => $messageEntity->getId(),
63 'DATE_CREATE' => $dateViewed,
64 ];
65 if (!$messageEntity->getNotifyRead())
66 {
67 $messageEntity->setNotifyRead(true);
68 $messagesToViewByOthers->add($messageEntity);
69 }
70 }
71
72 MessageViewedTable::multiplyInsertWithoutDuplicate($insertFields, ['DEADLOCK_SAFE' => true]);
73 if ($messagesToViewByOthers->count() !== 0)
74 {
75 $messagesToViewByOthers->save(true);
76 }
77
78 return (new Result())->setResult(['VIEWED_MESSAGES' => $messages->getIdList()]);
79 }
80
81 public function getLastViewedMessageId(int $chatId): ?int
82 {
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())
87 ->fetch()
88 ;
89
90 return ($result && isset($result['LAST_VIEWED'])) ? (int)$result['LAST_VIEWED'] : null;
91 }
92
94 {
95 $result = MessageViewedTable::query() //todo: add unique index (MESSAGE_ID, USER_ID, DATE_CREATE)
96 ->setSelect(['DATE_CREATE'])
97 ->where('USER_ID', $this->getContext()->getUserId())
98 ->where('MESSAGE_ID', $messageId)
99 ->fetch()
100 ;
101
102 return $result ? $result['DATE_CREATE'] : null;
103 }
104
106 {
107 if (empty($userIds))
108 {
109 return [];
110 }
111
112 $result = MessageViewedTable::query() //todo: add unique index (MESSAGE_ID, USER_ID, DATE_CREATE)
113 ->setSelect(['DATE_CREATE', 'USER_ID'])
114 ->whereIn('USER_ID', $userIds)
115 ->where('MESSAGE_ID', $messageId)
116 ->fetchAll()
117 ;
118
119 $dateViewedByUsers = [];
120
121 foreach ($result as $row)
122 {
123 $dateViewedByUsers[(int)$row['USER_ID']] = $row['DATE_CREATE'];
124 }
125
126 return $dateViewedByUsers;
127 }
128
129 public function getMessageStatus(int $messageId): string
130 {
131 $isMessageRead = MessageTable::query()
132 ->setSelect(['ID', 'NOTIFY_READ'])
133 ->where('ID', $messageId)
134 ->fetchObject()
135 ?->getNotifyRead()
136 ;
137
139 }
140
141 public function getMessageViewersIds(int $messageId, ?int $limit = null, ?int $offset = null): array
142 {
143 $query = MessageViewedTable::query()
144 ->setSelect(['USER_ID'])
145 ->where('MESSAGE_ID', $messageId)
146 ->setOrder(['ID' => 'ASC'])
147 ;
148
149 if (isset($limit))
150 {
151 $query->setLimit($limit);
152 }
153 if (isset($offset))
154 {
155 $query->setOffset($offset);
156 }
157
158 $viewedMessages = $query->fetchCollection();
159 $viewersIds = [];
160
161 foreach ($viewedMessages as $viewedMessage)
162 {
163 $userId = $viewedMessage->getUserId();
164 $viewersIds[$userId] = $userId;
165 }
166
167 return $viewersIds;
168 }
169
170 public function deleteStartingFrom(Message $message): void
171 {
172 return;
173 $userId = $this->getContext()->getUserId();
174 MessageViewedTable::deleteByFilter(['>=MESSAGE_ID' => $message->getMessageId(), '=CHAT_ID' => $message->getChatId(), '=USER_ID' => $userId]);
175 }
176
177 public function deleteByMessageIdForAll(int $messageId): void
178 {
179 MessageViewedTable::deleteByFilter(['=MESSAGE_ID' => $messageId]); //todo add index
180 }
181
182 public function deleteByMessagesIdsForAll(array $messagesIds): void
183 {
184 MessageViewedTable::deleteByFilter(['=MESSAGE_ID' => $messagesIds]); //todo add index
185 }
186
187 public function deleteByChatId(int $chatId): void
188 {
189 MessageViewedTable::deleteByFilter(['=CHAT_ID' => $chatId, '=USER_ID' => $this->getContext()->getUserId()]);
190 }
191
192 private function prepareInsertFields(MessageCollection $messages): array
193 {
194 $insertFields = [];
195 $userId = $this->getContext()->getUserId();
196 $dateCreate = new DateTime();
197
198 foreach ($messages as $message)
199 {
200 $insertFields[] = [
201 'USER_ID' => $userId,
202 'CHAT_ID' => $message->getChatId(),
203 'MESSAGE_ID' => $message->getMessageId(),
204 'DATE_CREATE' => $dateCreate,
205 ];
206 }
207
208 return $insertFields;
209 }
210
211 private function getLastMessageIdsBetween(Message $message, int $lowerBound, bool $includeBound): EO_Message_Collection
212 {
213 $operator = $includeBound ? '>=' : '>';
214
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'])
221 ->setLimit(100)
222 ;
223 if ($message->getChat()->getType() !== \IM_MESSAGE_SYSTEM)
224 {
225 $query->whereNot('AUTHOR_ID', $this->getContext()->getUserId());
226 }
227
228 return $query->fetchCollection();
229 }
230
231 private function filterMessageToInsert(MessageCollection $messages): MessageCollection
232 {
233 $userId = $this->getContext()->getUserId();
234
235 return $messages->filter(
236 fn (Message $message) => $message->getAuthorId() !== $userId || $message->getChat()->getType() === \IM_MESSAGE_SYSTEM
237 );
238 }
239}
if(! $messageFields||!isset($messageFields['message_id'])||!isset($messageFields['status'])||!CModule::IncludeModule("messageservice")) $messageId
Определения callback_ismscenter.php:26
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
__construct(?int $userId=null)
Определения ViewedService.php:21
deleteByChatId(int $chatId)
Определения ViewedService.php:187
getDateViewedByMessageId(int $messageId)
Определения ViewedService.php:93
deleteByMessagesIdsForAll(array $messagesIds)
Определения ViewedService.php:182
addTo(Message $message)
Определения ViewedService.php:40
deleteByMessageIdForAll(int $messageId)
Определения ViewedService.php:177
add(MessageCollection $messages)
Определения ViewedService.php:31
deleteStartingFrom(Message $message)
Определения ViewedService.php:170
getMessageViewersIds(int $messageId, ?int $limit=null, ?int $offset=null)
Определения ViewedService.php:141
getMessageStatus(int $messageId)
Определения ViewedService.php:129
getLastViewedMessageId(int $chatId)
Определения ViewedService.php:81
getDateViewedByMessageIdForEachUser(int $messageId, array $userIds)
Определения ViewedService.php:105
getChatId()
Определения Message.php:862
Определения result.php:20
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
$query
Определения get_search.php:11
const IM_MESSAGE_STATUS_DELIVERED
Определения include.php:46
const IM_MESSAGE_SYSTEM
Определения include.php:21
const IM_MESSAGE_STATUS_RECEIVED
Определения include.php:44
$context
Определения csv_new_setup.php:223
Определения Uuid.php:3
Определения culture.php:9
$message
Определения payment.php:8
$messages
Определения template.php:8