1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
im_history.php
См. документацию.
1<?
3
4use Bitrix\Im as IM;
5
7{
8 private $user_id = 0;
9 private $bHideLink = false;
10
11 function __construct($user_id = false, $arParams = Array())
12 {
13 global $USER;
14 $this->user_id = intval($user_id);
15 if ($user_id == 0)
16 $this->user_id = intval($USER->GetID());
17 if (isset($arParams['HIDE_LINK']) && $arParams['HIDE_LINK'] == 'Y')
18 $this->bHideLink = true;
19 }
20
21 function SearchMessage($searchText, $toUserId, $fromUserId = false, $bTimeZone = true)
22 {
23 global $DB;
24
25 $fromUserId = intval($fromUserId);
26 if ($fromUserId <= 0)
27 $fromUserId = $this->user_id;
28
29 $toUserId = intval($toUserId);
30 if ($toUserId <= 0)
31 {
32 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_HISTORY_ERROR_TO_USER_ID"), "ERROR_TO_USER_ID");
33 return false;
34 }
35
36 $searchText = trim($searchText);
37 if (mb_strlen($searchText) < 3)
38 {
39 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_HISTORY_SEARCH_EMPTY"), "ERROR_SEARCH_EMPTY");
40 return false;
41 }
42
43 $chatId = 0;
44 $arMessages = Array();
45 $arMessageId = Array();
46 $arUnreadMessage = Array();
47 $arMessageFiles = Array();
48 $arUsers = Array();
49
50 $limitById = '';
51 if ($toUserId == $fromUserId)
52 {
53 $chat = new CIMChat();
54 $chatId = $chat->GetPersonalChat();
55 if (!$chatId)
56 {
57 return false;
58 }
59 $startId = 0;
60 }
61 else
62 {
63 $arRelation = \CIMChat::GetPrivateRelation($fromUserId, $toUserId);
64 $chatId = $arRelation['CHAT_ID'];
65 $startId = $arRelation['START_ID'];
66 }
67 if ($chatId > 0)
68 {
69 $where = [
70 '=CHAT_ID' => $chatId,
71 '*%MESSAGE' => $searchText,
72 ];
73 if ($this->checkFullText($searchText))
74 {
75 $searchText = \Bitrix\Main\Search\Content::prepareStringToken($searchText);
76 $where = [
77 '=CHAT_ID' => $chatId,
78 '*INDEX.SEARCH_CONTENT' => $searchText,
79 ];
80 }
81 if ($startId)
82 {
83 $where['>=ID'] = intval($startId);
84 }
85
86 $orm = \Bitrix\Im\Model\MessageTable::getList(
87 [
88 'select' => [
89 'ID',
90 'CHAT_ID',
91 'MESSAGE',
92 'AUTHOR_ID',
93 'NOTIFY_EVENT',
94 'DATE_CREATE'
95 ],
96 'filter' => $where,
97 'order' => ['DATE_CREATE' => 'DESC', 'ID' => 'DESC'],
98 'limit' => 1000,
99 ]
100 );
101
102 while ($arRes = $orm->fetch())
103 {
104 if ($fromUserId == $arRes['AUTHOR_ID'])
105 {
106 $arRes['TO_USER_ID'] = $toUserId;
107 $arRes['FROM_USER_ID'] = $fromUserId;
108 $convId = $arRes['TO_USER_ID'];
109 }
110 else
111 {
112 $arRes['TO_USER_ID'] = $fromUserId;
113 $arRes['FROM_USER_ID'] = $toUserId;
114 $convId = $arRes['FROM_USER_ID'];
115 }
116
117 $arMessages[$arRes['ID']] = Array(
118 'id' => $arRes['ID'],
119 'chatId' => $arRes['CHAT_ID'],
120 'senderId' => $arRes['FROM_USER_ID'],
121 'recipientId' => $arRes['TO_USER_ID'],
122 'date' => $arRes['DATE_CREATE'],
123 'system' => $arRes['NOTIFY_EVENT'] == 'private'? 'N': 'Y',
124 'text' => \Bitrix\Im\Text::parse($arRes['MESSAGE']),
125 'textLegacy' => \Bitrix\Im\Text::parseLegacyFormat($arRes['MESSAGE'])
126 );
127
128 $arUsers[$convId][] = $arRes['ID'];
129 $arMessageId[] = $arRes['ID'];
130 $chatId = $arRes['CHAT_ID'];
131 }
132
133 $params = CIMMessageParam::Get($arMessageId);
134 $arFiles = Array();
135 foreach ($params as $messageId => $param)
136 {
137 $arMessages[$messageId]['params'] = $param;
138 if (isset($param['FILE_ID']))
139 {
140 foreach ($param['FILE_ID'] as $fileId)
141 {
142 $arFiles[$fileId] = $fileId;
143 }
144 }
145 }
146 $arMessageFiles = CIMDisk::GetFiles($chatId, $arFiles);
147 $arMessages = CIMMessageLink::prepareShow($arMessages, $params);
148 }
149
150 return Array('chatId' => $chatId, 'message' => $arMessages, 'unreadMessage' => $arUnreadMessage, 'usersMessage' => $arUsers, 'files' => $arMessageFiles);
151 }
152
153 function SearchDateMessage($searchDate, $toUserId, $fromUserId = false, $bTimeZone = true)
154 {
155 global $DB;
156
157 $fromUserId = intval($fromUserId);
158 if ($fromUserId <= 0)
159 $fromUserId = $this->user_id;
160
161 $toUserId = intval($toUserId);
162 if ($toUserId <= 0)
163 {
164 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_HISTORY_ERROR_TO_USER_ID"), "ERROR_TO_USER_ID");
165 return false;
166 }
167
168 $sqlHelper = Bitrix\Main\Application::getInstance()->getConnection()->getSqlHelper();
169
170 try
171 {
172 $dateStart = \Bitrix\Main\Type\DateTime::createFromUserTime($searchDate);
173 $sqlDateStart = $sqlHelper->getCharToDateFunction($dateStart->format("Y-m-d H:i:s"));
174
175 $dateEnd = $dateStart->add('1 DAY');
176 $sqlDateEnd = $sqlHelper->getCharToDateFunction($dateEnd->format("Y-m-d H:i:s"));
177 }
178 catch(\Bitrix\Main\ObjectException $e)
179 {
180 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_HISTORY_SEARCH_DATE_EMPTY"), "ERROR_SEARCH_EMPTY");
181 return false;
182 }
183
184 $chatId = 0;
185 $arMessages = Array();
186 $arMessageId = Array();
187 $arUnreadMessage = Array();
188 $arMessageFiles = Array();
189 $arUsers = Array();
190
191 $limitById = '';
192 if ($toUserId == $fromUserId)
193 {
194 $chat = new CIMChat();
195 $chatId = $chat->GetPersonalChat();
196 if (!$chatId)
197 {
198 return false;
199 }
200 $startId = 0;
201 }
202 else
203 {
204 $arRelation = \CIMChat::GetPrivateRelation($fromUserId, $toUserId);
205 $chatId = $arRelation['CHAT_ID'];
206 $startId = $arRelation['START_ID'];
207 }
208 if ($chatId > 0)
209 {
210 if ($startId > 0)
211 {
212 $limitById = 'AND M.ID >= '.intval($startId);
213 }
214
215 if (!$bTimeZone)
216 CTimeZone::Disable();
217 $strSql = "
218 SELECT
219 M.ID,
220 M.CHAT_ID,
221 M.MESSAGE,
222 ".$DB->DatetimeToTimestampFunction('M.DATE_CREATE')." as DATE_CREATE,
223 M.AUTHOR_ID,
224 ".$fromUserId." as R1_USER_ID,
225 ".$toUserId." as R2_USER_ID,
226 M.NOTIFY_EVENT
227 FROM b_im_message M
228 WHERE
229 M.CHAT_ID = ".$chatId."
230 AND M.DATE_CREATE >= ".$sqlDateStart." AND M.DATE_CREATE <= ".$sqlDateEnd."
231 ".$limitById."
232 ORDER BY M.DATE_CREATE DESC, M.ID DESC
233 ";
234 if (!$bTimeZone)
235 CTimeZone::Enable();
236 $dbRes = $DB->Query($strSql);
237
238 while ($arRes = $dbRes->Fetch())
239 {
240 if ($fromUserId == $arRes['AUTHOR_ID'])
241 {
242 $arRes['TO_USER_ID'] = $arRes['R2_USER_ID'];
243 $arRes['FROM_USER_ID'] = $arRes['R1_USER_ID'];
244 $convId = $arRes['TO_USER_ID'];
245 }
246 else
247 {
248 $arRes['TO_USER_ID'] = $arRes['R1_USER_ID'];
249 $arRes['FROM_USER_ID'] = $arRes['R2_USER_ID'];
250 $convId = $arRes['FROM_USER_ID'];
251 }
252
253 $arMessages[$arRes['ID']] = Array(
254 'id' => $arRes['ID'],
255 'chatId' => $arRes['CHAT_ID'],
256 'senderId' => $arRes['FROM_USER_ID'],
257 'recipientId' => $arRes['TO_USER_ID'],
258 'date' => \Bitrix\Main\Type\DateTime::createFromTimestamp($arRes['DATE_CREATE']),
259 'system' => $arRes['NOTIFY_EVENT'] == 'private' ? 'N' : 'Y',
260 'text' => \Bitrix\Im\Text::parse($arRes['MESSAGE']),
261 'textLegacy' => \Bitrix\Im\Text::parseLegacyFormat($arRes['MESSAGE'])
262 );
263
264 $arUsers[$convId][] = $arRes['ID'];
265 $arMessageId[] = $arRes['ID'];
266 $chatId = $arRes['CHAT_ID'];
267 }
268
269 $params = CIMMessageParam::Get($arMessageId);
270 $arFiles = Array();
271 foreach ($params as $messageId => $param)
272 {
273 $arMessages[$messageId]['params'] = $param;
274 if (isset($param['FILE_ID']))
275 {
276 foreach ($param['FILE_ID'] as $fileId)
277 {
278 $arFiles[$fileId] = $fileId;
279 }
280 }
281 }
282 $arMessageFiles = CIMDisk::GetFiles($chatId, $arFiles);
283 $arMessages = CIMMessageLink::prepareShow($arMessages, $params);
284 }
285
286 return Array('chatId' => $chatId, 'message' => $arMessages, 'unreadMessage' => $arUnreadMessage, 'usersMessage' => $arUsers, 'files' => $arMessageFiles);
287 }
288
289 function GetMoreMessage($pageId, $toUserId, $fromUserId = false, $bTimeZone = true)
290 {
291 global $DB;
292
293 $iNumPage = 1;
294 if (intval($pageId) > 0)
295 $iNumPage = intval($pageId);
296
297 $fromUserId = intval($fromUserId);
298 if ($fromUserId <= 0)
299 $fromUserId = $this->user_id;
300
301 $toUserId = intval($toUserId);
302 if ($toUserId <= 0)
303 {
304 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_HISTORY_ERROR_TO_USER_ID"), "ERROR_TO_USER_ID");
305 return false;
306 }
307
308 $chatId = 0;
309 $arMessages = Array();
310 $arMessageId = Array();
311 $arUnreadMessage = Array();
312 $arMessageFiles = Array();
313 $arUsers = Array();
314
315 $limitById = '';
316
317 if ($toUserId == $fromUserId)
318 {
319 $chat = new CIMChat();
320 $chatId = $chat->GetPersonalChat();
321 if (!$chatId)
322 {
323 return false;
324 }
325 $startId = 0;
326 }
327 else
328 {
329 $arRelation = \CIMChat::GetPrivateRelation($fromUserId, $toUserId);
330 $chatId = $arRelation['CHAT_ID'] ?? null;
331 $startId = $arRelation['START_ID'];
332 }
333
334 if ($chatId > 0)
335 {
336 if ($startId > 0)
337 {
338 $limitById = 'AND M.ID >= '.intval($startId);
339 }
340 $sqlStr = "
341 SELECT COUNT(M.ID) as CNT
342 FROM b_im_message M
343 WHERE M.CHAT_ID = ".$chatId."
344 ".$limitById."
345 ";
346 $res_cnt = $DB->Query($sqlStr);
347 $res_cnt = $res_cnt->Fetch();
348 $cnt = $res_cnt["CNT"];
349
350 if ($cnt > 0 && ceil($cnt/30) >= $iNumPage)
351 {
352 if (!$bTimeZone)
353 CTimeZone::Disable();
354 $strSql ="
355 SELECT
356 M.ID,
357 M.CHAT_ID,
358 M.MESSAGE,
359 ".$DB->DatetimeToTimestampFunction('M.DATE_CREATE')." DATE_CREATE,
360 M.AUTHOR_ID,
361 M.NOTIFY_EVENT,
362 ".$fromUserId." R1_USER_ID,
363 ".$toUserId." R2_USER_ID
364 FROM b_im_message M
365 WHERE
366 M.CHAT_ID = ".$chatId."
367 ".$limitById."
368 ORDER BY M.DATE_CREATE DESC, M.ID DESC
369 ";
370 if (!$bTimeZone)
371 CTimeZone::Enable();
372 $dbRes = new CDBResult();
373 $dbRes->NavQuery($strSql, $cnt, Array('iNumPage' => $iNumPage, 'nPageSize' => 30));
374
375 while ($arRes = $dbRes->Fetch())
376 {
377 if ($fromUserId == $arRes['AUTHOR_ID'])
378 {
379 $arRes['TO_USER_ID'] = $arRes['R2_USER_ID'];
380 $arRes['FROM_USER_ID'] = $arRes['R1_USER_ID'];
381 $convId = $arRes['TO_USER_ID'];
382 }
383 else
384 {
385 $arRes['TO_USER_ID'] = $arRes['R1_USER_ID'];
386 $arRes['FROM_USER_ID'] = $arRes['R2_USER_ID'];
387 $convId = $arRes['FROM_USER_ID'];
388 }
389 $arMessages[$arRes['ID']] = Array(
390 'id' => $arRes['ID'],
391 'chatId' => $arRes['CHAT_ID'],
392 'senderId' => $arRes['FROM_USER_ID'],
393 'recipientId' => $arRes['TO_USER_ID'],
394 'date' => \Bitrix\Main\Type\DateTime::createFromTimestamp($arRes['DATE_CREATE']),
395 'system' => $arRes['NOTIFY_EVENT'] == 'private'? 'N': 'Y',
396 'text' => \Bitrix\Im\Text::parse($arRes['MESSAGE']),
397 'textLegacy' => \Bitrix\Im\Text::parseLegacyFormat($arRes['MESSAGE'])
398 );
399 $arUsers[$convId][] = $arRes['ID'];
400 $arMessageId[] = $arRes['ID'];
401 $chatId = $arRes['CHAT_ID'];
402 }
403
404 $params = CIMMessageParam::Get($arMessageId);
405 $arFiles = Array();
406 foreach ($params as $messageId => $param)
407 {
408 $arMessages[$messageId]['params'] = $param;
409 if (isset($param['FILE_ID']))
410 {
411 foreach ($param['FILE_ID'] as $fileId)
412 {
413 $arFiles[$fileId] = $fileId;
414 }
415 }
416 }
417 $arMessageFiles = CIMDisk::GetFiles($chatId, $arFiles);
418 $arMessages = CIMMessageLink::prepareShow($arMessages, $params);
419 }
420 }
421
422
423 return Array('chatId' => $chatId, 'message' => $arMessages, 'usersMessage' => $arUsers, 'files' => $arMessageFiles);
424 }
425
427 {
428 global $DB;
429
430 return false;
431 }
432
434 {
435 global $DB;
436
437 $userId = intval($userId);
438
439 if ($this->user_id == $userId)
440 {
441 return false;
442 }
443
444 $strSql ="
445 SELECT
446 MAX(M.ID)+1 as MAX_ID,
447 M.CHAT_ID,
448 R1.ID as R1_ID,
449 R1.START_ID as R1_START_ID,
450 R2.ID as R2_ID,
451 R2.START_ID as R2_START_ID
452 FROM b_im_relation R1
453 INNER JOIN b_im_relation R2 on R2.CHAT_ID = R1.CHAT_ID
454 INNER JOIN b_im_message M ON M.ID >= R1.START_ID AND M.CHAT_ID = R1.CHAT_ID
455 WHERE
456 R1.USER_ID = ".$this->user_id."
457 AND R2.USER_ID = ".$userId."
458 AND R1.MESSAGE_TYPE = '".IM_MESSAGE_PRIVATE."'
459 GROUP BY M.CHAT_ID, R1.ID, R1.START_ID, R2.ID, R2.START_ID
460 ";
461 $dbRes = $DB->Query($strSql);
462 if ($arRes = $dbRes->Fetch())
463 {
464 $strSql = "UPDATE b_im_relation SET START_ID = ".intval($arRes['MAX_ID'])." WHERE ID = ".intval($arRes['R1_ID']);
465 $DB->Query($strSql);
466
467 $counterService = new IM\V2\Message\CounterService($this->user_id);
468
469 $counterService->deleteByChatId((int)$arRes['CHAT_ID']);
470
471 if ($arRes['MAX_ID'] >= $arRes['R2_START_ID'] && $arRes['R2_START_ID'] > 0)
472 {
473 $messages = IM\Model\MessageTable::getList(array(
474 'select' => array('ID'),
475 'filter' => array(
476 '<ID' => $arRes['R2_START_ID'],
477 '=CHAT_ID' => $arRes['CHAT_ID'],
478 ),
479 ));
480 while ($messageInfo = $messages->fetch())
481 {
482 IM\Model\MessageTable::delete($messageInfo['ID']);
483 }
484 }
485
486 $primaryKey = ['USER_ID' => $this->user_id, 'ITEM_TYPE' => IM_MESSAGE_PRIVATE, 'ITEM_ID' => $userId];
487 IM\Model\RecentTable::update($primaryKey, ['ITEM_MID' => 0]);
488 }
489
490 return true;
491 }
492
493 /* CHAT */
494 function HideAllChatMessage($chatId)
495 {
496 global $DB;
497 $chatId = intval($chatId);
498
499 $limitById = '';
500 $ar = \CIMChat::GetRelationById($chatId, $this->user_id, true, false);
501 if ($ar && $ar['START_ID'] > 0)
502 {
503 $limitById = 'AND M.ID >= '.intval($ar['START_ID']);
504 }
505
506 $strSql ="
507 SELECT
508 MAX(M.ID)+1 as MAX_ID,
509 R1.ID as R1_ID
510 FROM b_im_relation R1
511 INNER JOIN b_im_message M ON M.CHAT_ID = R1.CHAT_ID
512 WHERE
513 R1.CHAT_ID = ".$chatId."
514 AND R1.USER_ID = ".$this->user_id."
515 ".$limitById."
516 GROUP BY M.CHAT_ID, R1.ID
517 ";
518 $dbRes = $DB->Query($strSql);
519 if ($arRes = $dbRes->Fetch())
520 {
521 $strSql = "UPDATE b_im_relation SET START_ID = ".intval($arRes['MAX_ID'])." WHERE ID = ".intval($arRes['R1_ID']);
522 $dbRes = $DB->Query($strSql);
523
524 $counterService = new IM\V2\Message\CounterService($this->user_id);
525
526 $counterService->deleteByChatId((int)$arRes['CHAT_ID']);
527
528 $chatType = $ar ? $ar['MESSAGE_TYPE'] : IM_MESSAGE_CHAT;
529 $primaryKey = ['USER_ID' => $this->user_id, 'ITEM_TYPE' => $chatType, 'ITEM_ID' => $chatId];
530 IM\Model\RecentTable::update($primaryKey, ['ITEM_MID' => 0]);
531 }
532
533 return true;
534 }
535
536 function SearchChatMessage($searchText, $chatId, $bTimeZone = true)
537 {
538 $chatId = intval($chatId);
539 $searchText = trim($searchText);
540
541 if ($searchText == '')
542 {
543 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_HISTORY_SEARCH_EMPTY"), "ERROR_SEARCH_EMPTY");
544 return false;
545 }
546
547 if (!\Bitrix\Im\Dialog::hasAccess('chat'.$chatId, $this->user_id))
548 {
549 return false;
550 }
551
552 $where = Array(
553 '=CHAT_ID' => $chatId,
554 '*%MESSAGE' => $searchText,
555 );
556
557 if($this->checkFullText($searchText))
558 {
559 $where = Array(
560 '=CHAT_ID' => $chatId,
561 '*INDEX.SEARCH_CONTENT' => \Bitrix\Main\Search\Content::prepareStringToken($searchText),
562 );
563 }
564
565 $ar = \CIMChat::GetRelationById($chatId, $this->user_id, true, false);
566 if ($ar && $ar['START_ID'] > 0)
567 {
568 $where['>=ID'] = intval($ar['START_ID']);
569 }
570
571 $orm = \Bitrix\Im\Model\MessageTable::getList(
572 [
573 'select' => [
574 'ID',
575 'CHAT_ID',
576 'MESSAGE',
577 'AUTHOR_ID',
578 'DATE_CREATE'
579 ],
580 'filter' => $where,
581 'order' => ['DATE_CREATE' => 'DESC', 'ID' => 'DESC'],
582 'limit' => 1000,
583 ]
584 );
585
586 $arMessages = Array();
587 $arMessageId = Array();
588 $arUnreadMessage = Array();
589 $usersMessage = Array();
590
591 while ($arRes = $orm->fetch())
592 {
593 $arMessages[$arRes['ID']] = Array(
594 'id' => $arRes['ID'],
595 'chatId' => $arRes['CHAT_ID'],
596 'senderId' => $arRes['AUTHOR_ID'],
597 'recipientId' => $arRes['CHAT_ID'],
598 'date' => $arRes['DATE_CREATE'],
599 'text' => \Bitrix\Im\Text::parse($arRes['MESSAGE']),
600 'textLegacy' => \Bitrix\Im\Text::parseLegacyFormat($arRes['MESSAGE'])
601 );
602
603 $usersMessage[$arRes['CHAT_ID']][] = $arRes['ID'];
604 $arMessageId[] = $arRes['ID'];
605 }
606
607 $params = CIMMessageParam::Get($arMessageId);
608 $arFiles = Array();
609 foreach ($params as $messageId => $param)
610 {
611 $arMessages[$messageId]['params'] = $param;
612 if (isset($param['FILE_ID']))
613 {
614 foreach ($param['FILE_ID'] as $fileId)
615 {
616 $arFiles[$fileId] = $fileId;
617 }
618 }
619 }
620 $arMessageFiles = CIMDisk::GetFiles($chatId, $arFiles);
621 $arMessages = CIMMessageLink::prepareShow($arMessages, $params);
622
623 return Array('chatId' => $chatId, 'message' => $arMessages, 'unreadMessage' => $arUnreadMessage, 'usersMessage' => $usersMessage, 'files' => $arMessageFiles);
624 }
625
626 function SearchDateChatMessage($searchDate, $chatId, $bTimeZone = true)
627 {
628 global $DB;
629
630 $chatId = intval($chatId);
631
632 $sqlHelper = Bitrix\Main\Application::getInstance()->getConnection()->getSqlHelper();
633 try
634 {
635 $dateStart = \Bitrix\Main\Type\DateTime::createFromUserTime($searchDate);
636 $sqlDateStart = $sqlHelper->getCharToDateFunction($dateStart->format("Y-m-d H:i:s"));
637
638 $dateEnd = $dateStart->add('1 DAY');
639 $sqlDateEnd = $sqlHelper->getCharToDateFunction($dateEnd->format("Y-m-d H:i:s"));
640 }
641 catch(\Bitrix\Main\ObjectException $e)
642 {
643 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_HISTORY_SEARCH_DATE_EMPTY"), "ERROR_SEARCH_EMPTY");
644 return false;
645 }
646
647 $limitById = '';
648 $ar = \CIMChat::GetRelationById($chatId, $this->user_id, true, false);
649 if ($ar && $ar['START_ID'] > 0)
650 {
651 $limitById = 'AND M.ID >= '.intval($ar['START_ID']);
652 }
653
654 if (!$bTimeZone)
655 CTimeZone::Disable();
656 $strSql ="
657 SELECT
658 M.ID,
659 M.CHAT_ID,
660 M.MESSAGE,
661 ".$DB->DatetimeToTimestampFunction('M.DATE_CREATE')." as DATE_CREATE,
662 M.AUTHOR_ID
663 FROM b_im_relation R1
664 INNER JOIN b_im_message M ON M.CHAT_ID = R1.CHAT_ID
665 WHERE
666 R1.CHAT_ID = ".$chatId."
667 AND R1.USER_ID = ".$this->user_id."
668 AND M.DATE_CREATE >= ".$sqlDateStart."
669 AND M.DATE_CREATE <= ".$sqlDateEnd."
670 ".$limitById."
671 ORDER BY M.DATE_CREATE DESC, M.ID DESC
672 ";
673 if (!$bTimeZone)
674 CTimeZone::Enable();
675 $dbRes = $DB->Query($strSql);
676
677 $arMessages = Array();
678 $arMessageId = Array();
679 $arUnreadMessage = Array();
680 $usersMessage = Array();
681
682 while ($arRes = $dbRes->Fetch())
683 {
684 $arMessages[$arRes['ID']] = Array(
685 'id' => $arRes['ID'],
686 'chatId' => $arRes['CHAT_ID'],
687 'senderId' => $arRes['AUTHOR_ID'],
688 'recipientId' => $arRes['CHAT_ID'],
689 'date' => \Bitrix\Main\Type\DateTime::createFromTimestamp($arRes['DATE_CREATE']),
690 'text' => \Bitrix\Im\Text::parse($arRes['MESSAGE']),
691 'textLegacy' => \Bitrix\Im\Text::parseLegacyFormat($arRes['MESSAGE'])
692 );
693
694 $usersMessage[$arRes['CHAT_ID']][] = $arRes['ID'];
695 $arMessageId[] = $arRes['ID'];
696 }
697 $params = CIMMessageParam::Get($arMessageId);
698 $arFiles = Array();
699 foreach ($params as $messageId => $param)
700 {
701 $arMessages[$messageId]['params'] = $param;
702 if (isset($param['FILE_ID']))
703 {
704 foreach ($param['FILE_ID'] as $fileId)
705 {
706 $arFiles[$fileId] = $fileId;
707 }
708 }
709 }
710 $arMessageFiles = CIMDisk::GetFiles($chatId, $arFiles);
711 $arMessages = CIMMessageLink::prepareShow($arMessages, $params);
712
713 return Array('chatId' => $chatId, 'message' => $arMessages, 'unreadMessage' => $arUnreadMessage, 'usersMessage' => $usersMessage, 'files' => $arMessageFiles);
714 }
715
722 function GetMoreChatMessage($pageId, $chatId, $bTimeZone = true)
723 {
724 global $DB;
725
726 $iNumPage = 1;
727 if (intval($pageId) > 0)
728 $iNumPage = intval($pageId);
729
730 $chatId = intval($chatId);
731
732 $orm = IM\Model\ChatTable::getById($chatId);
733 if (!($chatData = $orm->fetch()))
734 {
735 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_ERROR_CHAT_NOT_EXISTS"), "ERROR_CHAT_NOT_EXISTS");
736 return false;
737 }
738
739 $limitById = '';
740 $ar = \CIMChat::GetRelationById($chatId, $this->user_id, true, false);
741 if ($ar && $ar['START_ID'] > 0)
742 {
743 $limitById = 'AND M.ID >= '.intval($ar['START_ID']);
744 }
745
746 if (!$bTimeZone)
747 {
748 CTimeZone::Disable();
749 }
750
751 $lineId = 0;
752 if (
753 $chatData['TYPE'] == IM_MESSAGE_OPEN_LINE
754 && \Bitrix\Main\Loader::includeModule('imopenlines')
755 )
756 {
757 $lineId = \Bitrix\ImOpenLines\Chat::parseLinesChatEntityId($chatData['ENTITY_ID'])['lineId'];
758 }
759
760 if ($chatData['TYPE'] == IM_MESSAGE_OPEN)
761 {
762 $strCountSql ="
763 SELECT COUNT(M.ID) as CNT
764 FROM b_im_message M
765 INNER JOIN b_im_chat C ON C.ID = M.CHAT_ID AND C.TYPE = '".IM_MESSAGE_OPEN."'
766 WHERE M.CHAT_ID = ".$chatId." ".$limitById."
767 ";
768
769 $strResultSql ="
770 SELECT
771 M.ID,
772 M.CHAT_ID,
773 M.MESSAGE,
774 ".$DB->DatetimeToTimestampFunction('M.DATE_CREATE')." DATE_CREATE,
775 M.AUTHOR_ID,
776 C.ENTITY_TYPE CHAT_ENTITY_TYPE
777 FROM b_im_message M
778 INNER JOIN b_im_chat C ON C.ID = M.CHAT_ID AND C.TYPE = '".IM_MESSAGE_OPEN."'
779 LEFT JOIN b_im_relation R ON R.CHAT_ID = M.CHAT_ID AND R.USER_ID = ".$this->user_id."
780 WHERE
781 M.CHAT_ID = ".$chatId."
782 ".$limitById."
783 ORDER BY M.DATE_CREATE DESC, M.ID DESC
784 ";
785 }
786 elseif (
787 $chatData['TYPE'] == IM_MESSAGE_OPEN_LINE
788 && \Bitrix\Main\Loader::includeModule('imopenlines')
789 && \Bitrix\ImOpenLines\Config::canJoin($lineId)
790 )
791 {
792 $strCountSql ="
793 SELECT COUNT(M.ID) as CNT
794 FROM b_im_message M
795 INNER JOIN b_im_chat C ON C.ID = M.CHAT_ID AND C.TYPE = '".IM_MESSAGE_OPEN_LINE."'
796 WHERE M.CHAT_ID = ".$chatId." ".$limitById."
797 ";
798
799 $strResultSql ="
800 SELECT
801 M.ID,
802 M.CHAT_ID,
803 M.MESSAGE,
804 ".$DB->DatetimeToTimestampFunction('M.DATE_CREATE')." DATE_CREATE,
805 M.AUTHOR_ID,
806 C.ENTITY_TYPE CHAT_ENTITY_TYPE
807 FROM b_im_message M
808 INNER JOIN b_im_chat C ON C.ID = M.CHAT_ID AND C.TYPE = '".IM_MESSAGE_OPEN_LINE."'
809 LEFT JOIN b_im_relation R ON R.CHAT_ID = M.CHAT_ID AND R.USER_ID = ".$this->user_id."
810 WHERE
811 M.CHAT_ID = ".$chatId."
812 ".$limitById."
813 ORDER BY M.DATE_CREATE DESC, M.ID DESC
814 ";
815 }
816 else
817 {
818 $strCountSql ="
819 SELECT COUNT(M.ID) as CNT
820 FROM b_im_message M
821 INNER JOIN b_im_relation R1 ON M.CHAT_ID = R1.CHAT_ID
822 WHERE R1.CHAT_ID = ".$chatId." AND R1.USER_ID = ".$this->user_id." ".$limitById."
823 ";
824
825 $strResultSql ="
826 SELECT
827 M.ID,
828 M.CHAT_ID,
829 M.MESSAGE,
830 ".$DB->DatetimeToTimestampFunction('M.DATE_CREATE')." as DATE_CREATE,
831 M.AUTHOR_ID,
832 C.ENTITY_TYPE as CHAT_ENTITY_TYPE
833 FROM b_im_message M
834 LEFT JOIN b_im_chat C ON M.CHAT_ID = C.ID
835 WHERE
836 M.CHAT_ID = ".$chatId."
837 ".$limitById."
838 ORDER BY M.DATE_CREATE DESC, M.ID DESC
839 ";
840 }
841 if (!$bTimeZone)
842 CTimeZone::Enable();
843
844 $res_cnt = $DB->Query($strCountSql);
845 $res_cnt = $res_cnt->Fetch();
846 $cnt = $res_cnt["CNT"];
847
848 $arMessages = Array();
849 $arMessageFiles = Array();
850 $arMessageId = Array();
851 $usersMessage = Array();
852 if ($cnt > 0 && ceil($cnt/30) >= $iNumPage)
853 {
854 $dbRes = new CDBResult();
855 $dbRes->NavQuery($strResultSql, $cnt, Array('iNumPage' => $iNumPage, 'nPageSize' => 30));
856
857 while ($arRes = $dbRes->Fetch())
858 {
859 if ($arRes['CHAT_ENTITY_TYPE'] != 'LIVECHAT' && \Bitrix\Im\User::getInstance($this->user_id)->isConnector())
860 {
861 return false;
862 }
863 $arMessages[$arRes['ID']] = Array(
864 'id' => $arRes['ID'],
865 'chatId' => $arRes['CHAT_ID'],
866 'senderId' => $arRes['AUTHOR_ID'],
867 'recipientId' => $arRes['CHAT_ID'],
868 'date' => \Bitrix\Main\Type\DateTime::createFromTimestamp($arRes['DATE_CREATE']),
869 'system' => $arRes['AUTHOR_ID'] > 0? 'N': 'Y',
870 'text' => \Bitrix\Im\Text::parse($arRes['MESSAGE']),
871 'textLegacy' => \Bitrix\Im\Text::parseLegacyFormat($arRes['MESSAGE'])
872 );
873
874 $usersMessage[$arRes['CHAT_ID']][] = $arRes['ID'];
875 $arMessageId[] = $arRes['ID'];
876 $arUsersIds[] = $arRes['AUTHOR_ID'];
877 }
878
879 $params = CIMMessageParam::Get($arMessageId);
880 $arFiles = Array();
881 foreach ($params as $messageId => $param)
882 {
883 $arMessages[$messageId]['params'] = $param;
884 if (isset($param['FILE_ID']))
885 {
886 foreach ($param['FILE_ID'] as $fileId)
887 {
888 $arFiles[$fileId] = $fileId;
889 }
890 }
891 }
892 $arMessageFiles = CIMDisk::GetFiles($chatId, $arFiles);
893 $arMessages = CIMMessageLink::prepareShow($arMessages, $params);
894
895 }
896
897 $users = CIMContactList::GetUserData(array(
898 'ID' => $arUsersIds,
899 'DEPARTMENT' => 'Y',
900 'USE_CACHE' => 'N',
901 'PHONES' => IsModuleInstalled('voximplant')? 'Y': 'N'
902 ));
903
904 return Array(
905 'chatId' => $chatId,
906 'message' => $arMessages,
907 'usersMessage' => $usersMessage,
908 'users' => $users['users'],
909 'userInGroup' => $users['userInGroup'],
910 'phones' => $users['phones'],
911 'files' => $arMessageFiles
912 );
913 }
914
915
916 /* COMMON */
917 public function GetMessagesByDate($chatId, $date, $messageStart = 0, $timezone = true)
918 {
919 $chatId = intval($chatId);
920 $messageStart = intval($messageStart);
921
922 if ($date instanceof \Bitrix\Main\Type\DateTime)
923 {
924 $checkDate = $date;
925 $dateSql = $checkDate->format("Y-m-d H:i:s");
926 }
927 else
928 {
929 $checkDate = new \Bitrix\Main\Type\DateTime($date, "Y-m-d H:i:s");
930 $dateSql = $checkDate->format("Y-m-d H:i:s");
931 if ($dateSql != $date)
932 {
933 return false;
934 }
935 }
936
937 $chatData = CIMChat::GetChatData(Array('ID' => $chatId, 'USER_ID' => $this->user_id));
938 if (empty($chatData['chat']))
939 return false;
940
941 $dialogId = 0;
942 $chatType = IM_MESSAGE_CHAT;
943 if ($chatData['chat'][$chatId]['type'] == 'private')
944 {
945 $chatType = IM_MESSAGE_PRIVATE;
946 foreach ($chatData['userInChat'][$chatId] as $userId)
947 {
948 if ($userId != $this->user_id)
949 {
950 $dialogId = $userId;
951 break;
952 }
953 }
954 if (!$dialogId)
955 {
956 return false;
957 }
958 }
959 else
960 {
961 $dialogId = 'chat'.$chatId;
962 }
963
964 $chatSql = str_pad($chatId, 11, '0', STR_PAD_LEFT);
965
966 global $DB;
967
968 if (!$timezone)
969 CTimeZone::Disable();
970
971 $sql = "
972 SELECT
973 CASE WHEN M.ID > 0 THEN 'Y' ELSE 'N' END AS MESSAGE_EXISTS,
974 CASE WHEN M.ID > R.LAST_ID THEN 'N' ELSE 'Y' END AS MESSAGE_READ,
975 C.TYPE as CHAT_TYPE,
976 MS.MESSAGE_ID as ID,
977 M.CHAT_ID,
978 M.MESSAGE,
979 ".$DB->DatetimeToTimestampFunction('M.DATE_CREATE')." as DATE_CREATE,
980 M.AUTHOR_ID
981 FROM b_im_message_param MS
982 LEFT JOIN b_im_message M ON M.ID = MS.MESSAGE_ID
983 LEFT JOIN b_im_relation R ON R.CHAT_ID = M.CHAT_ID and R.USER_ID = ".$this->user_id."
984 LEFT JOIN b_im_chat C ON C.ID = M.CHAT_ID
985 WHERE
986 MS.PARAM_NAME='TS' and
987 MS.PARAM_VALUE between '".$chatSql." ".$dateSql."' and '".$chatSql." 9999-99-99 99:99:99'
988 ".($messageStart > 0? 'MS.MESSAGE_ID >= '.$messageStart: "")."
989 ";
990
991 if (!$timezone)
992 CTimeZone::Enable();
993
994 $result = $DB->Query($sql);
995
996 $arMessages = Array();
997 $arMessageUnread = Array();
998 $arMessageDelete = Array();
999 $arMessageId = Array();
1000 $usersMessage = Array();
1001 $arUsersIds = Array();
1002
1003 while ($message = $result->Fetch())
1004 {
1005 if ($message['MESSAGE_EXISTS'] == 'N')
1006 {
1007 $arMessageDelete[] = $message['ID'];
1008 continue;
1009 }
1010 if ($message['MESSAGE_READ'] == 'N')
1011 {
1012 $arMessageUnread[$dialogId][] = $message['ID'];
1013 }
1014 if ($message['CHAT_TYPE'] == IM_MESSAGE_PRIVATE)
1015 {
1016 $recipientId = $message['AUTHOR_ID'] == $this->user_id? $dialogId: $this->user_id;
1017 }
1018 else
1019 {
1020 $recipientId = $message['CHAT_ID'];
1021 }
1022 $arMessages[$message['ID']] = Array(
1023 'id' => $message['ID'],
1024 'chatId' => $message['CHAT_ID'],
1025 'senderId' => $message['AUTHOR_ID'],
1026 'recipientId' => $recipientId,
1027 'date' => \Bitrix\Main\Type\DateTime::createFromTimestamp($message['DATE_CREATE']),
1028 'system' => $message['AUTHOR_ID'] > 0? 'N': 'Y',
1029 'text' => \Bitrix\Im\Text::parse($message['MESSAGE']),
1030 'textLegacy' => \Bitrix\Im\Text::parseLegacyFormat($arRes['MESSAGE'])
1031 );
1032
1033 $usersMessage[$dialogId][] = $message['ID'];
1034 $arMessageId[] = $message['ID'];
1035 $arUsersIds[] = $message['AUTHOR_ID'];
1036 }
1037
1038 $params = CIMMessageParam::Get($arMessageId);
1039 $arFiles = Array();
1040 foreach ($params as $messageId => $param)
1041 {
1042 $arMessages[$messageId]['params'] = $param;
1043 if (isset($param['FILE_ID']))
1044 {
1045 foreach ($param['FILE_ID'] as $fileId)
1046 {
1047 $arFiles[$fileId] = $fileId;
1048 }
1049 }
1050 }
1051 $arMessageFiles = CIMDisk::GetFiles($chatId, $arFiles);
1052 $arMessages = CIMMessageLink::prepareShow($arMessages, $params);
1053
1054 $users = CIMContactList::GetUserData(array(
1055 'ID' => $arUsersIds,
1056 'DEPARTMENT' => 'Y',
1057 'USE_CACHE' => 'N',
1058 'PHONES' => IsModuleInstalled('voximplant')? 'Y': 'N'
1059 ));
1060
1061 return Array(
1062 'chatId' => $chatId,
1063 'dialogId' => $dialogId,
1064 'message' => $arMessages,
1065 'usersMessage' => $usersMessage,
1066 'unreadMessage' => $arMessageUnread,
1067 'messageDelete' => $arMessageDelete,
1068 'files' => $arMessageFiles,
1069 'users' => $users['users'],
1070 'userInGroup' => $users['userInGroup'],
1071 'phones' => $users['phones'],
1072 'lines' => $chatType == IM_MESSAGE_PRIVATE? Array(): $chatData['lines'],
1073 'chat' => $chatType == IM_MESSAGE_PRIVATE? Array(): $chatData['chat'],
1074 'userInChat' => $chatType == IM_MESSAGE_PRIVATE? Array(): $chatData['userInChat'],
1075 'userCallStatus' => $chatType == IM_MESSAGE_PRIVATE? Array(): $chatData['userCallStatus'],
1076 'userChatBlockStatus' => $chatType == IM_MESSAGE_PRIVATE? Array(): $chatData['userChatBlockStatus'],
1077 );
1078 }
1079
1080 public function GetRelatedMessages($messageId, $previous = 10, $next = 10, $timezone = true, $textParser = true)
1081 {
1082 $message = \Bitrix\Im\Model\MessageTable::getList(Array(
1083 'select' => Array(
1084 'ID','DATE_CREATE', 'CHAT_ID', 'AUTHOR_ID',
1085 'CHAT_TYPE' => 'CHAT.TYPE',
1086 'CHAT_ENTITY_TYPE' => 'CHAT.ENTITY_TYPE',
1087 'CHAT_ENTITY_ID' => 'CHAT.ENTITY_ID',
1088 'CHAT_ENTITY_DATA_1' => 'CHAT.ENTITY_DATA_1',
1089 ),
1090 'filter' => Array(
1091 '=ID' => $messageId
1092 ))
1093 )->fetch();
1094 if (!$message)
1095 {
1096 return false;
1097 }
1098
1099 $relations = CIMChat::GetRelationById($message['CHAT_ID'], false, true, false);
1100 if (!isset($relations[$this->user_id]))
1101 {
1102 if (
1103 $message['CHAT_ENTITY_TYPE'] == 'LINES'
1104 && \Bitrix\Main\Loader::includeModule('imopenlines')
1105 )
1106 {
1107 $explodeData = explode('|', $message['CHAT_ENTITY_DATA_1']);
1108 $crmEntityType = ($explodeData[0] == 'Y') ? $explodeData[1] : null;
1109 $crmEntityId = ($explodeData[0] == 'Y') ? intval($explodeData[2]) : null;
1110
1111 $lineId = \Bitrix\ImOpenLines\Chat::parseLinesChatEntityId($message['CHAT_ENTITY_ID'])['lineId'];
1112
1113 if (!\Bitrix\ImOpenLines\Config::canJoin($lineId, $crmEntityType, $crmEntityId))
1114 {
1115 return false;
1116 }
1117 }
1118 else
1119 {
1120 return false;
1121 }
1122 }
1123 elseif ((int)$messageId < (int)$relations[$this->user_id]['START_ID'])
1124 {
1125 return false;
1126 }
1127
1128 $dialogId = 0;
1129 if ($message['CHAT_TYPE'] == IM_MESSAGE_PRIVATE)
1130 {
1131 if($message['CHAT_ENTITY_TYPE'] == IM_CHAT_TYPE_PERSONAL)
1132 {
1133 $dialogId = $this->user_id;
1134 }
1135 if ($message['AUTHOR_ID'] != $this->user_id)
1136 {
1137 $dialogId = $message['AUTHOR_ID'];
1138 }
1139 else
1140 {
1141 foreach ($relations as $userId => $data)
1142 {
1143 if ($userId != $this->user_id)
1144 {
1145 $dialogId = $userId;
1146 break;
1147 }
1148 }
1149 if (!$dialogId)
1150 {
1151 return false;
1152 }
1153 }
1154 }
1155 else
1156 {
1157 $dialogId = 'chat'.$message['CHAT_ID'];
1158 }
1159
1160 $previousMessages = $this->GetPreviousMessages($messageId, $message['CHAT_ID'], $message['DATE_CREATE'], $previous, $timezone);
1161 $nextMessages = $this->GetNextMessages($messageId, $message['CHAT_ID'], $message['DATE_CREATE'], $next, $timezone);
1162
1163 $startId = (int)($relations[$this->user_id]['START_ID'] ?? 0);
1164 if ($startId > 0)
1165 {
1166 $previousMessages = array_filter($previousMessages, static fn (array $message) => (int)$message['ID'] >= $startId);
1167 }
1168
1169 $messages = array_replace($previousMessages, $nextMessages);
1170
1171 $chatId = $message['CHAT_ID'];
1172
1173 $arMessages = Array();
1174 $arMessageFiles = Array();
1175 $arMessageId = Array();
1176 $usersMessage = Array();
1177 $arUsersIds = Array();
1178
1179 foreach ($messages as $mess)
1180 {
1181 if ($message['CHAT_TYPE'] == IM_MESSAGE_PRIVATE)
1182 {
1183 $recipientId = $mess['AUTHOR_ID'] == $this->user_id? $dialogId: $this->user_id;
1184 }
1185 else
1186 {
1187 $recipientId = $mess['CHAT_ID'];
1188 }
1189 $arMessages[$mess['ID']] = Array(
1190 'id' => $mess['ID'],
1191 'chatId' => $mess['CHAT_ID'],
1192 'senderId' => $mess['AUTHOR_ID'],
1193 'recipientId' => $recipientId,
1194 'date' => \Bitrix\Main\Type\DateTime::createFromTimestamp($mess['DATE_CREATE']),
1195 'system' => $mess['AUTHOR_ID'] > 0? 'N': 'Y',
1196 'text' => $textParser? \Bitrix\Im\Text::parse($mess['MESSAGE']): $mess['MESSAGE'],
1197 'textLegacy' => $textParser? \Bitrix\Im\Text::parseLegacyFormat($mess['MESSAGE']): $mess['MESSAGE']
1198 );
1199
1200 $usersMessage[$dialogId][] = $mess['ID'];
1201 $arMessageId[] = $mess['ID'];
1202 $arUsersIds[] = $mess['AUTHOR_ID'];
1203 }
1204
1205 $params = CIMMessageParam::Get($arMessageId);
1206 $arFiles = Array();
1207 foreach ($params as $messageId => $param)
1208 {
1209 $arMessages[$messageId]['params'] = $param;
1210 if (isset($param['FILE_ID']))
1211 {
1212 foreach ($param['FILE_ID'] as $fileId)
1213 {
1214 $arFiles[$fileId] = $fileId;
1215 }
1216 }
1217 }
1218 $arMessageFiles = CIMDisk::GetFiles($chatId, $arFiles);
1219 $arMessages = CIMMessageLink::prepareShow($arMessages, $params);
1220
1221 $users = CIMContactList::GetUserData(array(
1222 'ID' => $arUsersIds,
1223 'DEPARTMENT' => 'Y',
1224 'USE_CACHE' => 'N',
1225 'PHONES' => IsModuleInstalled('voximplant')? 'Y': 'N'
1226 ));
1227
1228 return Array(
1229 'chatId' => $chatId,
1230 'dialogId' => $dialogId,
1231 'message' => $arMessages,
1232 'usersMessage' => $usersMessage,
1233 'files' => $arMessageFiles,
1234 'users' => $users['users'],
1235 'userInGroup' => $users['userInGroup'],
1236 'phones' => $users['phones'],
1237 );
1238 }
1239
1240 private function GetPreviousMessages($messageId, $chatId = null, $dateCreate = null, $limit = 10, $timezone = true)
1241 {
1242 global $DB;
1243
1244 if (is_null($chatId) || !is_object($dateCreate))
1245 {
1246 $message = \Bitrix\Im\Model\MessageTable::getList(Array('select' => Array('DATE_CREATE', 'CHAT_ID'), 'filter' => Array('=ID' => $messageId)))->fetch();
1247 if (!$message)
1248 return false;
1249
1250 $chatId = $message['CHAT_ID'];
1251 $dateCreate = $message['DATE_CREATE'];
1252 }
1253 else
1254 {
1255 $chatId = intval($chatId);
1256 }
1257
1258 $limit = intval($limit)+1;
1259
1260 if (!$timezone)
1262
1263 $sql =
1264 "SELECT
1265 ID,
1266 CHAT_ID,
1267 MESSAGE,
1268 ".$DB->DatetimeToTimestampFunction('DATE_CREATE')." as DATE_CREATE,
1269 AUTHOR_ID
1270 FROM b_im_message
1271 WHERE
1272 CHAT_ID = ".$chatId."
1273 and DATE_CREATE <= '".$dateCreate->format('Y-m-d H:i:s')."'
1274 ORDER BY CHAT_ID, DATE_CREATE desc
1275 LIMIT ".$limit;
1276
1277 if (!$timezone)
1279
1280 $result = $DB->Query($sql);
1281
1282 $messages = array();
1283 while ($message = $result->Fetch())
1284 {
1285 $messages[$message['ID']] = $message;
1286 }
1287 asort($messages);
1288
1289 return $messages;
1290 }
1291
1292 private function GetNextMessages($messageId, $chatId = null, $dateCreate = null, $limit = 10, $timezone = true)
1293 {
1294 global $DB;
1295
1296 if (is_null($chatId) || !is_object($dateCreate))
1297 {
1298 $message = \Bitrix\Im\Model\MessageTable::getList(Array('select' => Array('DATE_CREATE', 'CHAT_ID'), 'filter' => Array('=ID' => $messageId)))->fetch();
1299 if (!$message)
1300 return false;
1301
1302 $chatId = $message['CHAT_ID'];
1303 $dateCreate = $message['DATE_CREATE'];
1304 }
1305 else
1306 {
1307 $chatId = intval($chatId);
1308 }
1309
1310 $limit = intval($limit)+1;
1311
1312 if (!$timezone)
1314
1315 $sql =
1316 "SELECT
1317 ID,
1318 CHAT_ID,
1319 MESSAGE,
1320 ".$DB->DatetimeToTimestampFunction('DATE_CREATE')." as DATE_CREATE,
1321 AUTHOR_ID
1322 FROM b_im_message
1323 WHERE
1324 CHAT_ID = ".$chatId."
1325 and DATE_CREATE >= '".$dateCreate->format('Y-m-d H:i:s')."'
1326 ORDER BY CHAT_ID, DATE_CREATE asc
1327 LIMIT ".$limit;
1328
1329 if (!$timezone)
1331
1332 $result = $DB->Query($sql);
1333
1334 $messages = array();
1335 while ($message = $result->Fetch())
1336 {
1337 $messages[$message['ID']] = $message;
1338 }
1339
1340 return $messages;
1341 }
1342
1343 private function checkFullText($searchText): bool
1344 {
1345 $indexEnabled = \Bitrix\Main\Config\Option::get('im', 'message_history_index');
1346
1347 if (
1348 $indexEnabled
1349 && \Bitrix\Main\Search\Content::canUseFulltextSearch($searchText)
1350 )
1351 {
1352 return true;
1353 }
1354
1355 return false;
1356 }
1357}
$arParams
Определения access_dialog.php:21
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
static getInstance()
Определения application.php:98
static prepareStringToken($token)
Определения content.php:18
static createFromUserTime($timeString)
Определения datetime.php:180
static GetFiles($chatId, $fileId=false, $checkPermission=true)
Определения im_disk.php:1601
Определения im_history.php:7
GetMessagesByDate($chatId, $date, $messageStart=0, $timezone=true)
Определения im_history.php:917
SearchDateChatMessage($searchDate, $chatId, $bTimeZone=true)
Определения im_history.php:626
GetRelatedMessages($messageId, $previous=10, $next=10, $timezone=true, $textParser=true)
Определения im_history.php:1080
GetMoreMessage($pageId, $toUserId, $fromUserId=false, $bTimeZone=true)
Определения im_history.php:289
GetMoreChatMessage($pageId, $chatId, $bTimeZone=true)
Определения im_history.php:722
SearchMessage($searchText, $toUserId, $fromUserId=false, $bTimeZone=true)
Определения im_history.php:21
RemoveAllMessage($userId)
Определения im_history.php:433
SearchDateMessage($searchDate, $toUserId, $fromUserId=false, $bTimeZone=true)
Определения im_history.php:153
SearchChatMessage($searchText, $chatId, $bTimeZone=true)
Определения im_history.php:536
RemoveMessage($messageId)
Определения im_history.php:426
HideAllChatMessage($chatId)
Определения im_history.php:494
__construct($user_id=false, $arParams=Array())
Определения im_history.php:11
static Disable()
Определения time.php:31
static Enable()
Определения time.php:36
$data['IS_AVAILABLE']
Определения .description.php:13
</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
$pageId
Определения group_bizproc_log.php:3
const IM_MESSAGE_CHAT
Определения include.php:23
const IM_MESSAGE_OPEN
Определения include.php:24
const IM_CHAT_TYPE_PERSONAL
Определения include.php:28
const IM_MESSAGE_PRIVATE
Определения include.php:22
const IM_MESSAGE_OPEN_LINE
Определения include.php:26
global $DB
Определения cron_frame.php:29
global $USER
Определения csv_new_run.php:40
IsModuleInstalled($module_id)
Определения tools.php:5301
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
GetMessage($name, $aReplace=null)
Определения tools.php:3397
int $chatId
Определения Param.php:36
$message
Определения payment.php:8
$arFiles
Определения options.php:60
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$ar
Определения options.php:199
$messages
Определения template.php:8
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
$arRes
Определения options.php:104
$GLOBALS['_____370096793']
Определения update_client.php:1
$dbRes
Определения yandex_detail.php:168