1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
im_message.php
См. документацию.
1<?
2
10
11IncludeModuleLangFile(__FILE__);
12
14{
15 private $user_id = 0;
16 private $bHideLink = false;
17
18 function __construct($user_id = false, $arParams = Array())
19 {
20 global $USER;
21 $this->user_id = intval($user_id);
22 if ($this->user_id == 0)
23 $this->user_id = intval($USER->GetID());
24 if (isset($arParams['HIDE_LINK']) && $arParams['HIDE_LINK'] == 'Y')
25 $this->bHideLink = true;
26 }
27
28 public static function Add($arFields)
29 {
30 if (!isset($arFields['MESSAGE_TYPE']) || !in_array($arFields['MESSAGE_TYPE'], CIMChat::getGroupTypesExtra()))
31 $arFields['MESSAGE_TYPE'] = IM_MESSAGE_PRIVATE;
32
33 if (isset($arFields['MESSAGE_MODULE']))
34 $arFields['NOTIFY_MODULE'] = $arFields['MESSAGE_MODULE'];
35 else
36 $arFields['NOTIFY_MODULE'] = "im";
37
38 return CIMMessenger::Add($arFields);
39 }
40
41 public function GetMessage($id, $files = false)
42 {
43 global $DB;
44
45 $id = intval($id);
46
47 $query = "SELECT
48 M.*,
49 ".$DB->DatetimeToTimestampFunction('M.DATE_CREATE')." as DATE_CREATE,
50 R.MESSAGE_TYPE,
51 C.TITLE as CHAT_TITLE,
52 C.COLOR as CHAT_COLOR,
53 C.AVATAR as CHAT_AVATAR
54 FROM
55 b_im_message M
56 INNER JOIN b_im_relation R ON R.CHAT_ID = M.CHAT_ID AND R.USER_ID = ".$this->user_id."
57 INNER JOIN b_im_chat C ON C.ID = M.CHAT_ID
58 WHERE
59 M.ID = ".$id."";
60
61 $result = $DB->Query($query);
62 $message = $result->Fetch();
63
64 if (!$message)
65 return false;
66
67 if ($files)
68 {
69 $files = CIMMessageParam::Get($id, 'FILE_ID');
70 $message['FILES'] = CIMDisk::GetFiles($message['CHAT_ID'], $files, false);
71 }
72
73 return $message;
74 }
75
76 public static function UpdateMessageOut($id, $messageOut)
77 {
78 $id = intval($id);
79 if ($id <= 0)
80 return false;
81
82 \Bitrix\Im\Model\MessageTable::update($id, array(
83 "MESSAGE_OUT" => $messageOut,
84 ));
85
86 return true;
87 }
88
89 public function GetUnreadMessage($arParams = Array())
90 {
91 global $DB;
92
93 $bSpeedCheck = isset($arParams['SPEED_CHECK']) && $arParams['SPEED_CHECK'] == 'N'? false: true;
94 //$lastId = !isset($arParams['LAST_ID']) || $arParams['LAST_ID'] == null? null: intval($arParams['LAST_ID']);
95 $loadDepartment = isset($arParams['LOAD_DEPARTMENT']) && $arParams['LOAD_DEPARTMENT'] == 'N'? false: true;
96 $bTimeZone = isset($arParams['USE_TIME_ZONE']) && $arParams['USE_TIME_ZONE'] == 'N'? false: true;
97 $bGroupByChat = isset($arParams['GROUP_BY_CHAT']) && $arParams['GROUP_BY_CHAT'] == 'Y'? true: false;
98 $bUserLoad = isset($arParams['USER_LOAD']) && $arParams['USER_LOAD'] == 'N'? false: true;
99 $bFileLoad = isset($arParams['FILE_LOAD']) && $arParams['FILE_LOAD'] == 'N'? false: true;
100 $arExistUserData = isset($arParams['EXIST_USER_DATA']) && is_array($arParams['EXIST_USER_DATA'])? $arParams['EXIST_USER_DATA']: Array();
101
102 $arMessages = Array();
103 $arUnreadMessage = Array();
104 $arUsersMessage = Array();
105
106 $arResult = Array(
107 'message' => Array(),
108 'unreadMessage' => Array(),
109 'usersMessage' => Array(),
110 'users' => Array(),
111 'files' => Array(),
112 'userInGroup' => Array(),
113 'countMessage' => 0,
114 'result' => false
115 );
116 $bLoadMessage = $bSpeedCheck? CIMMessenger::SpeedFileExists($this->user_id, IM_SPEED_MESSAGE): false;
117 $count = CIMMessenger::SpeedFileGet($this->user_id, IM_SPEED_MESSAGE);
118 if (!$bLoadMessage || ($bLoadMessage && intval($count) > 0))
119 {
120 /*$ssqlLastId = "R1.LAST_ID";
121 $ssqlStatus = " AND R1.STATUS < ".IM_STATUS_READ;
122 if (!is_null($lastId) && intval($lastId) > 0 && !CIMMessenger::CheckXmppStatusOnline())
123 {
124 $ssqlLastId = intval($lastId);
125 $ssqlStatus = "";
126 }
127
128 $arRelations = Array();
129 if ($ssqlStatus <> '')
130 {
131 $strSql ="
132 SELECT
133 R1.USER_ID,
134 R1.CHAT_ID,
135 R1.LAST_ID
136 FROM
137 b_im_relation R1
138 WHERE
139 R1.USER_ID = ".$this->user_id." AND R1.MESSAGE_TYPE = '".IM_MESSAGE_PRIVATE."' ".$ssqlStatus."
140 ";
141 $dbSubRes = $DB->Query($strSql);
142 while ($arRes = $dbSubRes->Fetch())
143 {
144 $arRelations[] = $arRes;
145 }
146 }*/
147
148 $arLastMessage = Array();
149 $arMark = Array();
150 $arMessageId = Array();
151 $arMessageChatId = Array();
152
153 $diskFolderId = 0;
154
155 if (!$bTimeZone)
156 CTimeZone::Disable();
157 $strSql ="
158 SELECT
159 M.ID,
160 M.CHAT_ID,
161 C.TYPE as CHAT_TYPE,
162 C.DISK_FOLDER_ID,
163 M.MESSAGE,
164 ".$DB->DatetimeToTimestampFunction('M.DATE_CREATE')." as DATE_CREATE,
165 M.AUTHOR_ID,
166 M.NOTIFY_EVENT,
167 R1.USER_ID as R1_USER_ID,
168 M.AUTHOR_ID as R2_USER_ID
169 FROM b_im_message M
170 LEFT JOIN b_im_chat C ON C.ID = M.CHAT_ID
171 INNER JOIN b_im_relation R1 ON M.CHAT_ID = R1.CHAT_ID AND R1.USER_ID != M.AUTHOR_ID
172 INNER JOIN b_im_message_unread MU ON M.ID = MU.MESSAGE_ID AND MU.USER_ID = " . $this->user_id . "
173 WHERE R1.USER_ID = ".$this->user_id." AND R1.MESSAGE_TYPE = '".IM_MESSAGE_PRIVATE."'
174 ";
175 if (!$bTimeZone)
176 CTimeZone::Enable();
177
178 $strSql = $DB->TopSql($strSql, 500);
179
180 $dbRes = $DB->Query($strSql);
181
182 while ($arRes = $dbRes->Fetch())
183 {
184 if ($arRes['CHAT_TYPE'] && $arRes['CHAT_TYPE'] != IM_MESSAGE_PRIVATE)
185 continue;
186
187 $diskFolderId = $arRes['DISK_FOLDER_ID'];
188 $arUsers[] = $arRes['R1_USER_ID'];
189 $arUsers[] = $arRes['R2_USER_ID'];
190 if ($this->user_id == $arRes['AUTHOR_ID'])
191 {
192 $arRes['TO_USER_ID'] = $arRes['R2_USER_ID'];
193 $arRes['FROM_USER_ID'] = $arRes['R1_USER_ID'];
194 $convId = $arRes['TO_USER_ID'];
195 }
196 else
197 {
198 $arRes['TO_USER_ID'] = $arRes['R1_USER_ID'];
199 $arRes['FROM_USER_ID'] = $arRes['R2_USER_ID'];
200 $convId = $arRes['FROM_USER_ID'];
201 }
202
203 $arMessages[$arRes['ID']] = Array(
204 'id' => $arRes['ID'],
205 'chatId' => $arRes['CHAT_ID'],
206 'senderId' => $arRes['FROM_USER_ID'],
207 'recipientId' => $arRes['TO_USER_ID'],
208 'date' => \Bitrix\Main\Type\DateTime::createFromTimestamp($arRes['DATE_CREATE']),
209 'system' => $arRes['NOTIFY_EVENT'] == 'private'? 'N': 'Y',
210 'text' => $arRes['MESSAGE'],
211 );
212 if ($bGroupByChat)
213 {
214 $arMessages[$arRes['ID']]['conversation'] = $convId;
215 $arMessages[$arRes['ID']]['unread'] = $this->user_id != $arRes['AUTHOR_ID']? 'Y': 'N';
216 }
217 else
218 {
219 $arMessages[$arRes['ID']]['conversation'] = $convId;
220 $arUsersMessage[$convId][] = $arRes['ID'];
221 }
222
223 /*if ($arRes['R1_STATUS'] == IM_STATUS_UNREAD && (!isset($arMark[$arRes["CHAT_ID"]]) || $arMark[$arRes["CHAT_ID"]] < $arRes["ID"]))
224 $arMark[$arRes["CHAT_ID"]] = $arRes["ID"];*/
225
226 if (!isset($arLastMessage[$convId]) || $arLastMessage[$convId] < $arRes["ID"])
227 $arLastMessage[$convId] = $arRes["ID"];
228
229 $arMessageId[] = $arRes['ID'];
230 $arMessageChatId[$arRes['CHAT_ID']][$arRes["ID"]] = $arRes["ID"];
231 }
232 $params = CIMMessageParam::Get($arMessageId);
233 if ($bFileLoad)
234 {
235 foreach ($arMessageChatId as $chatId => $messages)
236 {
237 $files = Array();
238 foreach ($messages as $messageId)
239 {
240 $arMessages[$messageId]['params'] = $params[$messageId];
241
242 if (isset($params[$messageId]['FILE_ID']))
243 {
244 foreach ($params[$messageId]['FILE_ID'] as $fileId)
245 {
246 $files[$fileId] = $fileId;
247 }
248 }
249 }
250
251 $arMessageFiles = CIMDisk::GetFiles($chatId, $files);
252 foreach ($arMessageFiles as $key => $value)
253 {
254 $arResult['files'][$chatId][$key] = $value;
255 }
256 }
257 }
258 else
259 {
260 foreach ($params as $messageId => $param)
261 {
262 $arMessages[$messageId]['params'] = $param;
263 }
264 }
265
266 if (!empty($arMessages))
267 {
268 foreach ($arMark as $chatId => $lastSendId)
269 self::SetLastSendId($chatId, $this->user_id, $lastSendId);
270 }
271
272 if ($bGroupByChat)
273 {
274 foreach ($arMessages as $key => $value)
275 {
276 $arMessages[$arLastMessage[$value['conversation']]]['counter']++;
277 if ($arLastMessage[$value['conversation']] != $value['id'])
278 {
279 unset($arMessages[$key]);
280 }
281 else
282 {
283 $arMessages[$key]['text'] = \Bitrix\Im\Text::parse($value['text']);
284 $arMessages[$key]['textLegacy'] = \Bitrix\Im\Text::parseLegacyFormat($value['text']);
285
286 $arUsersMessage[$value['conversation']][] = $value['id'];
287
288 if ($value['unread'] == 'Y')
289 $arUnreadMessage[$value['conversation']][] = $value['id'];
290
291 unset($arMessages[$key]['conversation']);
292 unset($arMessages[$key]['unread']);
293 }
294 }
295 }
296 else
297 {
298 foreach ($arMessages as $key => $value)
299 {
300 $arMessages[$key]['text'] = \Bitrix\Im\Text::parse($value['text']);
301 $arMessages[$key]['textLegacy'] = \Bitrix\Im\Text::parseLegacyFormat($value['text']);
302
303 if ($value['params']['NOTIFY'] === 'N' || is_array($value['params']['NOTIFY']) && !in_array($this->user_id, $value['params']['NOTIFY']))
304 {
305 // skip unread
306 }
307 else if ($this->user_id != $value['senderId'])
308 {
309 $arUnreadMessage[$value['conversation']][] = $value['id'];
310 }
311
312 unset($arMessages[$key]['conversation']);
313 }
314 }
315
316 $arResult['message'] = $diskFolderId;
317 $arResult['message'] = $arMessages;
318 $arResult['unreadMessage'] = $arUnreadMessage;
319 $arResult['usersMessage'] = $arUsersMessage;
320
321 if ($bUserLoad && !empty($arUsers))
322 {
323 $arUserData = CIMContactList::GetUserData(Array('ID' => array_diff(array_unique($arUsers), $arExistUserData), 'DEPARTMENT' => ($loadDepartment? 'Y': 'N')));
324 $arResult['users'] = $arUserData['users'];
325 $arResult['userInGroup'] = $arUserData['userInGroup'];
326 }
327 else
328 {
329 $arResult['users'] = Array();
330 $arResult['userInGroup'] = Array();
331 $arResult['userInGroup'] = Array();
332 }
333
334 $arResult['countMessage'] = CIMMessenger::GetMessageCounter($this->user_id, $arResult);
335 if (!$bGroupByChat)
336 CIMMessenger::SpeedFileCreate($this->user_id, $arResult['countMessage'], IM_SPEED_MESSAGE);
337 $arResult['result'] = true;
338 }
339 else
340 {
341 $arResult['countMessage'] = CIMMessenger::GetMessageCounter($this->user_id, $arResult);
342 }
343
344 return $arResult;
345 }
346
347 function GetLastMessage($toUserId, $fromUserId = false, $loadUserData = false, $bTimeZone = true, $limit = true)
348 {
349 global $DB;
350
351 $fromUserId = intval($fromUserId);
352 if ($fromUserId <= 0)
353 $fromUserId = $this->user_id;
354
355 $toUserId = intval($toUserId);
356 if ($toUserId <= 0)
357 {
358 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_ERROR_EMPTY_USER_ID"), "ERROR_TO_USER_ID");
359 return false;
360 }
361
362 $chatId = 0;
363 $startId = 0;
364 $lastId = 0;
365 $lastReadId = 0;
366 $limitFetchMessages = 30;
367 $blockNotify = false;
368 $lastRead = false;
369 $arMessages = Array();
370 $arUsersMessage = Array();
371 $arMessageId = Array();
372 $arUnreadMessages = Array();
373 $blockNotify = null;
374 $lastRead = null;
375
376 if (!$bTimeZone)
377 CTimeZone::Disable();
378
379 if ($toUserId == $fromUserId)
380 {
381 $chat = new CIMChat();
382 $chatId = (int)$chat->GetPersonalChat();
383 }
384 else
385 {
386 $strSql ="
387 SELECT R1.CHAT_ID, R1.START_ID, R1.LAST_ID, R2.LAST_ID as LAST_READ_ID, R1.NOTIFY_BLOCK
388 FROM b_im_relation R1
389 INNER JOIN b_im_relation R2 on R2.CHAT_ID = R1.CHAT_ID
390 WHERE
391 R1.USER_ID = ".$fromUserId."
392 AND R1.MESSAGE_TYPE = '".IM_MESSAGE_PRIVATE."'
393 AND R2.USER_ID = ".$toUserId."
394 AND R2.MESSAGE_TYPE = '".IM_MESSAGE_PRIVATE."'
395 ";
396 if (!$bTimeZone)
397 CTimeZone::Enable();
398 $dbRes = $DB->Query($strSql);
399 if ($arRes = $dbRes->Fetch())
400 {
401 $chatId = intval($arRes['CHAT_ID']);
402 $startId = intval($arRes['START_ID']);
403 $readService = new \Bitrix\Im\V2\Message\ReadService($fromUserId);
404 $opponentReadService = new \Bitrix\Im\V2\Message\ReadService($toUserId);
405 $lastId = (int)$arRes['LAST_ID'];
406 //$count = $readService->getCounterService()->getByChat($chatId);
407 $lastIdInChat = $readService->getLastMessageIdInChat($chatId);
408
409 $messageCountFilter = \Bitrix\Main\ORM\Query\Query::filter()
410 ->where('ID', '>=', $startId)
411 ->where('ID', '>=', $lastId)
412 ->where('ID', '<=', $lastIdInChat)
413 ->where('CHAT_ID', $chatId)
414 ;
415 $messageCount = \Bitrix\Im\Model\MessageTable::getCount($messageCountFilter);
416
417 $lastReadId = (int)$arRes['LAST_READ_ID'];
418 $lastRead = $opponentReadService->getViewedService()->getDateViewedByMessageId($lastReadId ?? 0);
419 $limitFetchMessages = max($messageCount, 30);
420 $blockNotify = $arRes['NOTIFY_BLOCK'] !== 'N';
421 }
422 }
423
424 if ($chatId > 0)
425 {
426 $sqlLimit = '';
427 if ($limit)
428 {
429 if ($DB->type == "MSSQL")
430 {
431 $sqlLimit = " AND M.DATE_CREATE > dateadd(day, -30, getdate())";
432 }
433 elseif ($DB->type == "ORACLE")
434 {
435 $sqlLimit = " AND M.DATE_CREATE > SYSDATE-30";
436 }
437 else
438 {
440 $helper = $connection->getSqlHelper();
441 $sqlLimit = " AND M.DATE_CREATE > ". $helper->addDaysToDateTime(-30);
442 }
443 }
444
445 if (!$bTimeZone)
446 CTimeZone::Disable();
447 $strSql ="
448 SELECT
449 M.ID,
450 M.CHAT_ID,
451 M.MESSAGE,
452 ".$DB->DatetimeToTimestampFunction('M.DATE_CREATE')." as DATE_CREATE,
453 M.AUTHOR_ID,
454 M.NOTIFY_EVENT
455 FROM b_im_message M
456 WHERE M.CHAT_ID = ".$chatId." #LIMIT#
457 ORDER BY M.DATE_CREATE DESC, M.ID DESC
458 ";
459 $strSql = $DB->TopSql($strSql, $limitFetchMessages);
460 if (!$bTimeZone)
461 CTimeZone::Enable();
462
463 if ($limit)
464 {
465 $dbRes = $DB->Query(str_replace("#LIMIT#", $sqlLimit, $strSql));
466 }
467 else
468 {
469 $dbRes = $DB->Query(str_replace("#LIMIT#", "", $strSql));
470 }
471
472 while ($arRes = $dbRes->Fetch())
473 {
474 if ($arRes['ID'] < $startId)
475 continue;
476
477 if ($fromUserId == $arRes['AUTHOR_ID'])
478 {
479 $arRes['TO_USER_ID'] = $toUserId;
480 $arRes['FROM_USER_ID'] = $fromUserId;
481 $convId = $arRes['TO_USER_ID'];
482 }
483 else
484 {
485 $arRes['TO_USER_ID'] = $fromUserId;
486 $arRes['FROM_USER_ID'] = $toUserId;
487 $convId = $arRes['FROM_USER_ID'];
488 }
489
490 $arMessages[$arRes['ID']] = Array(
491 'id' => $arRes['ID'],
492 'chatId' => $arRes['CHAT_ID'],
493 'senderId' => $arRes['FROM_USER_ID'],
494 'recipientId' => $arRes['TO_USER_ID'],
495 'system' => $arRes['NOTIFY_EVENT'] == 'private'? 'N': 'Y',
496 'date' => \Bitrix\Main\Type\DateTime::createFromTimestamp($arRes['DATE_CREATE']),
497 'text' => \Bitrix\Im\Text::parse($arRes['MESSAGE']),
498 'textLegacy' => \Bitrix\Im\Text::parseLegacyFormat($arRes['MESSAGE']),
499 );
500
501 $arMessageId[] = $arRes['ID'];
502 $arUsersMessage[$convId][] = $arRes['ID'];
503 if ($lastId < $arRes['ID'])
504 {
505 $arUnreadMessages[$convId][] = $arRes['ID'];
506 }
507 }
508 }
509 $params = CIMMessageParam::Get($arMessageId);
510
511 $arFiles = Array();
512 foreach ($params as $messageId => $param)
513 {
514 $arMessages[$messageId]['params'] = $param;
515
516 if (
517 mb_strlen($arMessages[$messageId]['text']) <= 0
518 && !isset($param['FILE_ID'])
519 && !isset($param['KEYBOARD'])
520 && !isset($param['ATTACH'])
521 )
522 {
523 $arMessages[$messageId]['text'] = GetMessage('IM_MESSAGE_DELETED');
524 $arMessages[$messageId]['params']['IS_DELETED'] = 'Y';
525 }
526
527 if (isset($param['FILE_ID']))
528 {
529 foreach ($param['FILE_ID'] as $fileId)
530 {
531 $arFiles[$fileId] = $fileId;
532 }
533 }
534 }
535
536 $arChatFiles = CIMDisk::GetFiles($chatId, $arFiles);
537 $arMessages = CIMMessageLink::prepareShow($arMessages, $params);
538
539 $arUserChatBlockStatus = Array();
540 if ($blockNotify)
541 $arUserChatBlockStatus[$chatId][$fromUserId] = 'Y';
542
543 $arResult = Array(
544 'chatId' => $chatId,
545 'message' => $arMessages,
546 'usersMessage' => $arUsersMessage,
547 'unreadMessage' => $arUnreadMessages,
548 'users' => Array(),
549 'userInGroup' => Array(),
550 'files' => $arChatFiles,
551 'userChatBlockStatus' => $arUserChatBlockStatus
552 );
553
554 if ($lastRead)
555 {
556 $arResult['readedList'][$toUserId] = Array(
557 'messageId' => $lastReadId,
558 'date' => $lastRead,
559 );
560 }
561
562 if (is_array($loadUserData) || is_bool($loadUserData) && $loadUserData == true)
563 {
564 $bDepartment = true;
565 if (is_array($loadUserData) && $loadUserData['DEPARTMENT'] == 'N')
566 $bDepartment = false;
567
568 $ar = CIMContactList::GetUserData(array(
569 'ID' => Array($fromUserId, $toUserId),
570 'DEPARTMENT' => ($bDepartment? 'Y': 'N'),
571 'USE_CACHE' => 'N',
572 'SHOW_ONLINE' => 'Y',
573 'PHONES' => IsModuleInstalled('voximplant')? 'Y': 'N'
574 )
575 );
576
577 $arResult['users'] = $ar['users'];
578 $arResult['userInGroup'] = $ar['userInGroup'];
579 $arResult['phones'] = $ar['phones'];
580 }
581
582 return $arResult;
583 }
584
586 {
587 global $DB;
588
589 if (!isset($arParams['TO_USER_ID']))
590 return false;
591
592 $toUserId = $arParams['TO_USER_ID'];
593 $fromUserId = isset($arParams['FROM_USER_ID']) && intval($arParams['FROM_USER_ID'])>0? intval($arParams['FROM_USER_ID']): $this->user_id;
594 $limit = isset($arParams['LIMIT']) && intval($arParams['LIMIT'])>0? intval($arParams['LIMIT']): false;
595 $order = isset($arParams['ORDER']) && $arParams['ORDER'] == 'ASC'? 'ASC': 'DESC';
596 $bTimeZone = isset($arParams['USE_TIME_ZONE']) && $arParams['USE_TIME_ZONE'] == 'N'? false: true;
597
598 $arToUserId = Array();
599 if (is_array($toUserId))
600 {
601 foreach ($toUserId as $userId)
602 $arToUserId[] = intval($userId);
603 }
604 else
605 {
606 $arToUserId[] = intval($toUserId);
607 }
608 if (empty($arToUserId))
609 return Array();
610
611 $sqlLimit = '';
612 if ($limit)
613 {
614 if ($DB->type == "MSSQL")
615 {
616 $sqlLimit = " AND M.DATE_CREATE > dateadd(day, -".$limit.", getdate())";
617 }
618 elseif ($DB->type == "ORACLE")
619 {
620 $sqlLimit = " AND M.DATE_CREATE > SYSDATE-".$limit;
621 }
622 else
623 {
624 //$sqlLimit = " AND M.DATE_CREATE > DATE_SUB(NOW(), INTERVAL ".$limit." DAY)";
626 $helper = $connection->getSqlHelper();
627
628 $sqlLimit = " AND M.DATE_CREATE > ". $helper->addDaysToDateTime(-1 * $limit);
629 }
630 }
631
632 if (!$bTimeZone)
633 CTimeZone::Disable();
634 $strSql = "
635 SELECT
636 M.ID,
637 M.CHAT_ID,
638 M.MESSAGE,
639 ".$DB->DatetimeToTimestampFunction('M.DATE_CREATE')." as DATE_CREATE,
640 M.AUTHOR_ID,
641 R1.USER_ID as R1_USER_ID,
642 R2.USER_ID as R2_USER_ID
643 FROM b_im_relation R1
644 INNER JOIN b_im_relation R2 on R2.CHAT_ID = R1.CHAT_ID
645 INNER JOIN b_im_message M ON M.ID >= R1.START_ID
646 AND M.ID >= R1.LAST_ID
647 AND M.ID >= R2.LAST_ID
648 AND M.CHAT_ID = R1.CHAT_ID
649 ".$sqlLimit."
650 WHERE
651 R1.USER_ID = ".$fromUserId."
652 AND R2.USER_ID IN (".implode(",",$arToUserId).")
653 AND R1.MESSAGE_TYPE = '".IM_MESSAGE_PRIVATE."'
654 ".($order == 'DESC'? "ORDER BY M.DATE_CREATE DESC, M.ID DESC": "");
655 if (!$bTimeZone)
656 CTimeZone::Enable();
657
658 $arMessages = Array();
659 $dbRes = $DB->Query($strSql);
660 while ($arRes = $dbRes->Fetch())
661 {
662 if ($fromUserId == $arRes['AUTHOR_ID'])
663 {
664 $arRes['TO_USER_ID'] = $arRes['R2_USER_ID'];
665 $arRes['FROM_USER_ID'] = $arRes['R1_USER_ID'];
666 $convId = $arRes['TO_USER_ID'];
667 }
668 else
669 {
670 $arRes['TO_USER_ID'] = $arRes['R1_USER_ID'];
671 $arRes['FROM_USER_ID'] = $arRes['R2_USER_ID'];
672 $convId = $arRes['FROM_USER_ID'];
673 }
674
675 if (!isset($arMessages[$convId]) || (isset($arMessages[$convId]) && $arMessages[$convId]['date'] < $arRes['DATE_CREATE']))
676 {
677
678 $arMessages[$convId] = Array(
679 'id' => $arRes['ID'],
680 'senderId' => $arRes['FROM_USER_ID'],
681 'recipientId' => $arRes['TO_USER_ID'],
682 'date' => \Bitrix\Main\Type\DateTime::createFromTimestamp($arRes['DATE_CREATE']),
683 'text' => $arRes['MESSAGE']
684 );
685 }
686 }
687 foreach ($arMessages as $key => $value)
688 {
689 $value['text'] = \Bitrix\Im\Text::parse($value['text']);
690 $arMessages[$key] = $value;
691 }
692 return $arMessages;
693 }
694
700 public static function GetUnsendMessage($order = "ASC")
701 {
702 //todo: change send mail logic
703 global $DB;
704
705 $mailService = new \Bitrix\Im\V2\Mail();
706
707 $unsendIds = $mailService->getMessageIdsToSend();
708
709 if (empty($unsendIds))
710 {
711 return [];
712 }
713
714 $implodeUnsendIds = implode(',', $unsendIds);
715
716 CTimeZone::Disable();
717 $strSql ="
718 SELECT
719 M.ID,
720 M.CHAT_ID,
721 M.MESSAGE,
722 M.MESSAGE_OUT,
723 ".$DB->DatetimeToTimestampFunction('M.DATE_CREATE')." as DATE_CREATE,
724 M.EMAIL_TEMPLATE,
725 R.USER_ID as TO_USER_ID,
726 U1.ACTIVE as TO_USER_ACTIVE,
727 U1.LOGIN as TO_USER_LOGIN,
728 U1.NAME as TO_USER_NAME,
729 U1.LAST_NAME as TO_USER_LAST_NAME,
730 U1.EMAIL as TO_USER_EMAIL,
731 U1.LID as TO_USER_LID,
732 U1.TIME_ZONE as TIME_ZONE,
733 U1.EXTERNAL_AUTH_ID as TO_EXTERNAL_AUTH_ID,
734 M.AUTHOR_ID as FROM_USER_ID,
735 U2.LOGIN as FROM_USER_LOGIN,
736 U2.NAME as FROM_USER_NAME,
737 U2.LAST_NAME as FROM_USER_LAST_NAME,
738 U2.EXTERNAL_AUTH_ID as FROM_EXTERNAL_AUTH_ID
739 FROM b_im_relation R
740 INNER JOIN b_im_message M ON M.CHAT_ID = R.CHAT_ID AND IMPORT_ID IS NULL AND R.USER_ID != M.AUTHOR_ID AND M.ID IN ({$implodeUnsendIds})
741 LEFT JOIN b_user U1 ON U1.ID = R.USER_ID
742 LEFT JOIN b_user U2 ON U2.ID = M.AUTHOR_ID
743 ".($order == "DESC"? "ORDER BY M.DATE_CREATE DESC, M.ID DESC": "")."
744 ";
745
746 $dbRes = $DB->Query($strSql);
747 CTimeZone::Enable();
748
749 $arMessages = Array();
750 while ($arRes = $dbRes->Fetch())
751 {
752 $arRes["DATE_CREATE"] = $arRes["DATE_CREATE"] + CIMMail::GetUserOffset($arRes);
753 $arMessages[$arRes['ID']] = $arRes;
754 }
755
756 return $arMessages;
757 }
758
759 public function SetReadMessage($fromUserId, $lastId = null, $byEvent = false)
760 {
761 global $DB;
762
763 $fromUserId = intval($fromUserId);
764 if ($fromUserId <= 0)
765 return false;
766
767 CIMMessenger::SpeedFileDelete($this->user_id, IM_SPEED_MESSAGE);
768
769 $chat = \Bitrix\Im\V2\Entity\User\User::getInstance($this->user_id)->getChatWith($fromUserId, false);
770 if ($chat === null)
771 {
772 return false;
773 }
774 $readService = new \Bitrix\Im\V2\Message\ReadService($this->user_id);
775
776 $startId = $readService->getLastIdByChatId($chat->getChatId());
777 $counter = 0;
778 $viewedMessages = [];
779
780 if (isset($lastId))
781 {
782 $message = new \Bitrix\Im\V2\Message();
783 $message->setMessageId((int)$lastId)->setChatId($chat->getChatId())->setChat($chat);
784 $readResult = $readService->readTo($message);
785 $counter = $readResult->getResult()['COUNTER'];
786 $viewedMessages = $readResult->getResult()['VIEWED_MESSAGES'];
787 }
788 else
789 {
790 $counter = $readService->readAllInChat($chat->getChatId())->getResult()['COUNTER'];
791 }
792
793 /*\Bitrix\Main\Application::getConnection()->query(
794 "UPDATE b_im_recent SET DATE_UPDATE = NOW() WHERE USER_ID = ".$this->user_id." AND ITEM_CID = ".$chat->getChatId()
795 );*/
796
797 $endId = $readService->getLastIdByChatId($chat->getChatId());
798
799 if (CModule::IncludeModule("pull"))
800 {
801 CPushManager::DeleteFromQueueBySubTag($this->user_id, 'IM_MESS');
802
803 \Bitrix\Pull\Event::add($this->user_id, Array(
804 'module_id' => 'im',
805 'command' => 'readMessage',
806 'params' => Array(
807 'dialogId' => $fromUserId,
808 'chatId' => $chat->getChatId(),
809 'senderId' => $this->user_id,
810 'id' => $fromUserId,
811 'userId' => $fromUserId,
812 'lastId' => $endId,
813 'counter' => $counter,
814 'muted' => false,
815 'unread' => \Bitrix\Im\Recent::isUnread($this->user_id, \IM_MESSAGE_PRIVATE, $fromUserId),
816 'viewedMessages' => $viewedMessages,
817 'counterType' => $chat->getCounterType()->value,
818 'recentConfig' => $chat->getRecentConfig()->toPullFormat(),
819 ),
820 'extra' => \Bitrix\Im\Common::getPullExtra()
821 ));
822 \Bitrix\Pull\Event::add($fromUserId, Array(
823 'module_id' => 'im',
824 'command' => 'readMessageOpponent',
825 'expiry' => 3600,
826 'params' => Array(
827 'dialogId' => $this->user_id,
828 'chatId' => $chat->getChatId(),
829 'userId' => $this->user_id,
830 'userName' => \Bitrix\Im\User::getInstance($this->user_id)->getFullName(false),
831 'lastId' => $endId,
832 'date' => date('c', time()),
833 'chatMessageStatus' => (new \Bitrix\Im\V2\Message\ReadService($fromUserId))->getChatMessageStatus($chat->getChatId()),
834 'viewedMessages' => $viewedMessages,
835 ),
836 'extra' => \Bitrix\Im\Common::getPullExtra()
837 ));
838 }
839
840 foreach(GetModuleEvents("im", "OnAfterUserRead", true) as $arEvent)
841 {
842 ExecuteModuleEventEx($arEvent, array(Array(
843 'DIALOG_ID' => $fromUserId,
844 'CHAT_ID' => $chat->getChatId(),
845 'CHAT_ENTITY_TYPE' => 'USER',
846 'CHAT_ENTITY_ID' => '',
847 'START_ID' => $startId,
848 'END_ID' => $endId,
849 'COUNT' => $counter,
850 'USER_ID' => $this->user_id,
851 'BY_EVENT' => $byEvent
852 )));
853 }
854
855 return Array(
856 'DIALOG_ID' => $fromUserId,
857 'CHAT_ID' => $chat->getChatId(),
858 'LAST_ID' => $endId,
859 'COUNTER' => $counter
860 );
861 }
862
863 public function SetUnReadMessage($fromUserId, $lastId)
864 {
865 global $DB;
866
867 $fromUserId = intval($fromUserId);
868 if ($fromUserId <= 0)
869 return false;
870
871 $lastId = intval($lastId);
872 if (intval($lastId) <= 0)
873 return false;
874
875 /*$result = \Bitrix\Im\V2\Entity\User\User::getInstance($this->user_id)
876 ->getChatWith($fromUserId)
877 ?->unreadToMessage(new \Bitrix\Im\V2\Message($lastId))
878 ;
879
880 return $result?->isSuccess() ?? false;*/
881
882 $strSql = "
883 SELECT M.CHAT_ID
884 FROM b_im_relation RF
885 INNER JOIN b_im_relation RT on RF.CHAT_ID = RT.CHAT_ID
886 INNER JOIN b_im_message M ON M.ID = ".$lastId." AND M.CHAT_ID = RT.CHAT_ID
887 WHERE RT.USER_ID = ".$this->user_id."
888 and RF.USER_ID = ".$fromUserId."
889 and RT.MESSAGE_TYPE = '".IM_MESSAGE_PRIVATE."'
890 GROUP BY M.CHAT_ID";
891 $dbRes = $DB->Query($strSql);
892 if ($arRes = $dbRes->Fetch())
893 {
894 $relation = self::SetLastIdForUnread($arRes['CHAT_ID'], $this->user_id, $lastId);
895 if ($relation)
896 {
897 $chat = Chat::getInstance((int)$arRes['CHAT_ID']);
899 "UPDATE b_im_recent SET DATE_UPDATE = NOW() WHERE USER_ID = ".$this->user_id." AND ITEM_CID = ".intval($arRes['CHAT_ID'])
900 );
901
902 CIMMessenger::SpeedFileDelete($this->user_id, IM_SPEED_MESSAGE);
903
904 if (CModule::IncludeModule("pull"))
905 {
906 \Bitrix\Pull\Event::add($this->user_id, Array(
907 'module_id' => 'im',
908 'command' => 'unreadMessage',
909 'expiry' => 3600,
910 'params' => Array(
911 'dialogId' => $fromUserId,
912 'chatId' => intval($arRes['CHAT_ID']),
913 'userId' => $fromUserId,
914 'date' => new \Bitrix\Main\Type\DateTime(),
915 'counter' => (int)$relation['COUNTER'],
916 'muted' => false,
917 'unread' => \Bitrix\Im\Recent::isUnread($this->user_id, \IM_MESSAGE_PRIVATE, $fromUserId),
918 'unreadTo' => $lastId,
919 'counterType' => $chat->getCounterType()->value,
920 'recentConfig' => $chat->getRecentConfig()->toPullFormat(),
921 ),
922 'push' => Array('badge' => 'Y'),
923 'extra' => \Bitrix\Im\Common::getPullExtra()
924 ));
925 \Bitrix\Pull\Event::add($fromUserId, Array(
926 'module_id' => 'im',
927 'command' => 'unreadMessageOpponent',
928 'expiry' => 3600,
929 'params' => Array(
930 'dialogId' => $this->user_id,
931 'chatId' => intval($arRes['CHAT_ID']),
932 'userId' => $this->user_id,
933 'chatMessageStatus' => $relation['CHAT_MESSAGE_STATUS'],
934 'unreadTo' => $lastId,
935 ),
936 'extra' => \Bitrix\Im\Common::getPullExtra()
937 ));
938 }
939
941 new Sync\Event(Sync\Event::ADD_EVENT, Sync\Event::CHAT_ENTITY, intval($arRes['CHAT_ID'])),
942 $this->user_id,
943 $chat
944 );
945
946 return true;
947 }
948 }
949
950 return false;
951 }
952
953 public static function SetReadMessageAll($fromUserId)
954 {
955 /*global $DB;
956
957 $fromUserId = intval($fromUserId);
958 if ($fromUserId <= 0)
959 return false;
960
961 $strSql = "
962 SELECT RT.ID, RT.USER_ID, RT.CHAT_ID
963 FROM b_im_relation RF
964 INNER JOIN b_im_relation RT on RF.CHAT_ID = RT.CHAT_ID AND RT.ID != RF.ID
965 WHERE RF.USER_ID = ".$fromUserId."
966 AND RT.MESSAGE_TYPE = '".IM_MESSAGE_PRIVATE."' AND RT.STATUS < ".IM_STATUS_READ;
967 $dbRes = $DB->Query($strSql);
968 if ($arRes = $dbRes->Fetch())
969 {
970 \Bitrix\Im\Model\RelationTable::update($arRes["ID"], [
971 'STATUS' => IM_STATUS_READ
972 ]);
973 CIMMessenger::SpeedFileDelete($arRes['USER_ID'], IM_SPEED_MESSAGE);
974 }*/
975
976 return true;
977 }
978
986 public static function SetLastId($chatId, $userId, $lastId = null)
987 {
988 $chatId = intval($chatId);
989 $userId = intval($userId);
990
991 $lastIdIsNull = $lastId === null;
992 $lastId = intval($lastId);
993
994 if ($chatId <= 0 || $userId <= 0)
995 return false;
996
997 $updateCounters = false;
998 $relations = \Bitrix\Im\Chat::getRelation($chatId, Array(
999 //'SELECT' => Array('ID', 'CHAT_ID', 'LAST_ID', 'LAST_SEND_ID', 'STATUS', 'USER_ID', 'NOTIFY_BLOCK', 'MESSAGE_TYPE'),
1000 'SELECT' => Array('ID', 'CHAT_ID', 'LAST_ID', 'USER_ID', 'NOTIFY_BLOCK', 'MESSAGE_TYPE'),
1001 'FILTER' => Array(
1002 'USER_ID' => $userId
1003 ),
1004 'REAL_COUNTERS' => $lastIdIsNull? 'Y': Array(
1005 'LAST_ID' => $lastId
1006 )
1007 ));
1008 if (isset($relations[$userId]))
1009 {
1010 $relation = $relations[$userId];
1011 }
1012 else
1013 {
1014 return false;
1015 }
1016
1017
1018
1019 /*$update = array();
1020 if (!$lastIdIsNull)
1021 {
1022 if ($relation["LAST_ID"] < $lastId)
1023 {
1024 $relation["LAST_ID"] = $update["LAST_ID"] = $lastId;
1025 }
1026 if ($relation["LAST_SEND_ID"] < $lastId)
1027 {
1028 $relation["LAST_SEND_ID"] = $update["LAST_SEND_ID"] = $lastId;
1029 }
1030 }
1031
1032 if ($relation['COUNTER'] > 0)
1033 {
1034 if ($relation['STATUS'] == IM_STATUS_READ)
1035 {
1036 $relation["STATUS"] = $update["STATUS"] = IM_STATUS_NOTIFY;
1037 }
1038
1039 $filter = [
1040 '=CHAT_ID' => $relation['CHAT_ID']
1041 ];
1042 if ($lastId > 0)
1043 {
1044 $filter['>ID'] = $lastId;
1045 }
1046
1047 $firstUnreadMessage = \Bitrix\Im\Model\MessageTable::getList([
1048 'select' => ['ID'],
1049 'filter' => $filter,
1050 'limit' => 1,
1051 ])->fetch();
1052
1053 $update["LAST_ID"] = $relation["LAST_ID"] = $lastId;
1054 $update["UNREAD_ID"] = $firstUnreadMessage? $firstUnreadMessage['ID']: 0;
1055 }
1056 else
1057 {
1058 if ($relation['STATUS'] != IM_STATUS_READ)
1059 {
1060 $relation["STATUS"] = $update["STATUS"] = IM_STATUS_READ;
1061 }
1062 $relation["UNREAD_ID"] = $update["UNREAD_ID"] = 0;
1063 }
1064
1065 if ($relation['COUNTER'] != $relation['PREVIOUS_COUNTER'])
1066 {
1067 $update["COUNTER"] = $relation['COUNTER'];
1068 $updateCounters = true;
1069 }*/
1070
1071 $relation['CHAT_MESSAGE_STATUS'] = (new \Bitrix\Im\V2\Message\ReadService($userId))->getChatMessageStatus($chatId);
1072
1073 /*if ($update)
1074 {
1075 if ($relation['STATUS'] == IM_STATUS_READ)
1076 {
1077 $relation["LAST_READ"] = $update["LAST_READ"] = new Bitrix\Main\Type\DateTime();
1078 $relation["MESSAGE_STATUS"] = $update["MESSAGE_STATUS"] = IM_MESSAGE_STATUS_DELIVERED;
1079 }
1080 else
1081 {
1082 $relation["LAST_READ"] = $update["LAST_READ"] = '';
1083 $relation["MESSAGE_STATUS"] = $update["MESSAGE_STATUS"] = IM_MESSAGE_STATUS_RECEIVED;
1084 }
1085
1086 \Bitrix\Im\Model\RelationTable::update($relation["ID"], $update);
1087
1088 if ($relation['MESSAGE_TYPE'] != IM_MESSAGE_OPEN_LINE)
1089 {
1090 $orm = \Bitrix\Im\Model\RelationTable::getList(array(
1091 'filter' => Array(
1092 '=CHAT_ID' => $chatId
1093 )
1094 ));
1095 if ($relation['STATUS'] == IM_STATUS_READ)
1096 {
1097 \Bitrix\Im\Model\ChatTable::update($chatId, Array('LAST_MESSAGE_STATUS' => IM_MESSAGE_STATUS_DELIVERED));
1098 $relation['CHAT_MESSAGE_STATUS'] = IM_MESSAGE_STATUS_DELIVERED;
1099
1100 while ($row = $orm->fetch())
1101 {
1102 if ($userId == $row['USER_ID'])
1103 {
1104 $updateCounters = true;
1105 continue;
1106 }
1107 \Bitrix\Im\Counter::clearCache($row['USER_ID']);
1108 }
1109 }
1110 else
1111 {
1112 $relations = Array();
1113 while ($row = $orm->fetch())
1114 {
1115 $relations[] = $row['USER_ID'];
1116 if ($row['MESSAGE_STATUS'] == IM_MESSAGE_STATUS_DELIVERED)
1117 {
1118 $relation['CHAT_MESSAGE_STATUS'] = IM_MESSAGE_STATUS_DELIVERED;
1119 $relations = Array();
1120 break;
1121 }
1122 }
1123 if ($relations)
1124 {
1125 \Bitrix\Im\Model\ChatTable::update($chatId, Array('LAST_MESSAGE_STATUS' => IM_MESSAGE_STATUS_RECEIVED));
1126 $relation['CHAT_MESSAGE_STATUS'] = IM_MESSAGE_STATUS_RECEIVED;
1127 foreach ($relations as $relationUserId)
1128 {
1129 if ($userId == $relationUserId)
1130 {
1131 $updateCounters = true;
1132 continue;
1133 }
1134 \Bitrix\Im\Counter::clearCache($relationUserId);
1135 }
1136 }
1137 }
1138 }
1139 }
1140
1141 if ($updateCounters)
1142 {
1143 \Bitrix\Im\Counter::clearCache($userId);
1144 }*/
1145
1146 return $relation;
1147 }
1148
1156 public static function SetLastIdForUnread($chatId, $userId, $lastId)
1157 {
1158 $message = new \Bitrix\Im\V2\Message();
1159 $message->setMessageId($lastId)->setChatId($chatId);
1160 $ownRelation = Chat::getInstance($chatId)->getSelfRelation();
1161
1162 if ($ownRelation === null)
1163 {
1164 return false;
1165 }
1166
1167 $firstUnreadMessage = \Bitrix\Im\Model\MessageTable::getList([
1168 'select' => ['ID'],
1169 'filter' => [
1170 '=CHAT_ID' => $chatId,
1171 '<ID' => $lastId
1172 ],
1173 'limit' => 1,
1174 'order' => Array('ID' => 'DESC')
1175 ])->fetch();
1176
1177 $firstUnreadMessage = intval($firstUnreadMessage['ID']);
1178 $sql = "
1179 UPDATE b_im_relation
1180 SET LAST_ID=(CASE WHEN LAST_ID < {$firstUnreadMessage} THEN LAST_ID ELSE {$firstUnreadMessage} END)
1181 WHERE CHAT_ID={$chatId} AND USER_ID={$userId}
1182 ";
1183 Application::getConnection()->queryExecute($sql);
1184 $readService = new \Bitrix\Im\V2\Message\ReadService($userId);
1185 $readService->getCounterService()->addStartingFrom($lastId, $ownRelation);
1186 $relation = self::SetLastId($chatId, $userId, $lastId);
1187 $readService->getViewedService()->deleteStartingFrom($message);
1188
1189 return $relation;
1190 }
1191
1199 public static function SetLastSendId($chatId, $userId, $lastSendId)
1200 {
1201 /*global $DB;
1202
1203 if (intval($chatId) <= 0 || intval($userId) <= 0 || intval($lastSendId) <= 0)
1204 return false;
1205
1206 $strSql = "UPDATE b_im_relation
1207 SET LAST_SEND_ID = (case when LAST_SEND_ID > ".intval($lastSendId)." then LAST_SEND_ID else ".intval($lastSendId)." end),
1208 STATUS = ".IM_STATUS_NOTIFY."
1209 WHERE CHAT_ID = ".intval($chatId)." AND USER_ID = ".intval($userId);
1210 $DB->Query($strSql);*/
1211
1212 return true;
1213 }
1214
1215 public static function Delete($id, $userId = null, $completeDelete = false, $byEvent = false)
1216 {
1217 return CIMMessenger::Delete($id, $userId, $completeDelete, $byEvent);
1218 }
1219
1228 public static function GetFormatMessage($arParams)
1229 {
1230 $arParams['ID'] = intval($arParams['ID']);
1231 $arParams['TO_USER_ID'] = isset($arParams['TO_CHAT_ID'])? intval($arParams['TO_CHAT_ID']): intval($arParams['TO_USER_ID']);
1232 $arParams['FROM_USER_ID'] = intval($arParams['FROM_USER_ID']);
1233 $arParams['MESSAGE'] = trim($arParams['MESSAGE']);
1234 $arParams['DATE_CREATE'] = intval($arParams['DATE_CREATE']);
1235 $arParams['PARAMS'] = empty($arParams['PARAMS'])? Array(): $arParams['PARAMS'];
1236 $arParams['EXTRA_PARAMS'] = empty($arParams['EXTRA_PARAMS'])? Array(): $arParams['EXTRA_PARAMS'];
1237 $arParams['NOTIFY'] = $arParams['NOTIFY'] === true? true: $arParams['NOTIFY'];
1238
1239 $arUsers = CIMContactList::GetUserData(Array(
1240 'ID' => isset($arParams['TO_CHAT_ID'])? $arParams['FROM_USER_ID']: Array($arParams['TO_USER_ID'], $arParams['FROM_USER_ID']),
1241 'PHONES' => 'Y',
1242 ));
1243
1244 $multidialogBot = null;
1245 foreach ($arUsers['users'] as $key => $user)
1246 {
1247 if (
1248 !empty($user['bot_data'])
1249 && in_array($user['bot_data']['type'], ['support24', 'network'])
1250 && \Bitrix\Main\Loader::includeModule('imbot')
1251 && !isset($arParams['TO_CHAT_ID'])
1252 && count($arUsers['users']) == 2
1253 )
1254 {
1255 $botId = (int)$user['id'];
1256 foreach ($arUsers['users'] as $otherUser)
1257 {
1258 if ($otherUser['id'] != $botId)
1259 {
1260 $multidialogBot = \Bitrix\ImBot\Bot\Network::getBotAsMultidialog($botId, (int)$otherUser['id']);
1261 }
1262 }
1263 }
1264 }
1265
1266 $arChat = Array();
1267 $chatType = Chat::IM_TYPE_PRIVATE;
1268 $chatEntityType = '';
1269 if (isset($arParams['TO_CHAT_ID']))
1270 {
1271 $arChat = CIMChat::GetChatData(array(
1272 'ID' => $arParams['TO_CHAT_ID'],
1273 'USE_CACHE' => 'N',
1274 ));
1275
1276 $chatType = $arChat['chat'][$arParams['TO_CHAT_ID']]['message_type'];
1277 $chatEntityType = $arChat['chat'][$arParams['TO_CHAT_ID']]['entity_type'] ?? '';
1278 $extraParamContext = $arParams['EXTRA_PARAMS']['CONTEXT'] ?? null;
1279 if (!empty($arUsers['users']) && $extraParamContext == 'LIVECHAT' && CModule::IncludeModule('imopenlines'))
1280 {
1281 [$lineId, $userId] = explode('|', $arChat['chat'][$arParams['TO_CHAT_ID']]['entity_id']);
1282 $userCode = 'livechat|' . $lineId . '|' . $arParams['TO_CHAT_ID'] . '|' . $userId;
1283 unset($lineId, $userId);
1284
1285 foreach ($arUsers['users'] as $userId => $userData)
1286 {
1287 $arUsers['users'][$userId] = \Bitrix\ImOpenLines\Connector::getOperatorInfo($arParams['EXTRA_PARAMS']['LINE_ID'], $userId, $userCode);
1288 }
1289 }
1290 }
1291
1292 if (isset($arParams['TEMPLATE_ID']))
1293 {
1294 $arParams['TEMPLATE_ID'] = is_numeric($arParams['TEMPLATE_ID'])? (int)$arParams['TEMPLATE_ID']: (string)$arParams['TEMPLATE_ID'];
1295 }
1296 else
1297 {
1298 $arParams['TEMPLATE_ID'] = '';
1299 }
1300
1301 if (isset($arParams['FILE_TEMPLATE_ID']))
1302 {
1303 $arParams['FILE_TEMPLATE_ID'] = is_numeric($arParams['FILE_TEMPLATE_ID'])? (int)$arParams['FILE_TEMPLATE_ID']: (string)$arParams['FILE_TEMPLATE_ID'];
1304 }
1305 else
1306 {
1307 $arParams['FILE_TEMPLATE_ID'] = '';
1308 }
1309
1310 if (
1312 || $arChat['chat'][$arParams['TO_CHAT_ID']]['type'] === 'copilot'
1313 )
1314 {
1315 $chatId = (int)$arParams['CHAT_ID'];
1316 $isCopilotChat = $arChat['chat'][$arParams['TO_CHAT_ID']]['type'] === 'copilot';
1317 $copilotData = self::prepareCopilotData($arParams, $chatId, $isCopilotChat);
1318 }
1319
1320 $additionalEntitiesAdapter = new \Bitrix\Im\V2\Rest\RestAdapter();
1321 $additionalPopupData = new \Bitrix\Im\V2\Rest\PopupData([]);
1322
1323 $forwardInfo = null;
1324 if (isset($arParams['PARAMS']['FORWARD_CONTEXT_ID']))
1325 {
1326 $additionalUserId = (int)$arParams['PARAMS']['FORWARD_USER_ID'];
1327 $additionalPopupData->add(new \Bitrix\Im\V2\Entity\User\UserPopupItem([$additionalUserId]));
1328 $forwardInfo = [
1329 'id' => $arParams['PARAMS']['FORWARD_CONTEXT_ID'],
1330 'userId' => (int)$arParams['PARAMS']['FORWARD_USER_ID'],
1331 'chatTitle' => $arParams['PARAMS']['FORWARD_CHAT_TITLE'],
1332 'chatType' => \Bitrix\Im\V2\Message\Forward\ForwardService::getChatTypeByContextId($arParams['PARAMS']['FORWARD_CONTEXT_ID']),
1333 ];
1334 unset(
1335 $arParams['PARAMS']['FORWARD_CONTEXT_ID'],
1336 $arParams['PARAMS']['FORWARD_USER_ID'],
1337 $arParams['PARAMS']['FORWARD_ID'],
1338 $arParams['PARAMS']['FORWARD_CHAT_TITLE']
1339 );
1340 }
1341
1342 $replyIds = [];
1343 if (isset($arParams['PARAMS']['REPLY_ID']))
1344 {
1345 $replyIds[] = (int)$arParams['PARAMS']['REPLY_ID'];
1346 }
1348 $messages->fillAllForRest();
1349 $additionalEntitiesAdapter->addEntities($messages);
1350 $additionalEntitiesAdapter->setAdditionalPopupData($additionalPopupData);
1351 $additionalEntitiesRest = $additionalEntitiesAdapter->toRestFormat([
1352 'WITHOUT_OWN_REACTIONS' => true,
1353 'MESSAGE_ONLY_COMMON_FIELDS' => true,
1354 ]);
1355
1356 $multidialog = null;
1357 if (isset($arChat['multidialogs'][$arParams['CHAT_ID']]))
1358 {
1359 $multidialog = $arChat['multidialogs'][$arParams['CHAT_ID']];
1360 }
1361 elseif ($multidialogBot)
1362 {
1363 $multidialog = $multidialogBot;
1364 }
1365
1366 $chatId = (int)$arParams['CHAT_ID'];
1367 $chat = Chat::getInstance($chatId);
1368 $messagesAutoDeleteConfigs = new Chat\MessagesAutoDelete\MessagesAutoDeleteConfigs([$chatId]);
1369
1370 return [
1371 'chatId' => $arParams['CHAT_ID'],
1372 'dateLastActivity' => \Bitrix\Main\Type\DateTime::createFromTimestamp($arParams['DATE_CREATE']),
1373 'dialogId' => isset($arParams['TO_CHAT_ID'])? 'chat'.$arParams['TO_CHAT_ID']: 0,
1374 'chat' => $arChat['chat'] ?? [],
1375 'copilot' => $copilotData ?? null,
1376 'lines' => $arChat['lines'][$arParams['CHAT_ID']] ?? null,
1377 'multidialog' => $multidialog,
1378 'userInChat' => $arChat['userInChat'] ?? [],
1379 'userBlockChat' => $arChat['userChatBlockStatus'] ?? [],
1380 'users' => (is_array($arUsers) && is_array($arUsers['users'])) ? $arUsers['users'] : null,
1381 'message' => [
1382 'id' => $arParams['ID'],
1383 'templateId' => $arParams['TEMPLATE_ID'],
1384 'templateFileId' => $arParams['FILE_TEMPLATE_ID'],
1385 'prevId' => intval($arParams['PREV_ID']),
1386 'chatId' => $arParams['CHAT_ID'],
1387 'senderId' => $arParams['FROM_USER_ID'],
1388 'recipientId' => isset($arParams['TO_CHAT_ID'])? 'chat'.$arParams['TO_CHAT_ID']: $arParams['TO_USER_ID'],
1389 'system' => $arParams['SYSTEM'] == 'Y'? 'Y': 'N',
1391 'text' => \Bitrix\Im\Text::parse($arParams['MESSAGE']),
1392 'textLegacy' => \Bitrix\Im\Text::parseLegacyFormat($arParams['MESSAGE']),
1393 'params' => $arParams['PARAMS'],
1394 'counter' => isset($arParams['COUNTER']) && (int)$arParams['COUNTER'] > 0 ? (int)$arParams['COUNTER'] : 0,
1395 'importantFor' => array_values($arParams['IMPORTANT_FOR'] ?? []),
1396 'isImportant' => isset($arParams['IS_IMPORTANT']) && $arParams['IS_IMPORTANT'] === 'Y',
1397 'additionalEntities' => $additionalEntitiesRest,
1398 'forward' => $forwardInfo,
1399 ],
1400 'counterType' => $chat->getCounterType()->value,
1401 'recentConfig' => $chat->getRecentConfig()->toPullFormat(),
1402 'files' => isset($arParams['FILES'])? $arParams['FILES']: [],
1403 'notify' => $arParams['NOTIFY'],
1404 'messagesAutoDeleteConfigs' => $messagesAutoDeleteConfigs->toRestFormat(),
1405 ];
1406 }
1407
1408 private static function prepareCopilotData(array $arParams, int $chatId, bool $isCopilotChat): array
1409 {
1410 $roleManager = (new RoleManager())->setContextUser((int)$arParams['FROM_USER_ID']);
1411 $messageRole = $arParams['PARAMS'][\Bitrix\Im\V2\Message\Params::COPILOT_ROLE] ?? null;
1412
1413 if (
1414 !isset($messageRole)
1415 && \Bitrix\Main\Loader::includeModule('imbot')
1416 && $arParams['FROM_USER_ID'] === \Bitrix\Imbot\Bot\CopilotChatBot::getBotId()
1417 )
1418 {
1419 $messageRole = RoleManager::getDefaultRoleCode();
1420 }
1421
1422 $engineData = null;
1423 if ($isCopilotChat)
1424 {
1425 $chat = Chat::getInstance($chatId);
1426 $engineManager = new EngineManager();
1427 $engineCode = $chat instanceof Chat\CopilotChat ? $chat->getEngineCode() : null;
1428 $engineName = isset($engineCode) ? $engineManager->getEngineNameByCode($engineCode) : null;
1429
1430 $chatData = [[
1431 'dialogId' => \Bitrix\Im\Dialog::getDialogId($chatId),
1432 'role' => $roleManager->getMainRole($chatId),
1433 'engine' => $engineCode,
1434 ]];
1435
1436 $engineData =
1437 isset($engineCode, $engineName)
1438 ? [['code' => $engineCode, 'name' => $engineName]]
1439 : null
1440 ;
1441 }
1442
1443 $messageId =
1444 isset($arParams['PARAMS']['FORWARD_ID'])
1445 ? (int)$arParams['PARAMS']['FORWARD_ID']
1446 : (int)$arParams['ID']
1447 ;
1448
1449 return [
1450 'chats' => $chatData ?? null,
1451 'messages' => !empty($messageRole) ? [['id' => $messageId, 'role' => $messageRole]] : null,
1452 'roles' => $roleManager->getRoles(
1453 $isCopilotChat ? [$roleManager->getMainRole($chatId), $messageRole] : [$messageRole]
1454 ),
1455 'engines' => $engineData,
1456 ];
1457 }
1458
1459 public static function GetChatId($fromUserId, $toUserId, $createIfNotExists = true)
1460 {
1461 global $DB;
1462
1463 $chatId = 0;
1464 $fromUserId = intval($fromUserId);
1465 $toUserId = intval($toUserId);
1466
1467 if (intval($fromUserId) <= 0 || intval($toUserId) <= 0)
1468 {
1469 return $chatId;
1470 }
1471
1472 if ($fromUserId == $toUserId)
1473 {
1474 $chat = new CIMChat();
1475 $chatId = $chat->GetPersonalChat($fromUserId);
1476 if (!$chatId)
1477 {
1478 return 0;
1479 }
1480
1481 return $chatId;
1482 }
1483
1484 $strSql = "
1485 SELECT RF.CHAT_ID
1486 FROM
1487 b_im_chat C,
1488 b_im_relation RF,
1489 b_im_relation RT
1490 WHERE
1491 C.ID = RT.CHAT_ID
1492 and C.TYPE = '".IM_MESSAGE_PRIVATE."'
1493 and RF.USER_ID = ".$fromUserId."
1494 and RT.USER_ID = ".$toUserId."
1495 and RF.MESSAGE_TYPE = '".IM_MESSAGE_PRIVATE."'
1496 and RT.MESSAGE_TYPE = '".IM_MESSAGE_PRIVATE."'
1497 and RF.CHAT_ID = RT.CHAT_ID
1498 ";
1499 $dbRes = $DB->Query($strSql);
1500 if ($arRes = $dbRes->Fetch())
1501 {
1502 $chatId = intval($arRes['CHAT_ID']);
1503 }
1504 if ($chatId <= 0)
1505 {
1506 if (!$createIfNotExists)
1507 {
1508 return 0;
1509 }
1510
1511 if (!\Bitrix\Im\Dialog::hasAccess($fromUserId, $toUserId))
1512 {
1513 return 0;
1514 }
1515
1517 'TYPE' => Chat::IM_TYPE_PRIVATE,
1518 'FROM_USER_ID' => $fromUserId,
1519 'TO_USER_ID' => $toUserId,
1520 ]);
1521 $chatId = $result->getResult()['CHAT_ID'] ?? 0;
1522 }
1523
1524 return $chatId;
1525 }
1526}
1527?>
$arParams
Определения access_dialog.php:21
$connection
Определения actionsdefinitions.php:38
$count
Определения admin_tab.php:4
if(! $messageFields||!isset($messageFields['message_id'])||!isset($messageFields['status'])||!CModule::IncludeModule("messageservice")) $messageId
Определения callback_ismscenter.php:26
$arResult
Определения generate_coupon.php:16
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
static getRelation($chatId, $params=[])
Определения chat.php:93
static getPullExtra()
Определения common.php:127
static hasAccess($dialogId, $userId=null)
Определения dialog.php:184
static isUnread(int $userId, string $itemType, string $dialogId)
Определения recent.php:1819
static parse($text, $params=Array())
Определения text.php:28
static parseLegacyFormat($text, $params=Array())
Определения text.php:94
static getInstance()
Определения ChatFactory.php:37
static getInstance(?int $id)
Определения User.php:72
const COPILOT_ROLE
Определения Params.php:71
const ADD_EVENT
Определения Event.php:12
const CHAT_ENTITY
Определения Event.php:14
static getInstance()
Определения Logger.php:37
static getInstance()
Определения application.php:98
static getConnection($name="")
Определения application.php:638
static includeModule($moduleName)
Определения loader.php:67
static filter()
Определения query.php:906
static createFromTimestamp($timestamp)
Определения datetime.php:246
static add($recipient, array $parameters, $channelType=\CPullChannel::TYPE_PRIVATE)
Определения event.php:22
Определения im_chat.php:15
static GetFiles($chatId, $fileId=false, $checkPermission=true)
Определения im_disk.php:1601
static GetUserOffset(array $params)
Определения im_mail.php:451
Определения im_message.php:14
static SetLastSendId($chatId, $userId, $lastSendId)
Определения im_message.php:1199
SetReadMessage($fromUserId, $lastId=null, $byEvent=false)
Определения im_message.php:759
static SetLastIdForUnread($chatId, $userId, $lastId)
Определения im_message.php:1156
GetUnreadMessage($arParams=Array())
Определения im_message.php:89
GetLastSendMessage($arParams)
Определения im_message.php:585
static SetReadMessageAll($fromUserId)
Определения im_message.php:953
static GetFormatMessage($arParams)
Определения im_message.php:1228
GetMessage($id, $files=false)
Определения im_message.php:41
static Add($arFields)
Определения im_message.php:28
GetLastMessage($toUserId, $fromUserId=false, $loadUserData=false, $bTimeZone=true, $limit=true)
Определения im_message.php:347
static UpdateMessageOut($id, $messageOut)
Определения im_message.php:76
static GetChatId($fromUserId, $toUserId, $createIfNotExists=true)
Определения im_message.php:1459
static GetUnsendMessage($order="ASC")
Определения im_message.php:700
static SetLastId($chatId, $userId, $lastId=null)
Определения im_message.php:986
__construct($user_id=false, $arParams=Array())
Определения im_message.php:18
SetUnReadMessage($fromUserId, $lastId)
Определения im_message.php:863
static Delete($id, $userId=null, $completeDelete=false, $byEvent=false)
Определения im_message.php:1215
if(!\Bitrix\Main\Loader::includeModule('clouds')) $lastId
Определения sync.php:68
$arFields
Определения dblapprove.php:5
</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_SPEED_MESSAGE
Определения include.php:66
const IM_MESSAGE_PRIVATE
Определения include.php:22
global $DB
Определения cron_frame.php:29
global $USER
Определения csv_new_run.php:40
ExecuteModuleEventEx($arEvent, $arParams=[])
Определения tools.php:5214
IsModuleInstalled($module_id)
Определения tools.php:5301
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
Определения tools.php:5177
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
Определения contextmenu.php:9
Определения Uuid.php:3
Определения ChatsSync.php:3
Определения ActionUuid.php:3
Определения ufield.php:9
Определения collection.php:2
$user
Определения mysql_to_pgsql.php:33
$files
Определения mysql_to_pgsql.php:30
$GLOBALS['____1690880296']
Определения license.php:1
$order
Определения payment.php:8
$message
Определения payment.php:8
$arFiles
Определения options.php:60
$counter
Определения options.php:5
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$ar
Определения options.php:199
if(empty($signedUserToken)) $key
Определения quickway.php:257
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
$messages
Определения template.php:8
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
$arRes
Определения options.php:104
$dbRes
Определения yandex_detail.php:168