9use Bitrix\Imopenlines\Model\SessionTable;
21 private $bHideLink =
false;
23 private static $entityOption =
null;
27 if (is_null($user_id))
32 $this->user_id = intval(
$USER->GetID());
37 $this->user_id = intval($user_id);
42 $this->bHideLink =
true;
52 M.*, C.TYPE as CHAT_TYPE, R.USER_ID as RID
55 INNER JOIN b_im_chat C ON C.ID = M.CHAT_ID
56 LEFT JOIN b_im_relation R ON R.CHAT_ID = M.CHAT_ID AND R.USER_ID = ".$this->user_id.
"
58 M.ID = ".intval(
$ID).
"
72 else if (intval(
$arRes[
'RID']) <= 0)
76 unset(
$arRes[
'CHAT_TYPE']);
93 function GetLastMessage($toChatId, $fromUserId =
false, $loadExtraData =
false, $bTimeZone =
true, $limit =
true)
97 $fromUserId = intval($fromUserId);
99 $fromUserId = $this->user_id;
101 $toChatId = intval($toChatId);
104 $GLOBALS[
"APPLICATION"]->ThrowException(
GetMessage(
"IM_ERROR_EMPTY_CHAT_ID"),
"ERROR_TO_CHAT_ID");
108 $orm = IM\Model\ChatTable::getById($toChatId);
109 if (!($chatData = $orm->fetch()))
111 $GLOBALS[
"APPLICATION"]->ThrowException(
GetMessage(
"IM_ERROR_CHAT_NOT_EXISTS"),
"ERROR_CHAT_NOT_EXISTS");
115 if ($chatData[
'TYPE'] ==
IM_MESSAGE_OPEN && !CIMMessenger::CheckEnableOpenChat())
117 $GLOBALS[
"APPLICATION"]->ThrowException(
GetMessage(
"IM_ERROR_CHAT_NOT_EXISTS"),
"ERROR_CHAT_NOT_EXISTS");
124 if (
$DB->type ==
"MSSQL")
126 $sqlLimit =
" AND M.DATE_CREATE > dateadd(day, -30, getdate())";
130 $sqlLimit =
" AND M.DATE_CREATE > SYSDATE-30";
137 $sqlLimit =
" AND M.DATE_CREATE > ".$helper->addDaysToDateTime(-30);
142 $lastMessageIdInChat = $readService->getLastMessageIdInChat($toChatId);
144 $limitFetchMessages = 30;
145 $relations = \CIMChat::GetRelationById($toChatId,
false, $bTimeZone,
false);
146 if (isset($relations[$fromUserId]))
148 if ($relations[$fromUserId][
'START_ID'] > 0)
150 $limitById =
'AND M.ID >= '.intval($relations[$fromUserId][
'START_ID']);
155 ->where(
'ID',
'>=', (
int)$relations[$fromUserId][
'START_ID'])
156 ->where(
'ID',
'>=', (
int)$relations[$fromUserId][
'LAST_ID'])
157 ->where(
'ID',
'<=', $lastMessageIdInChat)
158 ->where(
'CHAT_ID', $toChatId)
160 $messageCount = \Bitrix\Im\Model\MessageTable::getCount($messageCountFilter);
161 $limitFetchMessages = max($messageCount, 30);
165 CTimeZone::Disable();
168 $crmEntityType =
null;
175 $explodeData = explode(
'|', $chatData[
'ENTITY_DATA_1']);
176 $crmEntityType = ($explodeData[0] ==
'Y') ? $explodeData[1] :
null;
177 $crmEntityId = ($explodeData[0] ==
'Y') ? intval($explodeData[2]) :
null;
179 $lineId = \Bitrix\ImOpenLines\Chat::parseLinesChatEntityId($chatData[
'ENTITY_ID'])[
'lineId'];
190 ".$DB->DatetimeToTimestampFunction(
'M.DATE_CREATE').
" as DATE_CREATE,
193 C.ENTITY_TYPE as CHAT_ENTITY_TYPE,
196 INNER JOIN b_im_chat C ON C.ID = M.CHAT_ID AND C.TYPE = '".
IM_MESSAGE_OPEN.
"'
197 LEFT JOIN b_im_relation R ON R.CHAT_ID = M.CHAT_ID AND R.USER_ID = ".$fromUserId.
"
199 M.CHAT_ID = ".$toChatId.
"
202 ORDER BY M.DATE_CREATE DESC
208 && \
Bitrix\ImOpenLines\Config::canJoin($lineId, $crmEntityType, $crmEntityId)
216 ".$DB->DatetimeToTimestampFunction(
'M.DATE_CREATE').
" as DATE_CREATE,
219 C.ENTITY_TYPE as CHAT_ENTITY_TYPE,
223 LEFT JOIN b_im_relation R ON R.CHAT_ID = M.CHAT_ID AND R.USER_ID = ".$fromUserId.
"
225 M.CHAT_ID = ".$toChatId.
"
228 ORDER BY M.DATE_CREATE DESC
233 else if (isset($relations[$fromUserId]))
240 ".$DB->DatetimeToTimestampFunction(
'M.DATE_CREATE').
" as DATE_CREATE,
243 C.ENTITY_TYPE as CHAT_ENTITY_TYPE,
244 '".$fromUserId.
"' as RID
246 INNER JOIN b_im_chat C ON C.ID = M.CHAT_ID
248 M.CHAT_ID = ".$toChatId.
"
251 ORDER BY M.DATE_CREATE DESC
259 && \
Bitrix\ImOpenLines\
Model\RecentTable::getCount([
260 '=CHAT_ID' => $toChatId,
261 '=USER_ID' => $fromUserId,
270 ".$DB->DatetimeToTimestampFunction(
'M.DATE_CREATE').
" as DATE_CREATE,
273 C.ENTITY_TYPE as CHAT_ENTITY_TYPE,
274 '".$fromUserId.
"' as RID
276 INNER JOIN b_im_chat C ON C.ID = M.CHAT_ID
278 M.CHAT_ID = ".$toChatId.
"
281 ORDER BY M.DATE_CREATE DESC
289 $chatType = $chatData[
'TYPE'];
290 $chatRelationUserId = 0;
293 $arMessages = Array();
294 $arMessageId = Array();
295 $arUsersMessage = Array();
296 $arUnreadMessages = Array();
297 $readedList = Array();
301 $strSql =
$DB->TopSql($strSql, $limitFetchMessages);
307 $dbRes =
$DB->Query(str_replace(
"#LIMIT#", $sqlLimit, $strSql));
308 if (!
$dbRes->SelectedRowsCount())
309 $dbRes =
$DB->Query(str_replace(
"#LIMIT#",
"", $strSql));
313 $dbRes =
$DB->Query(str_replace(
"#LIMIT#",
"", $strSql));
316 $lastReads = $readService
318 ->getDateViewedByMessageIdForEachUser($lastMessageIdInChat, array_keys($relations))
328 $chatType =
$arRes[
'CHAT_TYPE'];
329 $chatRelationUserId = intval(
$arRes[
'RID']);
331 $arMessages[
$arRes[
'ID']] = Array(
333 'chatId' =>
$arRes[
'CHAT_ID'],
334 'senderId' =>
$arRes[
'AUTHOR_ID'],
335 'recipientId' =>
$arRes[
'CHAT_ID'],
341 $arMessageId[] =
$arRes[
'ID'];
342 if (
$arRes[
'AUTHOR_ID'] > 0)
344 $arUsers[] =
$arRes[
'AUTHOR_ID'];
346 if (isset($relations[$fromUserId]) && $relations[$fromUserId][
'LAST_ID'] <
$arRes[
'ID'])
348 $arUnreadMessages[
'chat'.$arRes[
'CHAT_ID']][] =
$arRes[
'ID'];
352 foreach ($relations as
$userId => $relation)
354 $readedList[
'chat'.$arRes[
'CHAT_ID']][$relation[
'USER_ID']] = Array(
355 'messageId' => $relation[
'LAST_ID'],
356 'date' => $lastReads[
$userId] ??
null,
361 foreach ($arUsersMessage as $chatId => $messageIds)
363 $arUsersMessage[$chatId] = array_values(array_unique($messageIds));
374 $arMessages = Array();
375 $arMessageId = Array();
376 $arUsersMessage = Array();
377 $loadExtraData =
false;
380 CModule::IncludeModule(
'pull')
384 CPullWatch::Add($fromUserId,
'IM_PUBLIC_'.$toChatId,
true);
388 $params = CIMMessageParam::Get($arMessageId);
396 mb_strlen($arMessages[
$messageId][
'text']) <= 0
397 && !isset($param[
'FILE_ID'])
398 && !isset($param[
'KEYBOARD'])
399 && !isset($param[
'ATTACH'])
403 $arMessages[
$messageId][
'params'][
'IS_DELETED'] =
'Y';
406 if (isset($param[
'FILE_ID']))
408 foreach ($param[
'FILE_ID'] as $fileId)
419 'chatId' => $toChatId,
420 'message' => $arMessages,
421 'usersMessage' => $arUsersMessage,
422 'unreadMessage' => $arUnreadMessages,
424 'userInGroup' => Array(),
425 'readedList' => $readedList,
426 'files' => $arChatFiles
429 if (is_array($loadExtraData) || is_bool($loadExtraData) && $loadExtraData ==
true)
432 if (is_array($loadExtraData) && $loadExtraData[
'DEPARTMENT'] ==
'N')
433 $bDepartment =
false;
435 $arChat = self::GetChatData(
array(
440 isset($arChat[
'chat'][$toChatId]) && $arChat[
'chat'][$toChatId][
'message_type'] ==
IM_MESSAGE_OPEN
441 || isset($arChat[
'chat'][$toChatId]) && $arChat[
'chat'][$toChatId][
'message_type'] ==
IM_MESSAGE_OPEN_LINE
442 || isset($arChat[
'userInChat'][$toChatId]) && in_array($fromUserId, $arChat[
'userInChat'][$toChatId])
446 $arResult[
'userInChat'] = $arChat[
'userInChat'];
447 $arResult[
'userChatBlockStatus'] = $arChat[
'userChatBlockStatus'];
449 $ar = CIMContactList::GetUserData(
array(
450 'ID' => array_values(array_merge($arUsers, $arChat[
'userInChat'][$toChatId])),
451 'DEPARTMENT' => ($bDepartment?
'Y':
'N'),
458 if ($arChat[
'chat'][$toChatId][
'extranet'] ===
"")
461 foreach (
$ar[
'users'] as $userData)
463 if ($userData[
'extranet'])
469 IM\Model\ChatTable::update($toChatId, Array(
'EXTRANET' => $isExtranet?
"Y":
"N"));
471 $arChat[
'chat'][$toChatId][
'extranet'] = $isExtranet;
477 if ($chatData[
'ENTITY_TYPE'] ==
'LINES' && $chatData[
'ENTITY_ID'] && CModule::IncludeModule(
'imopenlines'))
479 [, $lineId] = explode(
'|', $chatData[
"ENTITY_ID"]);
480 $configManager = new \Bitrix\ImOpenLines\Config();
481 $arResult[
'openlines'][
'canVoteAsHead'][$lineId] = $configManager->canVoteAsHead($lineId);
483 else if ($chatData[
'ENTITY_TYPE'] ==
'LIVECHAT' && $chatData[
'ENTITY_ID'] && CModule::IncludeModule(
'imopenlines'))
485 [$lineId,
$userId] = explode(
'|', $chatData[
"ENTITY_ID"]);
486 $userCode =
'livechat|' . $lineId .
'|' . $chatData[
'ID'] .
'|' .
$userId;
499 $messageStartId = intval($messageStartId);
500 $messageEndId = intval($messageEndId);
501 $chatId = intval($chatId);
505 $GLOBALS[
"APPLICATION"]->ThrowException(
GetMessage(
"IM_ERROR_EMPTY_CHAT_ID"),
"ERROR_TO_CHAT_ID");
509 $orm = IM\Model\ChatTable::getById($chatId);
510 if (!($chatData = $orm->fetch()))
512 $GLOBALS[
"APPLICATION"]->ThrowException(
GetMessage(
"IM_ERROR_CHAT_NOT_EXISTS"),
"ERROR_CHAT_NOT_EXISTS");
518 CTimeZone::Disable();
525 ".$DB->DatetimeToTimestampFunction(
'M.DATE_CREATE').
" as DATE_CREATE,
529 INNER JOIN b_im_chat C ON C.ID = M.CHAT_ID
531 M.CHAT_ID = ".$chatId.
"
532 AND M.ID >= ".$messageStartId.
"
533 ".($messageEndId > 0?
"AND M.ID <= ".$messageEndId:
"").
"
534 ORDER BY M.DATE_CREATE ".(
$order ==
'ASC'?
'ASC':
'DESC').
"
542 $arMessages = Array();
543 $arMessageId = Array();
545 $arUsersMessage = Array();
548 $arMessages[
$arRes[
'ID']] = Array(
550 'chatId' =>
$arRes[
'CHAT_ID'],
551 'senderId' =>
$arRes[
'AUTHOR_ID'],
552 'recipientId' =>
$arRes[
'CHAT_ID'],
558 $arMessageId[] =
$arRes[
'ID'];
568 $params = CIMMessageParam::Get($arMessageId);
574 if (isset($param[
'FILE_ID']))
576 foreach ($param[
'FILE_ID'] as $fileId)
588 'message' => $arMessages,
589 'usersMessage' => $arUsersMessage,
591 'userInGroup' => Array(),
592 'files' => $arChatFiles
595 if (is_array($loadExtraData) || is_bool($loadExtraData) && $loadExtraData ==
true)
598 if (is_array($loadExtraData) && $loadExtraData[
'DEPARTMENT'] ==
'N')
599 $bDepartment =
false;
601 $arChat = self::GetChatData(
array(
607 $arResult[
'userInChat'] = $arChat[
'userInChat'];
608 $arResult[
'userChatBlockStatus'] = $arChat[
'userChatBlockStatus'];
610 $ar = CIMContactList::GetUserData(
array(
611 'ID' => $arUsers[$chatId],
612 'DEPARTMENT' => ($bDepartment?
'Y':
'N'),
626 return \Bitrix\Im\Chat::getType($chatData);
638 $fromUserId = isset(
$arParams[
'FROM_USER_ID']) && intval(
$arParams[
'FROM_USER_ID'])>0? intval(
$arParams[
'FROM_USER_ID']): $this->user_id;
640 $bTimeZone = isset(
$arParams[
'USE_TIME_ZONE']) &&
$arParams[
'USE_TIME_ZONE'] ==
'N'?
false:
true;
643 if (is_array($chatId))
645 foreach ($chatId as
$val)
646 $arChatId[] = intval(
$val);
650 $arChatId[] = intval($chatId);
652 if (empty($arChatId))
658 if (
$DB->type ==
"MSSQL")
660 $sqlLimit =
" AND M.DATE_CREATE > dateadd(day, -".$limit.
", getdate())";
664 $sqlLimit =
" AND M.DATE_CREATE > SYSDATE-".$limit;
670 $sqlLimit =
" AND M.DATE_CREATE > ". $helper->addDaysToDateTime(-1 * $limit);
674 CTimeZone::Disable();
681 ".$DB->DatetimeToTimestampFunction(
'M.DATE_CREATE').
" as DATE_CREATE,
683 C.TITLE as CHAT_TITLE,
684 C.COLOR as CHAT_COLOR,
685 C.ENTITY_TYPE as CHAT_ENTITY_TYPE,
686 C.ENTITY_DATA_1 as CHAT_ENTITY_DATA_1,
687 C.ENTITY_DATA_2 as CHAT_ENTITY_DATA_2,
688 C.ENTITY_DATA_3 as CHAT_ENTITY_DATA_3,
689 ".
$DB->DatetimeToTimestampFunction(
'C.DATE_CREATE').
" as CHAT_DATE_CREATE,
693 INNER JOIN b_im_chat C ON C.ID = M.CHAT_ID AND C.LAST_MESSAGE_ID = M.ID
694 LEFT JOIN b_im_relation R ON R.CHAT_ID = M.CHAT_ID AND R.USER_ID = ".$fromUserId.
"
696 M.ID = C.LAST_MESSAGE_ID
697 AND M.CHAT_ID IN (".implode(
",",$arChatId).
")
703 $arMessages = Array();
704 $enableOpenChat = CIMMessenger::CheckEnableOpenChat();
712 if (!$enableOpenChat)
721 else if (intval(
$arRes[
'RID']) <= 0)
728 $arMessages[
$arRes[
'CHAT_ID']] = Array(
730 'senderId' =>
$arRes[
'AUTHOR_ID'],
731 'recipientId' =>
$arRes[
'CHAT_ID'],
736 'messageType' =>
$arRes[
"CHAT_TYPE"],
755 CTimeZone::Disable();
763 LEFT JOIN b_user U ON U.ID = R.USER_ID
764 WHERE R.CHAT_ID = ".$ID.
" ".(
$userId>0?
"AND R.USER_ID = ".$userId:
"");
794 $arResult[
'COUNTER'] = $readService->getCounterService()->getByChatWithOverflow(
$ID);
795 $lastRead = $readService->getViewedService()->getDateViewedByMessageId(
$arResult[
'LAST_ID']);
796 $arResult[
'LAST_READ'] = isset($lastRead) ? $lastRead->format(
'Y-m-d H:i:s') :
null;
801 $counters = $readService->getCounterService()->getByChatForEachUsers(
$ID, $userIds);
802 $lastIdInChat = $readService->getLastMessageIdInChat(
$ID);
803 $lastReads = $readService->getViewedService()->getDateViewedByMessageIdForEachUser($lastIdInChat, $userIds);
807 $arResult[$id][
'LAST_READ'] = isset($lastReads[$id]) ? $lastReads[$id]->format(
'Y-m-d H:i:s') :
null;
823 $favoriteChatResult = \Bitrix\IM\V2\Chat\FavoriteChat::find([
'TO_USER_ID' =>
$userId]);
824 if (!$favoriteChatResult->hasResult())
827 'TYPE' => \
Bitrix\
Im\
V2\Chat::IM_TYPE_PRIVATE,
828 'ENTITY_TYPE' => \
Bitrix\
Im\
V2\Chat::ENTITY_TYPE_FAVORITE,
831 'MESSAGE' =>
GetMessage(
'IM_PERSONAL_DESCRIPTION')
834 return $favoriteChatResult->getResult()[
'CHAT_ID'];
837 return $favoriteChatResult->getResult()[
'ID'];
851 $fromUserId = intval($fromUserId);
852 $toUserId = intval($toUserId);
860 INNER JOIN b_im_relation RT on RF.CHAT_ID = RT.CHAT_ID
862 RF.USER_ID = ".$fromUserId.
"
863 and RT.USER_ID = ".$toUserId.
"
895 return \Bitrix\Im\V2\Chat\GeneralChat::getAutoMessageStatus((
string)
$type);
906 return $generalChat->hasManageMessagesAccess(
$userId);
909 $generalChatId = \COption::GetOptionString(
'im',
'general_chat_id');
913 return $generalChat->hasManageMessagesAccess(
$userId);
924 $prevAllow = COption::GetOptionString(
"im",
"allow_send_to_general_chat_all");
925 $prevCodes = COption::GetOptionString(
"im",
"allow_send_to_general_chat_rights");
936 if (is_array($allowCodes) &&
count($allowCodes) > 0)
938 $codes = implode(
",", $allowCodes);
945 COption::SetOptionString(
"im",
"allow_send_to_general_chat_all", $allow);
946 COption::SetOptionString(
"im",
"allow_send_to_general_chat_rights", $codes);
948 if ($prevAllow != $allow || $prevCodes != $codes)
950 if (CModule::IncludeModule(
'pull'))
952 CPullStack::AddShared(Array(
954 'command' =>
'generalChatAccess',
956 "status" => $prevAllow ==
'Y' && $allow ==
'N'?
'blocked':
'allowed'
975 return $generalChat->canJoinGeneralChat((
int)
$userId);
1000 $arFields[
'TO_CHAT_ID'] = self::GetGeneralChatId();
1014 LEFT JOIN b_im_alias A ON A.ENTITY_ID = C.ID AND A.ENTITY_TYPE = C.ENTITY_TYPE
1015 LEFT JOIN b_im_relation R1 ON C.ID = R1.CHAT_ID
1017 $groupTypes = self::implodeTypesForQuery(self::getGroupTypes());
1021 $from .=
" AND C.TYPE IN ({$groupTypes})";
1024 $innerJoin = $whereUser =
"";
1030 $innerJoin =
"INNER JOIN b_im_relation R2 ON R2.CHAT_ID = C.ID";
1031 $whereGeneral =
"WHERE R2.USER_ID = ".intval(
$arParams[
'USER_ID']);
1053 $innerJoin =
"LEFT JOIN b_im_relation R2 ON R2.CHAT_ID = C.ID AND R2.USER_ID = ".intval(
$arParams[
'USER_ID']);
1055 $whereGeneral =
"WHERE C.ID IN (".implode(
',',
$arFilter[
'ID']).
") ";
1063 C.PARENT_ID as CHAT_PARENT_ID,
1064 C.PARENT_MID as CHAT_PARENT_MID,
1065 C.TITLE as CHAT_TITLE,
1066 C.CALL_TYPE as CHAT_CALL_TYPE,
1067 C.AUTHOR_ID as CHAT_OWNER_ID,
1068 C.CALL_NUMBER as CHAT_CALL_NUMBER,
1069 C.EXTRANET as CHAT_EXTRANET,
1070 C.COLOR as CHAT_COLOR,
1071 C.TYPE as CHAT_TYPE,
1074 C.ENTITY_DATA_1 as ENTITY_DATA_1,
1075 C.ENTITY_DATA_2 as ENTITY_DATA_2,
1076 C.ENTITY_DATA_3 as ENTITY_DATA_3,
1077 C.MESSAGE_COUNT as CHAT_MESSAGE_COUNT,
1079 C.MANAGE_USERS_DELETE,
1084 ".$DB->DatetimeToTimestampFunction(
'C.DATE_CREATE').
" as CHAT_DATE_CREATE,
1086 R1.NOTIFY_BLOCK as RELATION_NOTIFY_BLOCK,
1087 R1.USER_ID as RELATION_USER_ID,
1089 R1.MANAGER as RELATION_MANAGER
1090 ".(isset(
$arParams[
'USER_ID'])?
", R2.ID as RID":
"").
"
1099 $multidialogChats = [];
1101 $arUserInChat = Array();
1102 $arUserCallStatus = Array();
1103 $arUserChatBlockStatus = Array();
1104 $arManagerList = Array();
1105 $enableOpenChat = CIMMessenger::CheckEnableOpenChat();
1117 if (!$enableOpenChat)
1126 else if (intval(
$arRes[
'RID']) <= 0)
1130 $userCodeParts = \Bitrix\ImOpenLines\Session\Common::parseUserCode(
$arRes[
'ENTITY_ID']);
1131 if(!\
Bitrix\ImOpenLines\Config::canJoin($userCodeParts[
'CONFIG_ID']))
1143 if (!isset($arChat[
$arRes[
"CHAT_ID"]]))
1145 $avatar =
'/bitrix/js/im/images/blank.gif';
1146 if (intval(
$arRes[
"AVATAR"]) > 0)
1148 $avatar = self::GetAvatarImage(
$arRes[
"AVATAR"],
$arParams[
'PHOTO_SIZE']);
1153 if (
$arRes[
"ENTITY_TYPE"] ==
'LINES')
1155 $fieldData = explode(
"|",
$arRes[
'ENTITY_DATA_1']);
1156 if ($fieldData[5] > 0)
1158 $arLines[
$arRes[
"CHAT_ID"]] = $fieldData[5];
1162 $linesChatIds[] = (int)
$arRes[
'CHAT_ID'];
1167 if (in_array(
$arRes[
"ENTITY_TYPE"], [\
Bitrix\ImBot\
Bot\Support24::CHAT_ENTITY_TYPE, \
Bitrix\ImBot\
Bot\Network::CHAT_ENTITY_TYPE],
true))
1169 $multidialogChats[
$arRes[
'CHAT_ID']] = [
1170 'type' =>
$arRes[
'ENTITY_TYPE'],
1171 'botId' => (int)
$arRes[
'CHAT_OWNER_ID'],
1175 else if ($generalChatId ==
$arRes[
'CHAT_ID'])
1177 $arRes[
"ENTITY_TYPE"] =
'GENERAL';
1181 if (
$arRes[
'ALIAS_NAME'])
1184 'code' =>
$arRes[
'ALIAS_NAME'],
1191 $arChat[
$arRes[
"CHAT_ID"]] = Array(
1192 'id' =>
$arRes[
"CHAT_ID"],
1193 'parent_chat_id' => (
int)(
$arRes[
'CHAT_PARENT_ID'] ?? 0),
1194 'parent_message_id' => (
int)(
$arRes[
'CHAT_PARENT_MID'] ?? 0),
1196 'owner' =>
$arRes[
"CHAT_OWNER_ID"],
1198 'extranet' =>
$arRes[
"CHAT_EXTRANET"] ==
""?
"": (
$arRes[
"CHAT_EXTRANET"] ==
"Y"?
true:
false),
1199 'avatar' => $avatar,
1200 'call' => trim(
$arRes[
"CHAT_CALL_TYPE"]),
1201 'call_number' => trim(
$arRes[
"CHAT_CALL_NUMBER"]),
1202 'entity_type' => trim(
$arRes[
"ENTITY_TYPE"]),
1203 'entity_id' => trim(
$arRes[
"ENTITY_ID"]),
1204 'entity_data_1' => trim(
$arRes[
"ENTITY_DATA_1"]),
1205 'entity_data_2' => trim(
$arRes[
"ENTITY_DATA_2"]),
1206 'entity_data_3' => trim(
$arRes[
"ENTITY_DATA_3"]),
1207 'message_count' => (
int)(
$arRes[
'CHAT_MESSAGE_COUNT'] ?? 0),
1208 'public' => $publicOption,
1209 'mute_list' =>
array(),
1210 'manager_list' =>
array(),
1211 'date_create' => $dateCreate,
1212 'type' => $chatType,
1213 'entity_link' => IM\
V2\
Chat\EntityLink::getInstance(self::initChatByArray(
$arRes))->toRestFormat(),
1215 'manage_users_add' => mb_strtolower(
$arRes[
'MANAGE_USERS_ADD']),
1216 'manage_users_delete' => mb_strtolower(
$arRes[
'MANAGE_USERS_DELETE']),
1217 'manage_ui' => mb_strtolower(
$arRes[
'MANAGE_UI']),
1218 'manage_settings' => mb_strtolower(
$arRes[
'MANAGE_SETTINGS']),
1219 'manage_messages' => mb_strtolower(
$arRes[
'CAN_POST']),
1220 'can_post' => mb_strtolower(
$arRes[
'CAN_POST']),
1224 'message_type' =>
$arRes[
"CHAT_TYPE"],
1227 $arUserInChat[
$arRes[
"CHAT_ID"]] = [];
1228 $arUserChatBlockStatus[
$arRes[
"CHAT_ID"]] = [];
1229 $arUserCallStatus[
$arRes[
"CHAT_ID"]] = [];
1230 $arManagerList[
$arRes[
"CHAT_ID"]] = [];
1232 if (isset(
$arRes[
'RELATION_USER_ID']))
1234 $arRes[
"RELATION_USER_ID"] = (int)
$arRes[
"RELATION_USER_ID"];
1235 $arUserInChat[
$arRes[
"CHAT_ID"]][] =
$arRes[
"RELATION_USER_ID"];
1236 $arUserChatBlockStatus[
$arRes[
"CHAT_ID"]][
$arRes[
"RELATION_USER_ID"]] =
$arRes[
"RELATION_NOTIFY_BLOCK"] ==
'Y';
1237 $arUserCallStatus[
$arRes[
"CHAT_ID"]][
$arRes[
"RELATION_USER_ID"]] = trim(
$arRes[
"CALL_STATUS"]);
1238 $arChat[
$arRes[
"CHAT_ID"]][
'mute_list'] = $arUserChatBlockStatus[
$arRes[
"CHAT_ID"]];
1239 if (
$arRes[
"RELATION_MANAGER"] ==
'Y')
1241 $arManagerList[
$arRes[
"CHAT_ID"]][] = (int)
$arRes[
"RELATION_USER_ID"];
1243 $arChat[
$arRes[
"CHAT_ID"]][
'manager_list'] = $arManagerList[
$arRes[
"CHAT_ID"]] ??
null;
1247 foreach ($arUserInChat as $chatId => $userIds)
1249 $arUserInChat[$chatId] = array_values(array_unique($userIds));
1251 if (isset($multidialogChats[$chatId]) &&
count($arUserInChat[$chatId]) == 2)
1253 foreach ($arUserInChat[$chatId] as
$userId)
1255 if (
$userId != $multidialogChats[$chatId][
'botId'])
1257 $multidialog = self::getMultidialog(
1258 $multidialogChats[$chatId][
'type'],
1261 $multidialogChats[$chatId][
'botId']
1266 $multidialogs[$chatId] = $multidialog;
1276 if (CModule::IncludeModule(
'imopenlines'))
1278 if (!empty($arLines))
1280 $orm = SessionTable::getList(Array(
1292 '=ID' => array_values($arLines)
1295 while($row = $orm->fetch())
1297 $statusGroup =
null;
1299 if (isset($row[
'STATUS']))
1301 $statusGroup = Bitrix\ImOpenLines\V2\Status\StatusGroup::getFromNumericalCode((
int)$row[
'STATUS']);
1304 $lines[$row[
'CHAT_ID']] = Array(
1305 'id' => (
int)$row[
'ID'],
1306 'status' => (
int)$row[
'STATUS'],
1307 'date_create' => $row[
'DATE_CREATE'],
1308 'statusGroup' => $statusGroup->name,
1309 'queueId' => $row[
'CONFIG_ID'],
1310 'pinned' => $row[
'PAUSE'] ===
'Y',
1311 'isClosed' => $row[
'CLOSED'] ===
'Y',
1312 'operatorId' => (
int)$row[
'OPERATOR_ID'],
1317 if (!empty($linesChatIds))
1319 $orm = SessionTable::getList([
1324 '=CHAT_ID' => array_values($linesChatIds),
1326 'group' => [
'CHAT_ID'],
1331 while($row = $orm->fetch())
1333 $ids[] = $row[
'ID'];
1336 $orm = SessionTable::getList([
1352 while($row = $orm->fetch())
1354 $statusGroup =
null;
1356 if (isset($row[
'STATUS']))
1358 $statusGroup = Bitrix\ImOpenLines\V2\Status\StatusGroup::getFromNumericalCode((
int)$row[
'STATUS']);
1361 $lines[$row[
'CHAT_ID']] = [
1362 'id' => (int)$row[
'ID'],
1363 'status' => (
int)$row[
'STATUS'],
1364 'date_create' => $row[
'DATE_CREATE'],
1365 'statusGroup' => $statusGroup->name,
1366 'queueId' => $row[
'CONFIG_ID'],
1367 'pinned' => $row[
'PAUSE'] ===
'Y',
1368 'isClosed' => $row[
'CLOSED'] ===
'Y',
1369 'operatorId' => (int)$row[
'OPERATOR_ID'],
1378 'multidialogs' => $multidialogs,
1379 'userInChat' => $arUserInChat,
1380 'userCallStatus' => $arUserCallStatus,
1381 'userChatBlockStatus' => $arUserChatBlockStatus
1387 public static function getMultidialog(
$type, $chatId,
$userId, $botId)
1393 \
Bitrix\
Main\Loader::includeModule(
'bitrix24')
1394 && \
Bitrix\ImBot\
Bot\Support24::isEnabled()
1397 $classSupport = \Bitrix\ImBot\Bot\Support24::class;
1399 elseif (\Bitrix\ImBot\Bot\SupportBox::isEnabled())
1401 $classSupport = \Bitrix\ImBot\Bot\SupportBox::class;
1404 $multidialog = $classSupport::getMultidialog((
int)$chatId, (
int)$botId,
$userId);
1406 elseif(
$type === \Bitrix\ImBot\Bot\Network::CHAT_ENTITY_TYPE)
1408 $multidialog = \Bitrix\ImBot\Bot\Network::getMultidialog((
int)$chatId, (
int)$botId,
$userId);
1411 return $multidialog;
1423 C.TITLE as CHAT_TITLE,
1424 C.CALL_TYPE as CHAT_CALL_TYPE,
1425 C.AUTHOR_ID as CHAT_OWNER_ID,
1426 C.CALL_NUMBER as CHAT_CALL_NUMBER,
1427 C.EXTRANET as CHAT_EXTRANET,
1428 C.COLOR as CHAT_COLOR,
1429 C.TYPE as CHAT_TYPE,
1435 ".$DB->DatetimeToTimestampFunction(
'C.DATE_CREATE').
" as CHAT_DATE_CREATE,
1437 R2.NOTIFY_BLOCK as RELATION_NOTIFY_BLOCK,
1438 R2.USER_ID as RELATION_USER_ID,
1439 R2.USER_ID as RELATION_MANAGER,
1444 LEFT JOIN b_im_relation R2 ON R2.CHAT_ID = C.ID AND R2.USER_ID = ".(int)
$arParams[
'USER_ID'].
"
1447 AND EXISTS(SELECT R3.ID FROM b_im_relation R3 WHERE R3.CHAT_ID = C.ID LIMIT 1)
1451 $arUserInChat = Array();
1452 $arUserCallStatus = Array();
1453 $arUserChatBlockStatus = Array();
1454 $arManagerList = Array();
1468 if (!isset($arChat[
$arRes[
"CHAT_ID"]]))
1470 $avatar =
'/bitrix/js/im/images/blank.gif';
1471 if (intval(
$arRes[
"AVATAR"]) > 0)
1473 $avatar = self::GetAvatarImage(
$arRes[
"AVATAR"],
$arParams[
'PHOTO_SIZE']);
1478 if ($generalChatId ==
$arRes[
'CHAT_ID'])
1480 $arRes[
"ENTITY_TYPE"] =
'GENERAL';
1483 $arChat[
$arRes[
"CHAT_ID"]] = Array(
1484 'id' =>
$arRes[
"CHAT_ID"],
1486 'owner' =>
$arRes[
"CHAT_OWNER_ID"],
1488 'extranet' =>
$arRes[
"CHAT_EXTRANET"] ==
""?
"": (
$arRes[
"CHAT_EXTRANET"] ==
"Y"?
true:
false),
1489 'avatar' => $avatar,
1490 'call' => trim(
$arRes[
"CHAT_CALL_TYPE"]),
1491 'call_number' => trim(
$arRes[
"CHAT_CALL_NUMBER"]),
1492 'entity_type' => trim(
$arRes[
"ENTITY_TYPE"]),
1493 'entity_data_1' => trim(
$arRes[
"ENTITY_DATA_1"]),
1494 'entity_data_2' => trim(
$arRes[
"ENTITY_DATA_2"]),
1495 'entity_data_3' => trim(
$arRes[
"ENTITY_DATA_3"]),
1496 'mute_list' =>
array(),
1497 'manager_list' =>
array(),
1499 'entity_id' => trim(
$arRes[
"ENTITY_ID"]),
1500 'type' => $chatType,
1501 'message_type' =>
$arRes[
"CHAT_TYPE"],
1505 $arUserChatBlockStatus[
$arRes[
"CHAT_ID"]][
$arRes[
"RELATION_USER_ID"]] =
$arRes[
'RELATION_NOTIFY_BLOCK'] ==
'Y';
1506 $arUserInChat[
$arRes[
"CHAT_ID"]][] =
$arRes[
"RELATION_USER_ID"];
1507 $arUserCallStatus[
$arRes[
"CHAT_ID"]][
$arRes[
"RELATION_USER_ID"]] = trim(
$arRes[
"CALL_STATUS"] ??
'');
1508 $arChat[
$arRes[
"CHAT_ID"]][
'mute_list'] = $arUserChatBlockStatus[
$arRes[
"CHAT_ID"]];
1510 if (
$arRes[
"RELATION_MANAGER"] ==
'Y')
1512 $arManagerList[
$arRes[
"CHAT_ID"]][] = (int)
$arRes[
"RELATION_USER_ID"];
1514 $arChat[
$arRes[
"CHAT_ID"]][
'manager_list'] = $arManagerList[
$arRes[
"CHAT_ID"]] ??
null;
1519 'userInChat' => $arUserInChat,
1520 'userCallStatus' => $arUserCallStatus,
1521 'userChatBlockStatus' => $arUserChatBlockStatus
1531 $chatId = intval($chatId);
1541 && $chat->getAuthorId() == 0
1549 $startId = $readService->getLastIdByChatId($chatId);
1551 $viewedMessages = [];
1555 $message = new \Bitrix\Im\V2\Message();
1557 $readResult = $readService->readTo(
$message);
1558 $counter = $readResult->getResult()[
'COUNTER'];
1559 $viewedMessages = $readResult->getResult()[
'VIEWED_MESSAGES'];
1563 $counter = $readService->readAllInChat($chatId)->getResult()[
'COUNTER'];
1573 $endId = (int)($relation[
'LAST_ID'] ?? 0);
1579 if (CModule::IncludeModule(
"pull"))
1581 CIMNotify::DeleteBySubTag(
"IM_MESS_".$chatId.
'_'.$this->user_id,
false,
false);
1582 CPushManager::DeleteFromQueueBySubTag($this->user_id,
'IM_MESS');
1585 $chat->getEntityType() ==
'LIVECHAT'
1590 'module_id' =>
'im',
1591 'command' =>
'readMessageChat',
1593 'dialogId' =>
'chat'.$chatId,
1594 'chatId' => (
int)$chatId,
1595 'parentChatId' => $chat->getParentChatId(),
1596 'type' => $chat->getExtendedType(),
1599 'muted' => $relation[
'NOTIFY_BLOCK'] ===
'Y',
1600 'unread' =>
Im\
Recent::isUnread($this->user_id, $relation[
'MESSAGE_TYPE'],
'chat'.$chatId),
1602 'viewedMessages' => $viewedMessages,
1603 'counterType' => $chat->getCounterType()->value,
1604 'recentConfig' => $chat->getRecentConfig()->toPullFormat(),
1610 $arRelation = self::GetRelationById($chatId,
false,
true,
false);
1611 unset($arRelation[$this->user_id]);
1613 $pushMessage = Array(
1614 'module_id' =>
'im',
1615 'command' =>
'readMessageChatOpponent',
1618 'dialogId' =>
'chat'.$chatId,
1619 'chatId' => (
int)$chatId,
1620 'userId' => (
int)$this->user_id,
1623 'date' => date(
'c', time()),
1624 'viewedMessages' => $viewedMessages,
1625 'chatMessageStatus' => $relation[
'CHAT_MESSAGE_STATUS'],
1629 if ($chat->getEntityType() ==
'LINES')
1631 foreach ($arRelation as $rel)
1633 if ($rel[
"EXTERNAL_AUTH_ID"] ==
'imconnector')
1635 unset($arRelation[$rel[
"USER_ID"]]);
1639 if (
count($arRelation) < 200)
1642 if ($chat->needToSendPublicPull())
1644 CPullWatch::AddToStack(
'IM_PUBLIC_'.$chatId, $pushMessage);
1652 'CHAT_ID' => $chat->getChatId(),
1653 'CHAT_ENTITY_TYPE' => $chat->getEntityType(),
1654 'CHAT_ENTITY_ID' => $chat->getEntityId(),
1655 'START_ID' => $startId,
1657 'COUNT' => $relation[
'COUNTER'],
1658 'USER_ID' => $this->user_id,
1659 'BY_EVENT' => $byEvent
1664 'DIALOG_ID' =>
'chat'.$chatId,
1665 'CHAT_ID' => (
int)$chatId,
1666 'LAST_ID' => $endId,
1667 'COUNTER' => (
int)$relation[
'COUNTER']
1673 $chatId = intval($chatId);
1685 $endId = $readService->getLastMessageIdInChat($chatId);
1691 "UPDATE b_im_recent SET DATE_UPDATE = NOW() WHERE USER_ID = ".$this->user_id.
" AND ITEM_CID = ".intval($chatId)
1696 if (CModule::IncludeModule(
"pull"))
1699 'module_id' =>
'im',
1700 'command' =>
'unreadMessageChat',
1702 'dialogId' =>
'chat'.$chatId,
1703 'chatId' => (
int)$chatId,
1706 'counter' => (
int)$relation[
'COUNTER'],
1707 'muted' => $relation[
'NOTIFY_BLOCK'] ===
'Y',
1710 'unread' =>
Im\
Recent::isUnread($this->user_id, $relation[
'MESSAGE_TYPE'],
'chat'.$chatId),
1712 'counterType' => $chat->getCounterType()->value,
1713 'recentConfig' => $chat->getRecentConfig()->toPullFormat(),
1715 'push' => Array(
'badge' =>
'Y'),
1719 $arRelation = self::GetRelationById($chatId,
false,
true,
false);
1720 unset($arRelation[$this->user_id]);
1722 $pushMessage = Array(
1723 'module_id' =>
'im',
1724 'command' =>
'unreadMessageChatOpponent',
1727 'dialogId' =>
'chat'.$chatId,
1728 'chatId' => (
int)$chatId,
1729 'userId' => (
int)$this->user_id,
1730 'chatMessageStatus' => $relation[
'CHAT_MESSAGE_STATUS'],
1732 'lastMessageStatuses' => $lastMessageStatuses,
1736 if ($chat->getEntityType() ==
'LINES')
1738 foreach ($arRelation as $rel)
1740 if ($rel[
"EXTERNAL_AUTH_ID"] ==
'imconnector')
1742 unset($arRelation[$rel[
"USER_ID"]]);
1746 $viewsByGroups = $chat->getLastMessageViewsByGroups();
1747 $usersForPush = array_keys($arRelation);
1748 $viewers = array_intersect($usersForPush, $viewsByGroups[
'USERS'] ?? []);
1749 $notViewers = array_diff($usersForPush, $viewers);
1750 $pushMessage[
'params'][
'lastMessageViews'] =
Im\Common::toJson($viewsByGroups[
'FOR_VIEWERS'] ?? []);
1752 $pushMessage[
'params'][
'lastMessageViews'] =
Im\Common::toJson($viewsByGroups[
'FOR_NOT_VIEWERS'] ?? []);
1784 $bSpeedCheck = isset(
$arParams[
'SPEED_CHECK']) &&
$arParams[
'SPEED_CHECK'] ==
'N'?
false:
true;
1786 $loadDepartment = isset(
$arParams[
'LOAD_DEPARTMENT']) &&
$arParams[
'LOAD_DEPARTMENT'] ==
'N'?
false:
true;
1787 $bTimeZone = isset(
$arParams[
'USE_TIME_ZONE']) &&
$arParams[
'USE_TIME_ZONE'] ==
'N'?
false:
true;
1788 $bGroupByChat = isset(
$arParams[
'GROUP_BY_CHAT']) &&
$arParams[
'GROUP_BY_CHAT'] ==
'Y'?
true:
false;
1789 $bUserLoad = isset(
$arParams[
'USER_LOAD']) &&
$arParams[
'USER_LOAD'] ==
'N'?
false:
true;
1790 $bFileLoad = isset(
$arParams[
'FILE_LOAD']) &&
$arParams[
'FILE_LOAD'] ==
'N'?
false:
true;
1791 $arExistUserData = isset(
$arParams[
'EXIST_USER_DATA']) && is_array(
$arParams[
'EXIST_USER_DATA'])?
$arParams[
'EXIST_USER_DATA']: Array();
1792 $messageType = isset(
$arParams[
'MESSAGE_TYPE']) && in_array(
$arParams[
'MESSAGE_TYPE'], self::getGroupTypes())?
$arParams[
'MESSAGE_TYPE']:
'ALL';
1794 $arMessages = Array();
1795 $arUnreadMessage = Array();
1796 $arUsersMessage = Array();
1799 'message' => Array(),
1800 'unreadMessage' => Array(),
1801 'usersMessage' => Array(),
1803 'userInGroup' => Array(),
1805 'countMessage' => 0,
1807 'userChatBlockStatus' => Array(),
1808 'userInChat' => Array(),
1811 $bLoadMessage = $bSpeedCheck? CIMMessenger::SpeedFileExists($this->user_id,
IM_SPEED_GROUP):
false;
1813 if (!$bLoadMessage || ($bLoadMessage && intval(
$count) > 0))
1846 $arMessageId = Array();
1847 $arMessageChatId = Array();
1848 $arLastMessage = Array();
1852 $arPrepareResult = Array();
1853 $arFilteredResult = Array();
1856 CTimeZone::Disable();
1857 $groupTypes = self::implodeTypesForQuery(self::getGroupTypes());
1863 ".$DB->DatetimeToTimestampFunction(
'M.DATE_CREATE').
" as DATE_CREATE,
1865 R1.MESSAGE_TYPE as MESSAGE_TYPE
1867 INNER JOIN b_im_relation R1 ON M.CHAT_ID = R1.CHAT_ID AND R1.USER_ID != M.AUTHOR_ID
1868 INNER JOIN b_im_message_unread MU ON M.ID = MU.MESSAGE_ID AND MU.USER_ID = " . $this->user_id .
"
1870 R1.USER_ID = ".$this->user_id.
"
1871 ".($messageType ==
'ALL'?
"AND R1.MESSAGE_TYPE IN ({$groupTypes})":
"AND R1.MESSAGE_TYPE = '".$messageType.
"'").
"
1874 CTimeZone::Enable();
1876 $strSql =
$DB->TopSql($strSql, 1000);
1884 foreach ($arPrepareResult as $chatId =>
$arRes)
1886 if (
count($arPrepareResult[$chatId]) > 100)
1888 $arPrepareResult[$chatId] = array_slice(
$arRes, -100, 100);
1890 $arFilteredResult = array_merge($arFilteredResult, $arPrepareResult[$chatId]);
1892 unset($arPrepareResult);
1894 foreach ($arFilteredResult as
$arRes)
1896 $arUsers[] =
$arRes[
'AUTHOR_ID'];
1898 $arMessages[
$arRes[
'ID']] = Array(
1900 'chatId' =>
$arRes[
'CHAT_ID'],
1901 'senderId' =>
$arRes[
'AUTHOR_ID'],
1902 'recipientId' =>
$arRes[
'CHAT_ID'],
1904 'text' =>
$arRes[
'MESSAGE'],
1905 'messageType' =>
$arRes[
'MESSAGE_TYPE'],
1909 $arMessages[
$arRes[
'ID']][
'conversation'] =
$arRes[
'CHAT_ID'];
1910 $arMessages[
$arRes[
'ID']][
'unread'] = $this->user_id !=
$arRes[
'AUTHOR_ID']?
'Y':
'N';
1920 if (!isset($arLastMessage[
$arRes[
"CHAT_ID"]]) || $arLastMessage[
$arRes[
"CHAT_ID"]] <
$arRes[
"ID"])
1924 $arMessageId[] =
$arRes[
'ID'];
1927 $params = CIMMessageParam::Get($arMessageId);
1931 foreach ($arMessageChatId as $chatId =>
$messages)
1942 $files[$fileId] = $fileId;
1948 foreach ($arMessageFiles as
$key => $value)
1962 if (!empty($arMessages))
1964 foreach ($arMark as $chatId => $lastSendId)
1970 foreach ($arMessages as
$key => $value)
1972 $arMessages[$arLastMessage[$value[
'conversation']]][
'counter']++;
1973 if ($arLastMessage[$value[
'conversation']] != $value[
'id'])
1975 unset($arMessages[
$key]);
1982 $arUsersMessage[$value[
'conversation']][] = $value[
'id'];
1984 if ($value[
'params'][
'NOTIFY'] ===
'N' || is_array($value[
'params'][
'NOTIFY']) && !in_array($this->user_id, $value[
'params'][
'NOTIFY']))
1988 else if ($value[
'unread'] ==
'Y')
1990 $arUnreadMessage[$value[
'conversation']][] = $value[
'id'];
1993 unset($arMessages[
$key][
'conversation']);
1994 unset($arMessages[
$key][
'unread']);
2000 foreach ($arMessages as
$key => $value)
2005 if ($value[
'params'][
'NOTIFY'] ===
'N' || is_array($value[
'params'][
'NOTIFY']) && !in_array($this->user_id, $value[
'params'][
'NOTIFY']))
2009 else if ($this->user_id != $value[
'senderId'])
2011 $arUnreadMessage[$value[
'chatId']][] = $value[
'id'];
2017 $arResult[
'unreadMessage'] = $arUnreadMessage;
2018 $arResult[
'usersMessage'] = $arUsersMessage;
2020 $arChat = self::GetChatData(
array(
2024 if (!empty($arChat))
2028 $arResult[
'userChatBlockStatus'] = $arChat[
'userChatBlockStatus'];
2029 $arResult[
'userInChat'] = $arChat[
'userInChat'];
2031 foreach ($arChat[
'userInChat'] as $value)
2032 $arUsers[] = $value;
2035 if ($bUserLoad && !empty($arUsers))
2037 $arUserData = CIMContactList::GetUserData(Array(
'ID' => array_diff(array_unique($arUsers), $arExistUserData),
'DEPARTMENT' => ($loadDepartment?
'Y':
'N')));
2038 $arResult[
'users'] = $arUserData[
'users'];
2039 $arResult[
'userInGroup'] = $arUserData[
'userInGroup'];
2048 $arResult[
'countMessage'] = CIMMessenger::GetMessageCounter($this->user_id,
$arResult);
2055 $arResult[
'countMessage'] = CIMMessenger::GetMessageCounter($this->user_id,
$arResult);
2063 $chatId = intval($chatId);
2066 $chat = IM\Model\ChatTable::getById($chatId)->fetch();
2072 if ($checkPermission && $chat[
'AUTHOR_ID'] != $this->user_id)
2077 if (
$userId == $chat[
'AUTHOR_ID'])
2082 $arRelation = self::GetRelationById($chatId,
false,
true,
false);
2083 if (!isset($arRelation[
$userId]))
2088 if ($this->user_id !== 0 && !self::canDo($chat, $arRelation, IM\
V2\
Permission\Action::ChangeOwner))
2093 IM\Model\ChatTable::update($chatId, Array(
'AUTHOR_ID' =>
$userId));
2094 IM\Model\RelationTable::update($arRelation[
$userId][
'ID'], Array(
'MANAGER' =>
'Y'));
2095 if (isset($arRelation[$chat[
'AUTHOR_ID']]))
2097 IM\Model\RelationTable::update($arRelation[$chat[
'AUTHOR_ID']][
'ID'], Array(
'MANAGER' =>
'N'));
2100 if (CModule::IncludeModule(
'pull'))
2103 'module_id' =>
'im',
2104 'command' =>
'chatOwner',
2106 'dialogId' =>
'chat'.$chatId,
2107 'chatId' => (
int)$chatId,
2119 $chatId = intval($chatId);
2120 $chat = Chat\GroupChat::getInstance($chatId);
2127 if ($this->user_id !== 0 && !$chat->canDo(IM\
V2\
Permission\Action::ChangeDescription))
2134 $arRelation = $chat->getRelations()->getUserIds();
2136 if (CModule::IncludeModule(
'pull'))
2139 'module_id' =>
'im',
2140 'command' =>
'chatDescription',
2142 'chatId' => $chatId,
2155 if (isset(
$params[
'ENTITY_TYPE']))
2156 $update[
'ENTITY_TYPE'] =
$params[
'ENTITY_TYPE'];
2158 if (isset(
$params[
'ENTITY_ID']))
2159 $update[
'ENTITY_ID'] =
$params[
'ENTITY_ID'];
2161 if (isset(
$params[
'ENTITY_DATA_1']))
2162 $update[
'ENTITY_DATA_1'] =
$params[
'ENTITY_DATA_1'];
2164 if (isset(
$params[
'ENTITY_DATA_2']))
2165 $update[
'ENTITY_DATA_2'] =
$params[
'ENTITY_DATA_2'];
2167 if (isset(
$params[
'ENTITY_DATA_3']))
2168 $update[
'ENTITY_DATA_3'] =
$params[
'ENTITY_DATA_3'];
2170 \Bitrix\Im\Model\ChatTable::update($chatId, $update);
2172 if (CModule::IncludeModule(
'pull'))
2174 if (isset($update[
'NAME']))
2179 $arRelation = self::GetRelationById($chatId,
false,
true,
false);
2181 'module_id' =>
'im',
2182 'command' =>
'chatUpdateParams',
2184 'dialogId' =>
'chat'.$chatId,
2185 'chatId' => (
int)$chatId,
2186 'params' => array_change_key_case($update)
2202 $chatId = (int)$chatId;
2212 && $this->user_id !== 0
2213 && $chat->getAuthorId() !== $this->user_id
2214 && !$chat->canDo(IM\
V2\
Permission\Action::ChangeManagers))
2219 $chat->changeManagersByMap($users);
2227 $chatId = intval($chatId);
2228 $color = mb_strtoupper($color);
2235 $groupTypes = self::implodeTypesForQuery(self::getGroupTypes());
2240 C.COLOR as CHAT_COLOR,
2241 C.AUTHOR_ID as CHAT_AUTHOR_ID,
2242 C.TYPE as CHAT_TYPE,
2243 C.ENTITY_TYPE as CHAT_ENTITY_TYPE,
2244 C.ENTITY_ID as CHAT_ENTITY_ID,
2247 C.MANAGE_USERS_DELETE,
2251 LEFT JOIN b_im_chat C
2254 R.USER_ID = ".$this->user_id.
"
2255 AND R.MESSAGE_TYPE IN ({$groupTypes})
2256 AND R.CHAT_ID = ".$chatId;
2261 if (
$arRes[
'CHAT_COLOR'] == $color)
2271 IM\Model\ChatTable::update($chatId,
array(
'COLOR' => $color));
2274 'CHAT_ID' => $chatId,
2275 'USER_ID' => $this->user_id,
2276 'MESSAGE_CODE' =>
'IM_CHAT_CHANGE_COLOR_',
2277 'MESSAGE_REPLACE' => Array(
'#CHAT_COLOR#' => IM\
Color::getName($color))
2280 if (
$arRes[
'CHAT_ENTITY_TYPE'] ==
'LINES')
2282 foreach (
$ar as $rel)
2284 if ($rel[
"EXTERNAL_AUTH_ID"] ==
'imconnector')
2286 unset(
$ar[$rel[
"USER_ID"]]);
2293 CIMContactList::CleanAllChatCache();
2297 foreach (
$ar as $rel)
2299 CIMContactList::CleanChatCache($rel[
'USER_ID']);
2302 if (CModule::IncludeModule(
"pull"))
2304 $arPushMessage = Array(
2305 'module_id' =>
'im',
2306 'command' =>
'chatChangeColor',
2309 'chatId' => $chatId,
2315 if (CIMMessenger::needToSendPublicPull(
$arRes[
'CHAT_TYPE']))
2317 CPullWatch::AddToStack(
'IM_PUBLIC_'.$chatId, $arPushMessage);
2333 $orm = \Bitrix\Im\Model\ChatTable::getById($chatId);
2334 $chat = $orm->fetch();
2340 $relation = self::GetRelationById($chatId,
false,
true,
false);
2342 if ($this->user_id !== 0 && !self::canDo($chat, $relation, IM\
V2\
Permission\Action::ChangeAvatar))
2349 $orm = \Bitrix\Main\FileTable::getById($fileId);
2350 $file = $orm->fetch();
2354 if ($file[
'HEIGHT'] <= 0 || $file[
'WIDTH'] <= 0)
2358 IM\Model\ChatTable::update($chatId, Array(
'AVATAR' => $fileId));
2360 if (CModule::IncludeModule(
'pull'))
2363 foreach ($relation as $rel)
2365 if ($rel[
"EXTERNAL_AUTH_ID"] !=
'imconnector')
2367 $users[$rel[
'USER_ID']] = $rel[
'USER_ID'];
2371 'module_id' =>
'im',
2372 'command' =>
'chatAvatar',
2374 'chatId' => $chatId,
2375 'avatar' => self::GetAvatarImage($fileId),
2384 public function Rename($chatId,
$title, $checkPermission =
true, $sendMessage =
true)
2387 $chatId = intval($chatId);
2390 if ($chatId <= 0 ||
$title ==
'')
2395 $groupTypes = self::implodeTypesForQuery(self::getGroupTypes());
2396 if ($checkPermission)
2401 C.TITLE as CHAT_TITLE,
2402 C.AUTHOR_ID as CHAT_AUTHOR_ID,
2403 C.TYPE as CHAT_TYPE,
2404 C.ENTITY_TYPE as CHAT_ENTITY_TYPE,
2405 C.ENTITY_ID as CHAT_ENTITY_ID,
2406 R.MANAGER as IS_MANAGER,
2409 C.MANAGE_USERS_DELETE,
2411 FROM b_im_relation R LEFT JOIN b_im_chat C ON R.CHAT_ID = C.ID
2413 R.USER_ID = ".$this->user_id.
"
2414 AND R.MESSAGE_TYPE IN ({$groupTypes})
2415 AND R.CHAT_ID = ".$chatId;
2422 C.TITLE as CHAT_TITLE,
2423 C.AUTHOR_ID as CHAT_AUTHOR_ID,
2424 C.TYPE as CHAT_TYPE,
2425 C.ENTITY_TYPE as CHAT_ENTITY_TYPE,
2426 C.ENTITY_ID as CHAT_ENTITY_ID,
2430 C.MANAGE_USERS_DELETE,
2435 AND C.TYPE IN ({$groupTypes})";
2442 if ($this->user_id !== 0 && $checkPermission && !self::canDo(
$arRes,
$ar, IM\
V2\
Permission\Action::Rename))
2452 if (
$arRes[
'CHAT_ENTITY_TYPE'] ===
'ANNOUNCEMENT' &&
$arRes[
'IS_MANAGER'] !==
'Y')
2459 IM\Model\ChatTable::update($chatId,
array(
'TITLE' =>
$title));
2463 if ($checkPermission)
2466 $arRes[
'CHAT_TYPE'] === Chat::IM_TYPE_CHANNEL
2467 ||
$arRes[
'CHAT_TYPE'] === Chat::IM_TYPE_OPEN_CHANNEL
2471 $messageCodeVersion =
'';
2476 $messageCodeVersion =
'_MSGVER_1';
2480 'CHAT_ID' => $chatId,
2481 'USER_ID' => $this->user_id,
2482 'MESSAGE_CODE' =>
"IM_{$type}_CHANGE_TITLE_",
2483 'MESSAGE_REPLACE' => Array(
'#CHAT_TITLE#' =>
$title),
2484 'MESSAGE_CODE_VERSION' => $messageCodeVersion,
2489 self::AddMessage(Array(
2490 "TO_CHAT_ID" => $chatId,
2491 "MESSAGE" =>
GetMessage(
"IM_CHAT_CHANGE_TITLE", Array(
'#CHAT_TITLE#' =>
$title)),
2493 "SKIP_USER_CHECK" =>
'Y',
2498 if (
$arRes[
'CHAT_ENTITY_TYPE'] ==
'LINES')
2500 foreach (
$ar as $rel)
2502 if ($rel[
"EXTERNAL_AUTH_ID"] ==
'imconnector')
2504 unset(
$ar[$rel[
"USER_ID"]]);
2511 CIMContactList::CleanAllChatCache();
2515 foreach (
$ar as $rel)
2517 CIMContactList::CleanChatCache($rel[
'USER_ID']);
2520 if (CModule::IncludeModule(
"pull"))
2522 $pushMessage = Array(
2523 'module_id' =>
'im',
2524 'command' =>
'chatRename',
2526 'chatId' => $chatId,
2532 if (CIMMessenger::needToSendPublicPull(
$arRes[
'CHAT_TYPE']))
2534 CPullWatch::AddToStack(
'IM_PUBLIC_'.$chatId, $pushMessage);
2536 if (
$arRes[
'CHAT_TYPE'] === Chat::IM_TYPE_OPEN_CHANNEL)
2577 $authorId = intval(
$arParams[
'AUTHOR_ID']);
2582 $authorId = intval(
$arParams[
'OWNER_ID']);
2596 if (!$chatResult->isSuccess() || !$chatResult->hasResult())
2608 if (
$type === IM\
V2\Chat::IM_TYPE_PRIVATE)
2611 "FROM_USER_ID" => $this->user_id,
2612 "TO_USER_ID" => $this->user_id,
2619 "TO_CHAT_ID" => $chatResult->getResult()[
'CHAT_ID'],
2620 "FROM_USER_ID" => $this->user_id,
2621 "SYSTEM" => $this->user_id ?
'N' :
'Y',
2627 $chat = $chatResult->getResult()[
'CHAT'];
2629 CIMContactList::CleanAllChatCache();
2631 return $chat->getChatId();
2643 $chatId = intval($chatId);
2646 $GLOBALS[
"APPLICATION"]->ThrowException(
GetMessage(
"IM_ERROR_EMPTY_CHAT_ID"),
"EMPTY_CHAT_ID");
2650 $orm = IM\Model\ChatTable::getById($chatId);
2651 if (!($chatData = $orm->fetch()))
2653 $GLOBALS[
"APPLICATION"]->ThrowException(
GetMessage(
"IM_ERROR_CHAT_NOT_EXISTS"),
"ERROR_CHAT_NOT_EXISTS");
2659 $GLOBALS[
"APPLICATION"]->ThrowException(
GetMessage(
"IM_ERROR_ACCESS_JOIN"),
"ACCESS_JOIN");
2665 $GLOBALS[
"APPLICATION"]->ThrowException(
GetMessage(
"IM_ERROR_ACCESS_JOIN"),
"ACCESS_JOIN");
2670 $chat->AddUser($chatId, $this->user_id);
2677 $chatId = intval($chatId);
2680 $GLOBALS[
"APPLICATION"]->ThrowException(
GetMessage(
"IM_ERROR_EMPTY_CHAT_ID"),
"EMPTY_CHAT_ID");
2687 $GLOBALS[
"APPLICATION"]->ThrowException(
GetMessage(
"IM_ERROR_EMPTY_CHAT_ID"),
"EMPTY_CHAT_ID");
2691 $CIMMessage =
new CIMMessage($this->user_id);
2695 $GLOBALS[
"APPLICATION"]->ThrowException(
GetMessage(
"IM_ERROR_ACCESS_JOIN"),
"ACCESS_JOIN");
2700 if (!isset($relations[$this->user_id]))
2703 $chat->AddUser($chatId, $this->user_id);
2709 public function AddUser($chatId,
$userId, $hideHistory =
null, $skipMessage =
false, $skipRecent =
false, $skipRelation =
false)
2711 $chatId = intval($chatId);
2714 $GLOBALS[
"APPLICATION"]->ThrowException(
GetMessage(
"IM_ERROR_EMPTY_CHAT_ID"),
"EMPTY_CHAT_ID");
2718 $arUserId = Array();
2721 $arUserId = \CIMContactList::PrepareUserIds(
$userId);
2727 if ($this->user_id > 0)
2729 $arUserId[$this->user_id] = $this->user_id;
2732 if (
count($arUserId) <= 0)
2734 $GLOBALS[
"APPLICATION"]->ThrowException(
GetMessage(
"IM_ERROR_EMPTY_USER_ID"),
"EMPTY_USER_ID");
2740 if ($this->user_id !== 0 && !$chat->canDo(IM\
V2\
Permission\Action::Extend))
2742 $GLOBALS[
"APPLICATION"]->ThrowException(
GetMessage(
"IM_CHAT_ACCESS_DENIED_EXTEND_USERS"),
"ACCESS_DENIED_EXTEND");
2747 $chat->addUsers($arUserId,
$config);
2754 return \Bitrix\Im\Chat::mute($chatId, $mute, $this->user_id);
2760 $checkPermission =
true,
2761 $skipMessage =
false,
2762 $skipRecent =
false,
2763 $withoutRead =
false,
2764 $additionalParams = []
2767 $chatId = (int)$chatId;
2770 if ($chatId <= 0 ||
$userId <= 0)
2772 $GLOBALS[
"APPLICATION"]->ThrowException(
GetMessage(
"IM_ERROR_EMPTY_USER_OR_CHAT"),
"EMPTY_USER_OR_CHAT");
2781 if ($this->user_id ===
$userId && $chat->getAuthorId() ===
$userId)
2783 $GLOBALS[
"APPLICATION"]->ThrowException(
GetMessage(
"IM_ERROR_LEAVE_OWNER_FORBIDDEN"),
"LEAVE_OWNER_FORBIDDEN");
2787 $GLOBALS[
"APPLICATION"]->ThrowException(
GetMessage(
"IM_CHAT_ACCESS_DENIED_KICK_USERS"),
"ACCESS_DENIED_KICK");
2793 if ($checkPermission && $this->user_id !==
$userId && $chat->getAuthorId() !== $this->user_id)
2795 $GLOBALS[
"APPLICATION"]->ThrowException(
GetMessage(
"IM_ERROR_KICK"),
"IM_ERROR_KICK");
2809 if (
$result->getError() !==
null)
2811 if (
$result->getError()?->getCode() === UserError::NOT_FOUND)
2813 $GLOBALS[
"APPLICATION"]->ThrowException(
GetMessage(
"IM_ERROR_USER_NOT_FOUND"), UserError::NOT_FOUND);
2818 $GLOBALS[
"APPLICATION"]->ThrowException(
$result->getError()->getMessage(),
$result->getError()->getCode());
2828 $url = $addBlankPicture?
'/bitrix/js/im/images/blank.gif':
'';
2831 if ($id > 0 && $size > 0)
2833 $arFileTmp = CFile::ResizeImageGet(
2835 array(
'width' => $size,
'height' => $size),
2841 if (!empty($arFileTmp[
'src']))
2843 $url = $arFileTmp[
'src'];
2851 $chatId = intval(
$params[
'CHAT_ID']);
2859 $arSelect = Array(
"ID",
"LAST_NAME",
"NAME",
"LOGIN",
"SECOND_NAME",
"PERSONAL_GENDER");
2860 $dbUsers = CUser::GetList(
'',
'',
array(
'ID_EQUAL_EXACT' =>
$userId),
array(
'FIELDS' => $arSelect));
2861 if ($arUser = $dbUsers->Fetch())
2864 $arUser[
'PERSONAL_GENDER'] = $arUser[
"PERSONAL_GENDER"] ==
'F'?
'F':
'M';
2868 if (isset(
$params[
'MESSAGE_CODE']))
2870 $messageCodeVersion =
$params[
'MESSAGE_CODE_VERSION'] ??
'';
2871 $messageReplace = is_array(
$params[
'MESSAGE_REPLACE'])?
$params[
'MESSAGE_REPLACE']: Array();
2874 $messageReplace[
'#USER_NAME#'] = $arUser[
'NAME'];
2884 $messageReplace = is_array(
$params[
'MESSAGE_REPLACE'])?
$params[
'MESSAGE_REPLACE']: Array();
2888 $message = str_replace(array_keys($messageReplace), array_values($messageReplace),
$message);
2894 return self::AddMessage(Array(
2895 "TO_CHAT_ID" => $chatId,
2899 "SKIP_USER_CHECK" =>
'Y',
2905 if (is_int($chatId))
2907 if (self::GetGeneralChatId() == $chatId)
2909 $chat[
'ENTITY_TYPE'] =
'GENERAL';
2913 $chat = IM\Model\ChatTable::getById($chatId)->fetch();
2918 else if(is_array($chatId))
2928 if (isset(
$options[$chat[
'ENTITY_TYPE']][
$action]) && !self::$entityOption[$chat[
'ENTITY_TYPE']][
$action])
2938 if (!is_null(self::$entityOption))
2940 return self::$entityOption;
2945 self::$entityOption = [];
2954 'LEAVE_OWNER' =>
true,
2956 'USER_LIST' =>
true,
2959 self::$entityOption[
'GENERAL'] = [
2965 'LEAVE_OWNER' =>
false,
2971 self::$entityOption[\Bitrix\ImBot\Service\Notifier::CHAT_ENTITY_TYPE] = [
2974 'LEAVE_OWNER' =>
false,
2976 self::$entityOption[\Bitrix\ImBot\Bot\Support24::CHAT_ENTITY_TYPE] = [
2983 'LEAVE_OWNER' =>
false,
2984 'USER_LIST' =>
false,
2986 self::$entityOption[\Bitrix\ImBot\Bot\Network::CHAT_ENTITY_TYPE] =
2987 self::$entityOption[\Bitrix\ImBot\Bot\Support24::CHAT_ENTITY_TYPE]
2993 $path = COption::GetOptionString(
"socialnetwork",
"workgroups_page",
"/workgroups/",
SITE_ID);
2996 self::$entityOption[
'SONET_GROUP'] = [
3001 'LEAVE_OWNER' =>
false,
3003 'PATH_TITLE' =>
GetMessage(
'IM_PATH_TITLE_SONET')
3009 $path = \CTasksTools::GetOptionPathTaskUserEntry(
SITE_ID,
"/company/personal/user/#user_id#/tasks/task/view/#task_id#/");
3010 $path = str_replace(Array(
'#user_id#',
'#task_id#'), Array((
$USER instanceof \
CUser) ? (
int)
$USER->GetId() : 0,
'#ID#'), mb_strtolower(
$path));
3012 self::$entityOption[
'TASKS'] = Array(
3017 'LEAVE_OWNER' =>
true,
3019 'PATH_TITLE' =>
GetMessage(
'IM_PATH_TITLE_TASKS')
3028 self::$entityOption[\CCalendar::CALENDAR_CHAT_ENTITY_TYPE] = Array(
3033 'LEAVE_OWNER' =>
true,
3035 'PATH_TITLE' =>
GetMessage(
'IM_PATH_TITLE_CALENDAR_EVENT')
3041 self::$entityOption[
'CRM'] = Array(
3046 'LEAVE_OWNER' =>
false,
3054 self::$entityOption[
'CALL'] = Array(
3061 'LEAVE_OWNER' =>
false,
3063 'USER_LIST' =>
true,
3067 foreach (self::$entityOption as
$code => $value)
3069 self::$entityOption[
$code] = array_merge($default, $value);
3072 self::$entityOption[
'DEFAULT'] = $default;
3074 return self::$entityOption;
3079 if (!CModule::IncludeModule(
'socialnetwork'))
3083 'group_id' => $groupId,
3084 'skipAvailabilityCheck' =>
true
3086 if (!empty($chatData[$groupId]) && intval($chatData[$groupId]) > 0)
3088 $chatId = $chatData[$groupId];
3093 'group_id' => $groupId
3102 if (!CModule::IncludeModule(
'crm'))
3109 $chatId = \Bitrix\Crm\Integration\Im\Chat::joinChat(Array(
3110 'ENTITY_TYPE' => $entityType,
3112 'USER_ID' =>
$USER->GetId()
3120 $result = \Bitrix\Im\Model\ChatTable::getList(
3122 'select' => [
'USER_COUNT'],
3123 'filter' => [
'=ID' => $chatId]
3132 return (
int)
$result[
'USER_COUNT'];
3137 $entityType = trim($entityType);
3140 if (empty($entityType) || empty(
$entityId))
3145 $chatData = \Bitrix\Im\Model\ChatTable::getList(Array(
3148 '=ENTITY_TYPE' => $entityType,
3158 return $chatData[
'ID'];
3163 $entityType = trim($entityType);
3166 if (empty($entityType) || empty(
$entityId))
3171 $chatData = \Bitrix\Im\Model\ChatTable::getList(Array(
3172 'select' => [
'ID',
'DISK_FOLDER_ID'],
3174 '=ENTITY_TYPE' => $entityType,
3183 self::deleteChat($chatData);
3192 self::hide($chatData[
'ID']);
3194 $strSQL =
"DELETE FROM b_im_chat WHERE ID = ".$chatData[
'ID'];
3195 $DB->Query($strSQL,
true);
3197 $strSQL =
"DELETE FROM b_im_relation WHERE CHAT_ID = ".$chatData[
'ID'];
3198 $DB->Query($strSQL,
true);
3200 $strSQL =
"DELETE FROM b_im_message WHERE CHAT_ID = ".$chatData[
'ID'];
3201 $DB->Query($strSQL,
true);
3206 if ($chatData[
'DISK_FOLDER_ID'])
3208 $folderModel = \Bitrix\Disk\Folder::getById($chatData[
'DISK_FOLDER_ID']);
3211 $folderModel->deleteTree(\
Bitrix\
Disk\SystemUser::SYSTEM_USER_ID);
3216 public static function hide($chatId)
3220 $relations = \CIMChat::GetRelationById($chatId,
false,
true,
false);
3221 foreach($relations as
$userId => $relation)
3223 if ($relation[
'MESSAGE_TYPE'] === Chat::IM_TYPE_OPEN_LINE)
3227 \CIMContactList::DeleteRecent($chatId,
true,
$userId);
3241 'module_id' =>
'im',
3242 'command' =>
'chatHide',
3245 'dialogId' =>
'chat'.$chatId,
3246 'chatId' => $chatId,
3260 ->setChatId((
int)$chatId)
3262 static::fillChatIndexWithUserFullNames($index);
3273 ->setChatId($chatId)
3274 ->setTitle($chatTitle)
3276 static::fillChatIndexWithUserFullNames($index);
3287 ->setChatId((
int)$chatId)
3289 static::fillChatIndexWithUserFullNames($index);
3299 \Bitrix\Im\Model\RelationTable::query()
3300 ->addSelect(
'USER_ID')
3301 ->where(
'CHAT_ID', $index->getChatId())
3306 foreach (
$query->exec() as $relation)
3311 $index->setUserList($users);
3316 $counter = CGlobalCounter::GetValue(
'im_videoconf_count', CGlobalCounter::ALL_SITES) + 1;
3318 return GetMessage(
'IM_VIDEOCONF_NAME_FORMAT_NEW', [
3325 if (
$type !== Chat::IM_TYPE_OPEN_CHANNEL || $dateCreate ===
null)
3330 $lastDay = (
new DateTime())->add(
'-1 day');
3332 return $dateCreate->
getTimestamp() > $lastDay->getTimestamp();
3339 return self::initChatByArray($chatData)->canDo(
$action, $target);
3344 $preparedChatData = $chatData;
3345 $preparedChatData[
'ID'] = $chatData[
'ID'] ?? $chatData[
'CHAT_ID'] ?? $chatData[
'ITEM_CID'] ??
null;
3346 $preparedChatData[
'TYPE'] = $chatData[
'TYPE'] ?? $chatData[
'CHAT_TYPE'] ??
null;
3347 $preparedChatData[
'ENTITY_TYPE'] = $chatData[
'ENTITY_TYPE'] ?? $chatData[
'CHAT_ENTITY_TYPE'] ??
null;
3348 $preparedChatData[
'ENTITY_ID'] = $chatData[
'ENTITY_ID'] ?? $chatData[
'CHAT_ENTITY_ID'] ??
null;
3349 $preparedChatData[
'ENTITY_DATA_1'] = $chatData[
'ENTITY_DATA_1'] ?? $chatData[
'CHAT_ENTITY_DATA_1'] ??
null;
3350 $preparedChatData[
'ENTITY_DATA_2'] = $chatData[
'ENTITY_DATA_2'] ?? $chatData[
'CHAT_ENTITY_DATA_2'] ??
null;
3351 $preparedChatData[
'ENTITY_DATA_3'] = $chatData[
'ENTITY_DATA_3'] ?? $chatData[
'CHAT_ENTITY_DATA_3'] ??
null;
3352 $preparedChatData[
'DATE_CREATE'] = $chatData[
'DATE_CREATE'] ?? $chatData[
'CHAT_DATE_CREATE'] ??
null;
3362 Chat::IM_TYPE_OPEN_LINE,
3363 Chat::IM_TYPE_COPILOT,
3364 Chat::IM_TYPE_CHANNEL,
3365 Chat::IM_TYPE_OPEN_CHANNEL,
3366 Chat::IM_TYPE_COLLAB,
3367 Chat::IM_TYPE_EXTERNAL,
3368 Chat::IM_TYPE_AI_ASSISTANT,
3369 Chat::IM_TYPE_AI_ASSISTANT_ENTITY,
3375 $types = self::getGroupTypes();
3376 $types[] = Chat::IM_TYPE_COMMENT;
3383 return "'" . implode(
"','", $types) .
"'";
if(! $messageFields||!isset($messageFields['message_id'])||!isset($messageFields['status'])||!CModule::IncludeModule("messageservice")) $messageId
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
static getPublicLink($type, $alias)
static getType($chatData, bool $camelCase=true)
static filterRelationsByAccess(int $chatId, array $relations)
static getRelation($chatId, $params=[])
static getColorByNumber($number)
static isSafeColor($code)
static toJson($array, $camelCase=true)
static add($chatId, $userId)
static indexRecord(ChatIndex $chatIndex)
static updateIndexRecord(ChatIndex $index)
static addIndexRecord(ChatIndex $index)
static isUnread(int $userId, string $itemType, string $dialogId)
static parse($text, $params=Array())
static parseLegacyFormat($text, $params=Array())
static decodeEmoji($text)
static formatFullNameFromDatabase($fields)
static getInstance($userId=null)
const GENERAL_MESSAGE_TYPE_JOIN
static getGeneralChatId()
const GENERAL_MESSAGE_TYPE_LEAVE
static linkGeneralChat(?int $chatId=null)
static unlinkGeneralChat()
static sendSharedPull(array $pull)
static create(array $fields)
static deleteByChatsIds(array $chatsIds)
static getConnection($name="")
static includeModule($moduleName)
static isModuleInstalled($moduleName)
static createFromTimestamp($timestamp)
static add($recipient, array $parameters, $channelType=\CPullChannel::TYPE_PRIVATE)
static createChat($params)
static getChatData($params)
static urlAddParams($url, $add_params, $options=[])
SetDescription($chatId, $description)
static GetAvatarImage($id, $size=200, $addBlankPicture=true)
JoinParent($chatId, $messageId)
static CanSendMessageToGeneralChat($userId=null)
Rename($chatId, $title, $checkPermission=true, $sendMessage=true)
static AddMessage($arFields)
static CanJoinGeneralChatId($userId)
SetOwner($chatId, $userId, $checkPermission=true)
GetUnreadMessage($arParams=Array())
static implodeTypesForQuery(array $types)
GetLastMessage($toChatId, $fromUserId=false, $loadExtraData=false, $bTimeZone=true, $limit=true)
static GetOpenChatData($arParams=Array())
SetUnReadMessage($chatId, $lastId)
static getGroupTypesExtra()
GetLastSendMessage($arParams)
static UnlinkGeneralChatId()
DeleteUser( $chatId, $userId, $checkPermission=true, $skipMessage=false, $skipRecent=false, $withoutRead=false, $additionalParams=[])
static addChatIndex(int $chatId, string $chatTitle)
__construct($user_id=null, $arParams=Array())
GetLastMessageLimit($chatId, $messageStartId, $messageEndId=0, $loadExtraData=false, $bTimeZone=true, $order='DESC')
static GetCrmChatId($code)
static linkGeneralChatId($chatId)
const GENERAL_MESSAGE_TYPE_JOIN
static canDo(array $chatData, array $relations, IM\V2\Permission\Action $action, mixed $target=null)
static fillChatIndexWithUserFullNames(\Bitrix\Im\Internals\ChatIndex $index)
static InstallGeneralChat($agentMode=false)
SetManager($chatId, $userId, $isManager=true, $checkPermission=true)
static updateChatIndex($chatId)
static getChatType($chatData)
static GetGeneralChatId()
static getNextConferenceDefaultTitle()
static GetPrivateRelation($fromUserId, $toUserId)
static SetAccessToGeneralChat($allowAll=true, $allowCodes=Array())
AddUser($chatId, $userId, $hideHistory=null, $skipMessage=false, $skipRecent=false, $skipRelation=false)
SetReadMessage($chatId, $lastId=null, $byEvent=false)
static GetRelationById($ID, $userId=false, $timezone=true, $withCounter=true, bool $raw=false)
static DeleteEntityChat($entityType, $entityId)
const GENERAL_MESSAGE_TYPE_LEAVE
SetAvatarId($chatId, $fileId)
static SetChatParams($chatId, $params)
static isNewChat(string $type, ?DateTime $dateCreate)
static deleteChat(array $chatData)
SetManagers($chatId, $users, $checkPermission=true)
static CheckRestriction($chatId, $action)
static initChatByArray(array $chatData)
SetColor($chatId, $color)
GetPersonalChat(?int $userId=null)
static AddSystemMessage($params)
static GetGeneralChatAutoMessageStatus($type)
static AddGeneralMessage($arFields)
MuteNotify($chatId, $mute=true)
static GetSonetGroupChatId($groupId)
static GetUserCount($chatId)
static GetEntityChat($entityType, $entityId)
static GetChatData($arParams=Array())
static GetFiles($chatId, $fileId=false, $checkPermission=true)
static SetLastSendId($chatId, $userId, $lastSendId)
static SetLastIdForUnread($chatId, $userId, $lastId)
static SetLastId($chatId, $userId, $lastId=null)
static prepareShow($arMessages, $params)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
if(Loader::includeModule( 'bitrix24')) elseif(Loader::includeModule('intranet') &&CIntranetUtils::getPortalZone() !=='ru') $description
const IM_MESSAGE_OPEN_LINE
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
const BX_RESIZE_IMAGE_EXACT
ExecuteModuleEventEx($arEvent, $arParams=[])
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
GetMessage($name, $aReplace=null)
$GLOBALS['____1690880296']
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if(empty($signedUserToken)) $key
</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."%"
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']