5use Bitrix\Disk\FileLink;
6use Bitrix\Disk\SystemUser;
9use \Bitrix\Main\Localization\Loc;
12Loc::loadMessages(__FILE__);
22 private static $chatList = [];
23 private static $folderList = [];
37 $storageModel =
false;
38 if ($storageId = self::GetStorageId($chatId))
40 $storageModel = \Bitrix\Disk\Storage::loadById($storageId);
43 $storageModel =
false;
50 'NAME' => Loc::getMessage(
'IM_DISK_STORAGE_TITLE'),
51 'USE_INTERNAL_RIGHTS' => 1,
52 'MODULE_ID' => self::MODULE_ID,
53 'ENTITY_TYPE' => IM\Disk\ProxyType\Im::className(),
54 'ENTITY_ID' => self::MODULE_ID,
57 $driver = \Bitrix\Disk\Driver::getInstance();
60 $storageModel = $driver->addStorageIfNotExist(
$data);
67 $storageModel =
false;
83 if ((
int)$chatId <= 0 || empty($files))
88 $chatRelation = \CIMChat::GetRelationById($chatId,
false,
true,
false);
89 if (!$chatRelation[self::GetUserId()])
104 foreach ($files as $fileId => $fileData)
106 if (!$fileData[
'mimeType'])
108 $fileData[
'mimeType'] =
"binary";
110 if (!$fileData[
'name'])
114 $newFile = $folderModel->addBlankFile(Array(
115 'NAME' => $fileData[
'name'],
116 'SIZE' => $fileData[
'size'],
117 'CREATED_BY' => self::GetUserId(),
118 'MIME_TYPE' => $fileData[
'mimeType'],
122 $result[
'FILE_ID'][$fileId][
'TMP_ID'] = $fileId;
123 $result[
'FILE_ID'][$fileId][
'FILE_ID'] = $newFile->getId();
124 $result[
'FILE_ID'][$fileId][
'FILE_NAME'] = $newFile->getName();
125 $filesModels[] = $newFile;
127 $messageFileId[] = $newFile->getId();
131 $result[
'FILE_ID'][$fileId][
'TMP_ID'] = $fileId;
132 $result[
'FILE_ID'][$fileId][
'FILE_ID'] = 0;
135 if (empty($messageFileId))
141 $arChat = \CIMChat::GetChatData(Array(
'ID' => $chatId));
143 "TO_CHAT_ID" => $chatId,
144 "FROM_USER_ID" => self::GetUserId(),
145 "MESSAGE_TYPE" => $arChat[
'chat'][$chatId][
'message_type'],
146 "SILENT_CONNECTOR" => $linesSilentMode?
'Y':
'N',
148 'FILE_ID' => $messageFileId
150 "FILE_MODELS" => $filesModels
164 if ($e =
$GLOBALS[
"APPLICATION"]->GetException())
166 $result[
'MESSAGE_ERROR'] = $e->GetString();
183 $post = \Bitrix\Main\Context::getCurrent()->getRequest()->getPostList()->toArray();
184 $post[
'PARAMS'] = IM\Text::convertSymbolsAfterJsonDecode(\CUtil::JsObjectToPhp(
$post[
'REG_PARAMS'],
true));
185 $post[
'MESSAGE_HIDDEN'] =
$post[
'REG_MESSAGE_HIDDEN'] ==
'Y' ?
'Y' :
'N';
186 $post[
'PARAMS'][
'TEXT'] =
$post[
'PARAMS'][
'TEXT'] ? trim(
$post[
'PARAMS'][
'TEXT']) :
'';
188 $chatId = (int)
$post[
'CHAT_ID'];
191 $error = Loc::getMessage(
'IM_DISK_ERR_UPLOAD').
' (E100)';
196 if (!$chat->isExist())
198 $error = Loc::getMessage(
'IM_DISK_ERR_UPLOAD').
' (E101)';
202 if (!$chat->checkAccess()->isSuccess())
204 $error = Loc::getMessage(
'IM_DISK_ERR_UPLOAD').
' (E102)';
208 if (!$chat->canDo(IM\V2\Permission\Action::Send))
210 $error = Loc::getMessage(
'IM_DISK_ERR_UPLOAD').
' (E103)';
217 $error = Loc::getMessage(
'IM_DISK_ERR_UPLOAD').
' (E104)';
221 if (!$file[
"files"][
"default"])
223 $error = Loc::getMessage(
'IM_DISK_ERR_UPLOAD').
' (E106)';
227 $fileModel = $folderModel->uploadFile(
228 $file[
'files'][
'default'],
230 'NAME' => $file[
'name'],
231 'CREATED_BY' => self::GetUserId()
237 if (!$fileModel || !$fileModel->getId())
239 $error = Loc::getMessage(
'IM_DISK_ERR_UPLOAD').
' (E107)';
243 $fileTmpId = $file[
"id"];
244 $messageTmpId = $file[
"regTmpMessageId"];
245 $isMessageHidden = $file[
"regHiddenMessageId"] ===
'Y';
247 if (!$fileTmpId || !$messageTmpId)
249 $error = Loc::getMessage(
'IM_DISK_ERR_UPLOAD').
' (E108)';
254 [
'upload'.$fileModel->getId()],
255 $post[
'PARAMS'][
'TEXT'],
257 'LINES_SILENT_MODE' => $isMessageHidden,
258 'TEMPLATE_ID' => $messageTmpId,
259 'FILE_TEMPLATE_ID' => $fileTmpId
263 if (!$uploadRealResult)
266 if ($e =
$GLOBALS[
"APPLICATION"]->GetException())
272 $error = Loc::getMessage(
'IM_DISK_ERR_UPLOAD').
' (E109)';
278 $fileModel = $folderModel->getChild([
'ID' => $fileModel->getId()]);
281 $file[
'fileParams'][
'date'] = date(
'c', $file[
'fileParams'][
'date']->getTimestamp());
286 'CHAT_ID' => $chatId,
287 'FILE_ID' => $fileModel->getId(),
288 'MESSAGE_ID' => $uploadRealResult[
'MESSAGE_ID'],
289 'MESSAGE_OUT' =>
$post[
'PARAMS'][
'TEXT'],
290 'MESSAGE_HIDDEN' => $isMessageHidden,
291 'FILE' => $file[
'fileParams'],
306 if ((
int)$chatId <= 0 || empty($files))
311 $chatRelation = \CIMChat::GetRelationById($chatId,
false,
true,
false);
312 if (!$chatRelation[self::GetUserId()])
327 foreach ($files as $fileTmpId => $fileId)
329 $fileModel = File::getById($fileId);
332 || $fileModel->getParentId() != $folderModel->getId()
333 || $fileModel->getCreatedBy() != self::GetUserId()
338 $fileModel->delete(self::GetUserId());
339 $result[
'FILE_ID'][$fileTmpId] = $fileId;
343 if (!isset(
$result[
'FILE_ID'][$fileTmpId]))
348 $CIMMessage = new \CIMMessage();
349 $arMessage = $CIMMessage->GetMessage(
$messageId);
350 if ($arMessage[
'AUTHOR_ID'] != self::GetUserId())
362 if (\
Bitrix\Main\Loader::includeModule(
'pull'))
364 $pullMessage = Array(
366 'command' =>
'fileUnRegister',
368 'chatId' =>
$result[
'CHAT_ID'],
370 'messages' =>
$result[
'MESSAGE_ID'],
372 'extra' => \
Bitrix\Im\Common::getPullExtra()
376 $orm = \Bitrix\Im\Model\ChatTable::getById(
$result[
'CHAT_ID']);
377 $chat = $orm->fetch();
378 if (CIMMessenger::needToSendPublicPull($chat[
'TYPE']))
380 \CPullWatch::AddToStack(
'IM_PUBLIC_'.$chat[
'ID'], $pullMessage);
394 if ((
int)$chatId <= 0 || (
int)$fileId <= 0)
399 $chatRelation = \CIMChat::GetRelationById($chatId,
false,
true,
false);
400 if (!$chatRelation[self::GetUserId()])
405 $folderModel = self::getFolderModel($chatId,
false);
411 $fileModel = File::getById($fileId);
412 if (!$fileModel || $fileModel->getParentId() != $folderModel->getId())
420 $fileModel->getCreatedBy() == self::GetUserId()
425 $fileModel->delete(self::GetUserId());
426 $notifyUsers = array_keys($chatRelation);
430 $driver = \Bitrix\Disk\Driver::getInstance();
431 $rightsManager = $driver->getRightsManager();
437 'ACCESS_CODE' =>
'U'.self::GetUserId(),
438 'TASK_ID' => $rightsManager->getTaskIdByName($rightsManager::TASK_FULL),
442 $rightsManager->append($fileModel, $accessCodes);
447 $fileService =
new IM\V2\Link\File\FileService();
448 if (\
Bitrix\Main\Loader::includeModule(
'pull') && !$fileService->isMigrationFinished())
450 $orm = \Bitrix\Im\Model\ChatTable::getById($chatId);
451 $chat = $orm->fetch();
452 $pullMessage = Array(
454 'command' =>
'fileDelete',
459 'extra' => \
Bitrix\Im\Common::getPullExtra()
461 if ($chat[
'TYPE'] === IM\V2\Chat::IM_TYPE_COMMENT)
463 \CPullWatch::AddToStack(
'IM_PUBLIC_'.$chat[
'PARENT_ID'], $pullMessage);
470 if (CIMMessenger::needToSendPublicPull($chat[
'TYPE']))
472 \CPullWatch::AddToStack(
'IM_PUBLIC_'.$chat[
'ID'], $pullMessage);
489 if ((
int)$chatId <= 0 || empty($files))
494 $chat = IM\V2\Chat::getInstance($chatId);
495 if ($chat instanceof IM\V2\Chat\NullChat)
513 $skipUserCheck = isset(
$options[
'SKIP_USER_CHECK']) &&
$options[
'SKIP_USER_CHECK'] ===
true;
514 $linesSilentMode = isset(
$options[
'LINES_SILENT_MODE']) &&
$options[
'LINES_SILENT_MODE'] ===
true;
517 $fileTemplateId = isset(
$options[
'FILE_TEMPLATE_ID']) &&
$options[
'FILE_TEMPLATE_ID'] <>
'' ?
$options[
'FILE_TEMPLATE_ID'] :
'';
518 $attach =
$options[
'ATTACH'] ??
null;
521 $waitFullExecution =
$options[
'WAIT_FULL_EXECUTION'] ??
'Y';
522 if ($chat->getEntityType() ===
'LINES' || $chat->getEntityType() ===
'LIVECHAT')
524 $waitFullExecution =
'Y';
527 $chatRelation = $chat->getRelations();
529 if ($chat->getEntityType() !==
'LIVECHAT' &&
$userId > 0 && !$skipUserCheck)
531 if (!$chatRelation->hasUser(
$userId, $chatId))
537 $chat->getEntityType() ===
'ANNOUNCEMENT'
538 && !$chatRelation->getByUserId(
$userId, $chatId)->getManager()
549 foreach ($files as $fileId)
551 if (mb_substr($fileId, 0, 6) ===
'upload')
563 $result[
'DISK_ID'][] = $newFile->getId();
564 $result[
'FILE_MODELS'][$fileId] = $newFile;
571 $recentItem = \Bitrix\Disk\Internals\RecentlyUsedTable::getList([
575 '=OBJECT_ID' => $newFile->getId()
581 \Bitrix\Disk\Internals\RecentlyUsedTable::delete($recentItem[
'ID']);
585 else if (!$skipUserCheck)
587 if ($chat->getEntityType() ==
'LINES')
591 \Bitrix\Disk\Driver::getInstance()->getRecentlyUsedManager()->push(
$userId, $newFile);
594 else if ($chat->getEntityType() !=
'LIVECHAT')
596 foreach ($chatRelation as $relation)
603 if (
$userId == $relation->getUserId())
608 \Bitrix\Disk\Driver::getInstance()->getRecentlyUsedManager()->push($relation->getUserId(), $newFile);
615 $result[
'FILES'][$fileId][
'id'] = 0;
626 "TO_CHAT_ID" => $chatId,
628 "MESSAGE_TYPE" => $chat->getType(),
629 "SILENT_CONNECTOR" => $linesSilentMode?
'Y':
'N',
630 "SKIP_USER_CHECK" => ($skipUserCheck || !
$userId || $chat->getEntityType() ==
'LIVECHAT'),
632 "FILE_TEMPLATE_ID" => $fileTemplateId,
633 "FILE_MODELS" =>
$result[
'FILE_MODELS'] ?? [],
634 "WAIT_FULL_EXECUTION" => $waitFullExecution,
637 if ($chat->getEntityType() ==
'LIVECHAT')
639 [$lineId] = explode(
"|", $chat->getEntityId());
640 $ar[
"EXTRA_PARAMS"] = [
641 "CONTEXT" =>
"LIVECHAT",
657 $ar[
'ATTACH'] = $attach;
669 foreach (
$result[
'FILE_MODELS'] as $file)
681 && ($chat->getEntityType() ==
'LINES' || $chat->getEntityType() ==
'LIVECHAT')
684 $fileIds = array_map(
function($item){
685 return 'disk' . $item;
688 $uploadResult =
false;
690 if ($chat->getEntityType() ==
'LIVECHAT' && \
Bitrix\Main\Loader::includeModule(
'imopenlines'))
692 [$lineId, $clientUserId] = explode(
"|", $chat->getEntityId());
694 $session = new \Bitrix\Imopenlines\Session();
696 'USER_CODE' =>
'livechat|'.$lineId.
'|'.$chat->getId().
'|'.$clientUserId,
697 'DEFERRED_JOIN' =>
'Y',
700 if ($session->isNowCreated())
702 \Bitrix\ImOpenLines\Connector::saveCustomData($session->getData(
'CHAT_ID'), $_SESSION[
'LIVECHAT'][
'CUSTOM_DATA']);
704 $session->joinUser();
707 'IMOL_SID' => $session->getData(
'ID'),
708 "IMOL_FORM" =>
"welcome",
710 "COMPONENT_ID" =>
"bx-imopenlines-message",
712 \CIMMessageParam::Set(
$messageId, $messageParams);
713 \CIMMessageParam::SendPull(
$messageId, array_keys($messageParams));
715 $session->getData(
'CHAT_ID');
728 !empty($uploadResult) &&
729 $uploadResult[
'MESSAGE_ID'] &&
733 \Bitrix\Im\Model\MessageParamTable::add([
734 "MESSAGE_ID" =>
$result[
'MESSAGE_ID'],
735 "PARAM_NAME" =>
'CONNECTOR_MID',
736 "PARAM_VALUE" => $uploadResult[
'MESSAGE_ID']
738 \Bitrix\Im\Model\MessageParamTable::add([
739 "MESSAGE_ID" => $uploadResult[
'MESSAGE_ID'],
740 "PARAM_NAME" =>
'CONNECTOR_MID',
741 "PARAM_VALUE" =>
$result[
'MESSAGE_ID']
744 \CIMMessageParam::SendPull(
$result[
'MESSAGE_ID'], [
'CONNECTOR_MID']);
745 \CIMMessageParam::SendPull($uploadResult[
'MESSAGE_ID'], [
'CONNECTOR_MID']);
747 $event = new \Bitrix\Main\Event(
"imopenlines",
"OnLivechatUploadFile", [
'FILES' => $uploadResult[
'DISK_ID']]);
757 Disk\Folder $folderModel,
763 if ((
int)$fileModel->getParentId() !== (
int)$folderModel->getId())
766 new IM\V2\Entity\File\FileError(
767 IM\V2\Entity\File\FileError::UPLOAD_FILE_INCORRECT_FOLDER,
768 'The parent folder of the original file and the destination folder must match.'
773 if ((
int)$fileModel->getCreatedBy() !==
$userId)
776 new IM\V2\Entity\File\FileError(
777 IM\V2\Entity\File\FileError::UPLOAD_FILE_INCORRECT_AUTHOR,
778 'You must be the author of the original file to upload it.'
795 if (!isset($fileModel) || $chat instanceof IM\V2\Chat\NullChat)
801 if (!isset($folderModel))
808 if (!$checkResult->isSuccess())
810 (
new IM\V2\Logger(
'chat_incorrect_file_upload'))->logErrors($checkResult->getErrorCollection());
813 $fileModel->increaseGlobalContentVersion();
817 (
new IM\V2\Entity\File\FileItem($fileModel, $chatId))->markAsFile();
820 (
new IM\V2\Analytics\ChatAnalytics($chat))->addUploadFile($fileModel);
832 if ((
int)$chatId <= 0 || empty($files))
837 $chatRelation = \CIMChat::GetRelationById($chatId,
false,
true,
false);
850 foreach ($files as $fileId)
852 $res = \CFile::GetByID($fileId);
853 $file =
$res->Fetch();
859 if (empty($file[
'ORIGINAL_NAME']))
869 $newFile = $folderModel->addFile(
array(
871 'FILE_ID' => $fileId,
872 'SIZE' => $file[
'FILE_SIZE'],
873 'CREATED_BY' => $authorId ?? SystemUser::SYSTEM_USER_ID,
877 $newFile->increaseGlobalContentVersion();
878 $messageFileId[] = $newFile->getId();
882 return !empty($messageFileId) ? $messageFileId :
false;
891 if (!self::Enabled())
896 if ((
int)$fileId <= 0)
901 $fileModel = File::getById($fileId,
array(
'STORAGE'));
906 if ($fileModel instanceof FileLink)
908 $fileModel = $fileModel->getRealObject();
915 $storageModel = $fileModel->getStorage();
921 if (!$fileModel->canRead($storageModel->getCurrentUserSecurityContext()))
932 $newFileModel = $fileModel->copyTo($folderModel, self::GetUserId(),
true);
939 'FILE' => $newFileModel,
940 'FOLDER' => $folderModel,
952 if (!self::Enabled())
957 if ((
int)$fileId <= 0 || (
int)$chatId <= 0)
962 $fileModel = File::getById($fileId,
array(
'STORAGE'));
968 $storageModel = $fileModel->getStorage();
974 $securityContext =
null;
977 $securityContext = $storageModel->getCurrentUserSecurityContext();
981 $securityContext = $storageModel->getSecurityContext(
$userId);
984 if ($securityContext && !$fileModel->canRead($securityContext))
989 $fileModel->increaseGlobalContentVersion();
1003 if (!self::Enabled())
1010 $chat = IM\V2\Chat::getInstance($chatId);
1015 || $chat instanceof IM\V2\Chat\NullChat
1022 $chat instanceof IM\V2\Chat\CollabChat
1023 && (
int)$fileModel->getParentId() === (
int)$folderModel->getId()
1026 $fileModel->increaseGlobalContentVersion();
1031 if ($fileModel instanceof FileLink)
1033 $fileModel = $fileModel->getRealObject();
1046 $newFileModel = $fileModel->copyTo($folderModel, (
int)
$userId,
true);
1054 $newFileModel->increaseGlobalContentVersion();
1056 return $newFileModel;
1063 bool $withSharingRights =
true
1066 if (!self::Enabled())
1073 if ($withSharingRights)
1075 $accessProvider = new \Bitrix\Im\Access\ChatAuthProvider;
1076 $rightsManager = \Bitrix\Disk\Driver::getInstance()->getRightsManager();
1078 $rightsManager->append(
1082 'ACCESS_CODE' => $accessProvider->generateAccessCode($chatId),
1083 'TASK_ID' => $rightsManager->getTaskIdByName($rightsManager::TASK_READ)
1088 return $folderModel->addFileLink(
1092 'GLOBAL_CONTENT_VERSION' => 1
1099 protected static function getFileModel(
int $fileId, ?
int $contextUserId): ?File
1101 if (!self::Enabled())
1111 $fileModel = File::getById($fileId,
array(
'STORAGE'));
1117 $storageModel = $fileModel->getStorage();
1123 $securityContext =
null;
1124 if (!isset($contextUserId))
1126 $securityContext = $storageModel->getCurrentUserSecurityContext();
1128 else if ($contextUserId > 0)
1130 $securityContext = $storageModel->getSecurityContext($contextUserId);
1133 if ($securityContext && !$fileModel->canRead($securityContext))
1149 if (!self::Enabled())
1154 if ($chatId <= 0 || $fileId <= 0)
1159 $chat = \Bitrix\Im\Model\ChatTable::getByPrimary($chatId, [
1160 'select' => [
'TITLE',
'ENTITY_TYPE',
'ENTITY_ID']
1167 if (!\CIMChat::GetRelationById($chatId,
$userId,
true,
false))
1172 $fileModel = File::getById($fileId,
array(
'STORAGE'));
1178 $storageModel = $fileModel->getStorage();
1184 $securityContext =
null;
1187 $securityContext = $storageModel->getCurrentUserSecurityContext();
1191 $securityContext = $storageModel->getSecurityContext(
$userId);
1194 if ($securityContext && !$fileModel->canRead($securityContext))
1201 if (!empty($chat[
'ENTITY_TYPE']) && !empty($chat[
'ENTITY_ID']))
1203 $event = new \Bitrix\Main\Event(
'im',
'onDiskRecordShare', [
1204 'DISK_ID' => $fileId,
1207 'TITLE' => $chat[
'TITLE'],
1208 'ENTITY_TYPE' => $chat[
'ENTITY_TYPE'],
1209 'ENTITY_ID' => $chat[
'ENTITY_ID']
1229 $post = \Bitrix\Main\Context::getCurrent()->getRequest()->getPostList()->toArray();
1231 $chatId = (int)
$post[
'CHAT_ID'];
1237 $chat = IM\Model\ChatTable::getById($chatId)->fetch();
1243 $relationError =
true;
1244 $chatRelation = \CIMChat::GetRelationById($chatId,
false,
true,
false);
1245 foreach ($chatRelation as $relation)
1247 if ($relation[
"EXTERNAL_AUTH_ID"] ==
'imconnector')
1249 unset($chatRelation[$relation[
"USER_ID"]]);
1252 if ($relation[
'USER_ID'] == self::GetUserId())
1254 $relationError =
false;
1259 $error = Loc::getMessage(
'IM_DISK_ERR_AVATAR_1');
1263 if ($chat[
'ENTITY_TYPE'] ===
'ANNOUNCEMENT' && $chatRelation[self::GetUserId()][
'MANAGER'] !==
'Y')
1268 $file[
"files"][
"default"][
"MODULE_ID"] =
"im";
1270 $checkResponse = \CFile::CheckImageFile($file[
"files"][
"default"], (10*1024*1024), 5000, 5000);
1271 if ($checkResponse !==
null)
1276 $fileId = \CFile::saveFile($file[
"files"][
"default"], self::MODULE_ID);
1279 if ($chat[
'AVATAR'] > 0)
1281 \CFile::DeLete($chat[
'AVATAR']);
1283 IM\Model\ChatTable::update($chatId, Array(
'AVATAR' => $fileId));
1285 $file[
'chatId'] = $chatId;
1286 $file[
'chatAvatar'] = \CIMChat::GetAvatarImage($fileId);
1288 if ($chat[
"ENTITY_TYPE"] !=
'CALL')
1290 \CIMChat::AddSystemMessage(Array(
1291 'CHAT_ID' => $chatId,
1292 'USER_ID' => self::GetUserId(),
1293 'MESSAGE_CODE' =>
'IM_DISK_AVATAR_CHANGE_'
1297 if (\
Bitrix\Main\Loader::includeModule(
'pull'))
1299 $pullMessage = Array(
1300 'module_id' =>
'im',
1301 'command' =>
'chatAvatar',
1303 'chatId' => $chatId,
1304 'avatar' => $file[
'chatAvatar'],
1306 'extra' => \
Bitrix\Im\Common::getPullExtra()
1309 if (CIMMessenger::needToSendPublicPull($chat[
'TYPE']))
1311 \CPullWatch::AddToStack(
'IM_PUBLIC_'.$chat[
'ID'], $pullMessage);
1313 if ($chat[
'TYPE'] === IM\V2\Chat::IM_TYPE_OPEN_CHANNEL)
1315 IM\V2\Chat\OpenChannelChat::sendSharedPull($pullMessage);
1335 $chatId = (int)$chatId;
1336 $fileId = (int)$fileId;
1337 if ($chatId <= 0 || $fileId <= 0)
1342 $chat = IM\Model\ChatTable::getById($chatId)->fetch();
1348 $relationError =
true;
1349 $chatRelation = \CIMChat::GetRelationById($chatId,
false,
true,
false);
1350 foreach ($chatRelation as $relation)
1352 if ($relation[
"EXTERNAL_AUTH_ID"] ==
'imconnector')
1354 unset($chatRelation[$relation[
"USER_ID"]]);
1357 if ($relation[
'USER_ID'] == \
Bitrix\Im\Common::getUserId(
$userId))
1359 $relationError =
false;
1367 if ($chat[
'AVATAR'] > 0)
1369 \CFile::DeLete($chat[
'AVATAR']);
1371 IM\Model\ChatTable::update($chatId, Array(
'AVATAR' => $fileId));
1373 $file[
'chatId'] = $chatId;
1374 $file[
'chatAvatar'] = \CIMChat::GetAvatarImage($fileId);
1376 if ($chat[
"ENTITY_TYPE"] !=
'CALL')
1378 \CIMChat::AddSystemMessage(Array(
1379 'CHAT_ID' => $chatId,
1381 'MESSAGE_CODE' =>
'IM_DISK_AVATAR_CHANGE_'
1385 if (\
Bitrix\Main\Loader::includeModule(
'pull'))
1387 $pullMessage = Array(
1388 'module_id' =>
'im',
1389 'command' =>
'chatAvatar',
1391 'chatId' => $chatId,
1392 'avatar' => $file[
'chatAvatar'],
1394 'extra' => \
Bitrix\Im\Common::getPullExtra()
1398 if (CIMMessenger::needToSendPublicPull($chat[
'TYPE']))
1400 \CPullWatch::AddToStack(
'IM_PUBLIC_'.$chat[
'ID'], $pullMessage);
1402 if ($chat[
'TYPE'] === IM\V2\Chat::IM_TYPE_OPEN_CHANNEL)
1404 IM\V2\Chat\OpenChannelChat::sendSharedPull($pullMessage);
1419 if (!self::Enabled())
1424 if ((
int)$chatId <= 0)
1429 $offset = (int)$historyPage - 1;
1435 $folderModel = self::getFolderModel($chatId,
false);
1442 'PARENT_ID' => $folderModel->getId(),
1443 'STORAGE_ID' => $folderModel->getStorageId()
1446 $relation = \CIMChat::GetRelationById($chatId, self::GetUserId(),
true,
false);
1452 if ($relation[
'LAST_FILE_ID'] > 0)
1454 $filter[
'>ID'] = $relation[
'LAST_FILE_ID'];
1460 $securityContext = new \Bitrix\Disk\Security\DiskSecurityContext(self::GetUserId());
1462 $parameters = Array(
1464 'with' => Array(
'CREATE_USER'),
1466 'offset' => $offset*15,
1467 'order' => Array(
'UPDATE_TIME' =>
'DESC')
1469 $parameters = \Bitrix\Disk\Driver::getInstance()->getRightsManager()->addRightsCheck($securityContext, $parameters,
array(
'ID',
'CREATED_BY'));
1471 $fileCollection = File::getModelList($parameters);
1473 foreach ($fileCollection as $fileModel)
1489 if (!self::Enabled())
1494 if ((
int)$chatId <= 0)
1505 $folderModel = self::getFolderModel($chatId,
false);
1512 'PARENT_ID' => $folderModel->getId(),
1513 'STORAGE_ID' => $folderModel->getStorageId(),
1514 '%=NAME' => str_replace(
"%",
'',
$name).
"%",
1517 $relation = \CIMChat::GetRelationById($chatId, self::GetUserId(),
true,
false);
1523 if ($relation[
'LAST_FILE_ID'] > 0)
1525 $filter[
'>ID'] = $relation[
'LAST_FILE_ID'];
1531 $securityContext = new \Bitrix\Disk\Security\DiskSecurityContext(self::GetUserId());
1533 $parameters = Array(
1535 'with' => Array(
'CREATE_USER'),
1537 'order' => Array(
'UPDATE_TIME' =>
'DESC')
1539 $parameters = \Bitrix\Disk\Driver::getInstance()->getRightsManager()->addRightsCheck($securityContext, $parameters,
array(
'ID',
'CREATED_BY'));
1541 $fileCollection = File::getModelList($parameters);
1543 foreach ($fileCollection as $fileModel)
1558 if (!self::Enabled())
1563 if ((
int)$chatId <= 0)
1568 $folderModel = self::getFolderModel($chatId,
false);
1574 $result = \Bitrix\Disk\Internals\ObjectTable::getList(
array(
1575 'select' =>
array(
'MAX_ID'),
1577 '=PARENT_ID' => $folderModel->getId(),
1578 '=TYPE' => \
Bitrix\Disk\Internals\ObjectTable::TYPE_FILE
1582 'data_type' =>
'integer',
1583 'expression' =>
array(
'MAX(ID)')
1589 $maxId =
$data[
'MAX_ID'];
1601 public static function GetFiles($chatId, $fileId =
false, $checkPermission =
true)
1603 $fileArray = Array();
1604 if (!self::Enabled())
1609 if ((
int)$chatId <= 0)
1614 if ($fileId ===
false || $fileId ===
null)
1616 if (!is_array($fileId))
1618 $fileId = Array($fileId);
1620 foreach ($fileId as
$key => $value)
1622 $fileId[
$key] = (int)$value;
1629 $folderModel = self::getFolderModel($chatId,
false);
1635 'PARENT_ID' => $folderModel->getId(),
1636 'STORAGE_ID' => $folderModel->getStorageId()
1640 $filter[
'ID'] = array_values($fileId);
1643 if ($checkPermission)
1645 $securityContext = new \Bitrix\Disk\Security\DiskSecurityContext(self::GetUserId());
1649 $securityContext = \Bitrix\Disk\Driver::getInstance()->getFakeSecurityContext();
1652 $parameters = Array(
1654 'with' => Array(
'CREATE_USER')
1656 $parameters = \Bitrix\Disk\Driver::getInstance()->getRightsManager()->addRightsCheck($securityContext, $parameters,
array(
'ID',
'CREATED_BY'));
1658 $fileCollection = File::getModelList($parameters);
1659 foreach ($fileCollection as $fileModel)
1674 if (!self::Enabled())
1679 if ($fileModel instanceof File)
1682 elseif ((
int)$fileModel > 0)
1684 $fileModel = File::getById($fileModel);
1691 if (!$fileModel || $fileModel->getId() <= 0)
1696 $file =
new IM\V2\Entity\File\FileItem($fileModel, $chatId);
1697 $params = $file->toRestFormat();
1698 $params[
'date'] = $fileModel->getCreateTime();
1710 if ($isEnable ===
null)
1714 && \CPullOptions::GetNginxStatus()
1716 && \Bitrix\Disk\Driver::isSuccessfullyConverted()
1725 if (!self::Enabled() || $chatId <= 0)
1730 $result = IM\Model\ChatTable::getById($chatId);
1731 if (!$chat =
$result->fetch())
1736 if ($chat[
'TYPE'] !== IM\V2\Chat::IM_TYPE_CHAT)
1741 $folderId = (int)$chat[
'DISK_FOLDER_ID'];
1747 $folderModel = \Bitrix\Disk\Folder::getById($folderId);
1750 || !($folderModel instanceof \
Bitrix\Disk\Folder)
1751 || ($folderModel->getStorageId() != self::GetStorageId($chatId))
1757 $driver = \Bitrix\Disk\Driver::getInstance();
1758 $accessProvider = new \Bitrix\Im\Access\ChatAuthProvider;
1759 $rightsManager = $driver->getRightsManager();
1767 $accessCode = $accessProvider->generateAccessCode($chatId);
1770 $rightsManager->delete($folderModel);
1771 return $rightsManager->append(
1774 'ACCESS_CODE' => $accessCode,
1775 'TASK_ID' => $rightsManager->getTaskIdByName($rightsManager::TASK_READ)
1788 if (!self::Enabled())
1793 if ((
int)$chatId <= 0)
1798 $folderModel =
false;
1800 if (isset(self::$chatList[$chatId]))
1802 $chat = self::$chatList[$chatId];
1806 $chat = IM\Model\ChatTable::getRow([
1817 self::$chatList[$chatId] = $chat;
1825 $folderId = (int)$chat[
'DISK_FOLDER_ID'];
1828 if (isset(self::$folderList[$folderId]) && self::$folderList[$folderId] instanceof \
Bitrix\Disk\Folder)
1830 $folderModel = self::$folderList[$folderId];
1834 $folderModel = \Bitrix\Disk\Folder::getById($folderId);
1835 self::$folderList[$folderId] = $folderModel;
1840 || !($folderModel instanceof \
Bitrix\Disk\Folder)
1841 || ($folderModel->getStorageId() != self::GetStorageId($chatId))
1848 if ($folderId || !$createFolder)
1850 return $folderModel;
1853 $chatType = $chat[
'TYPE'];
1856 if ($chatType === IM\V2\Chat::IM_TYPE_COMMENT)
1859 $withRights =
false;
1868 IM\Model\ChatTable::update($chatId, [
'DISK_FOLDER_ID' => $folderModel->getId()]);
1870 if (isset(self::$chatList[$chatId]))
1872 self::$chatList[$chatId][
'DISK_FOLDER_ID'] = $folderModel->getId();
1874 self::$folderList[$folderId] = $folderModel;
1878 (new \Bitrix\Im\Access\ChatAuthProvider)->updateChatCodesByRelations($chatId);
1882 return $folderModel;
1892 $parentChat = IM\V2\Chat::getInstance($parentId);
1893 $parentFolder = $parentChat->getOrCreateDiskFolder();
1898 return $parentFolder->addSubFolder(
1900 'NAME' =>
'chat'.$chatId,
1901 'CREATED_BY' => self::GetUserId()
1915 $driver = \Bitrix\Disk\Driver::getInstance();
1922 $accessProvider = new \Bitrix\Im\Access\ChatAuthProvider;
1923 $rightsManager = $driver->getRightsManager();
1928 'ACCESS_CODE' => $accessProvider->generateAccessCode($chatId),
1929 'TASK_ID' => $rightsManager->getTaskIdByName($rightsManager::TASK_EDIT)
1932 if ($chatType === IM\V2\Chat::IM_TYPE_COLLAB)
1934 $folder = $storageModel->getFolderForUploadedFiles();
1940 $driver->getRightsManager()->append($folder, $accessCodes);
1945 if ($chatType === IM\V2\Chat::IM_TYPE_OPEN || $chatType === IM\V2\Chat::IM_TYPE_OPEN_CHANNEL)
1949 if ($departmentCode)
1951 $accessCodes[] = Array(
1952 'ACCESS_CODE' => $departmentCode,
1953 'TASK_ID' => $rightsManager->getTaskIdByName($rightsManager::TASK_READ)
1958 return $storageModel->addFolder(
1960 'NAME' =>
'chat'.$chatId,
1961 'CREATED_BY' => self::GetUserId()
1976 $chatId = (int)$chatId;
1985 if ($chatId <= 0 || empty($userIds))
1990 if (isset(self::$chatList[$chatId]))
1992 $chat = self::$chatList[$chatId];
1996 $chat = IM\Model\ChatTable::getRow([
2006 self::$chatList[$chatId] = $chat;
2014 if ($chat[
'TYPE'] === IM\V2\Chat::IM_TYPE_COMMENT)
2019 $folderModel = self::getFolderModel($chatId,
false);
2025 $accessProvider = new \Bitrix\Im\Access\ChatAuthProvider;
2029 $accessProvider->addChatCodes($chatId, $userIds);
2034 $accessProvider->deleteChatCodes($chatId, $userIds);
2037 $accessCodes = Array();
2040 $users = \CIMContactList::GetUserData(
array(
2041 'ID' => array_values($userIds),
2042 'DEPARTMENT' =>
'N',
2043 'SHOW_ONLINE' =>
'N',
2045 foreach ($users[
'users'] as $userData)
2047 if ($userData[
'extranet'])
2049 $accessCodes[] =
'U'.$userData[
'id'];
2055 foreach ($userIds as
$uid)
2063 $accessCodes[] =
'U'.$uid;
2066 $driver = \Bitrix\Disk\Driver::getInstance();
2067 $rightsManager = $driver->getRightsManager();
2068 $result = $rightsManager->revokeByAccessCodes($folderModel, $accessCodes);
2080 if (!self::Enabled())
2097 $folderModel = $storageModel->getSpecificFolderByCode(
'CALL_BACKGROUND_'.
$userId);
2100 return $folderModel;
2103 $backgroundFolderModel = $storageModel->getSpecificFolderByCode(
'CALL_BACKGROUND');
2104 if (!$backgroundFolderModel)
2106 $backgroundFolderModel = $storageModel->addFolder([
2107 'NAME' =>
'CALL_BACKGROUND',
2108 'CODE' =>
'CALL_BACKGROUND',
2109 'CREATED_BY' => SystemUser::SYSTEM_USER_ID,
2112 if (!$backgroundFolderModel)
2117 $rightsManager = \Bitrix\Disk\Driver::getInstance()->getRightsManager();
2119 $folderModel = $backgroundFolderModel->addSubFolder(
2121 'NAME' =>
'CALL_BACKGROUND_'.
$userId,
2122 'CODE' =>
'CALL_BACKGROUND_'.
$userId,
2127 [
'ACCESS_CODE' =>
'U'.
$userId,
'TASK_ID' => $rightsManager->getTaskIdByName($rightsManager::TASK_FULL)],
2132 return $folderModel;
2148 $fileModel = File::getById($fileId);
2149 if (!$fileModel || $fileModel->getParentId() != $folderModel->getId())
2154 $fileModel->increaseGlobalContentVersion();
2171 $fileModel = File::getById($fileId);
2172 if (!$fileModel || $fileModel->getParentId() != $folderModel->getId())
2188 if (!self::Enabled())
2199 $storageModel = \Bitrix\Disk\Driver::getInstance()->getStorageByUserId(
$userId);
2205 return $storageModel->getFolderForSavedFiles();
2213 if ($chatId ===
null)
2218 return IM\V2\Chat::getInstance($chatId)->getStorageId();
2234 if ($oldId > 0 && $oldId != $id)
2237 $connection->queryExecute(
"UPDATE b_im_chat SET DISK_FOLDER_ID = 0");
2238 $connection->queryExecute(
"DELETE FROM b_im_message_param WHERE PARAM_NAME = 'FILE_ID'");
2251 if (!self::Enabled())
2262 return \Bitrix\Disk\Driver::getInstance()->getUrlManager()->getUrlFocusController(
'openFolderList',
array(
'folderId' => $folderModel->getId()));
2271 if (!self::Enabled())
2276 $fileId = (int)$fileId;
2278 return \Bitrix\Disk\Driver::getInstance()->getUrlManager()->getUrlFocusController(
'showObjectInGrid',
array(
'objectId' => $fileId? $fileId:
'_FILE_ID_'));
2291 if (!in_array(
$type, Array(self::PATH_TYPE_DOWNLOAD, self::PATH_TYPE_SHOW, self::PATH_TYPE_PREVIEW)))
2296 if ($checkContentVersion && $fileModel->getGlobalContentVersion() <= 1)
2303 $isImage = \Bitrix\Disk\TypeFile::isImage($fileModel);
2304 $isVideo = \Bitrix\Disk\TypeFile::isVideo($fileModel->getName());
2306 if (
$type == self::PATH_TYPE_SHOW)
2310 $result = $urlManager->create(
'disk.api.file.showImage', [
2312 'fileId' => $fileModel->getId(),
2313 'fileName' => $fileModel->getName()
2318 $result = $urlManager->create(
'disk.api.file.download', [
2320 'fileId' => $fileModel->getId(),
2321 'fileName' => $fileModel->getName()
2325 else if (
$type == self::PATH_TYPE_PREVIEW)
2327 if (!($isImage || $isVideo))
2332 if ($fileModel->getView()->getPreviewData())
2334 $linkType =
'disk.api.file.showPreview';
2339 $linkType =
'disk.api.file.showImage';
2347 $result = $urlManager->create($linkType, [
2351 'signature' => \
Bitrix\Disk\Security\ParameterSigner::getImageSignature($fileModel->getId(), 640, 640),
2352 'fileId' => $fileModel->getId(),
2356 else if (
$type == self::PATH_TYPE_DOWNLOAD)
2358 $result = $urlManager->create(
'disk.api.file.download', [
2360 'fileId' => $fileModel->getId(),
2361 'fileName' => $fileModel->getName()
2374 if (!\
Bitrix\Main\Loader::includeModule(
'disk'))
2379 $fileId = $fileModel->getId();
2381 $signer = new \Bitrix\Main\Security\Sign\Signer;
2383 if (is_string($signKey))
2385 $signer->setKey($signKey);
2387 $signedValue = $signer->sign($fileId);
2390 $host = $urlManager->getHostUrl();
2391 $isImage = \Bitrix\Disk\TypeFile::isImage($fileModel);
2393 $link =
$host.
'/pub/im.file.php?FILE_ID='.$fileId.
'&SIGN='.$signedValue;
2402 $shortLink .=
'#img.'.$fileModel->getExtension();
2417 if (is_string(
$key))
2433 return "CIMDisk::RemoveTmpFileAgent();";
2435 $date = new \Bitrix\Main\Type\DateTime();
2436 $date->add(
'YESTERDAY');
2438 $fileModels = File::getModelList(Array(
2440 'GLOBAL_CONTENT_VERSION' => 1,
2441 '=TYPE' => \
Bitrix\Disk\Internals\FileTable::TYPE,
2442 'STORAGE_ID' => $storageModel->getId(),
2443 '<CREATE_TIME' => $date
2447 foreach ($fileModels as $fileModel)
2449 $fileModel->delete(SystemUser::SYSTEM_USER_ID);
2452 return __METHOD__.
'();';
2462 return $USER instanceOf \CUser ? (int)
$USER->getId() : 0;
2470 if (!\
Bitrix\Main\Loader::includeModule(
'disk'))
2475 return \Bitrix\Disk\Configuration::isEnabledExternalLink();
2484 if (!\
Bitrix\Main\Loader::includeModule(
'disk'))
2489 if (!\CIMMessenger::IsAdmin())
2504 $topCode = IM\V2\Integration\HumanResources\Department\Department::getInstance()->getTopCode();
2506 return $topCode ??
false;
2518 !isset($fileParams[
'STORAGE_ID'])
2519 || !self::isStorageAssociatedWithChat((
int)$fileParams[
'STORAGE_ID'])
2525 $messageIds = \CIMMessageParam::GetMessageIdByParam(
'FILE_ID', $fileId);
2526 \CIMMessageParam::DeleteByParam(
'FILE_ID', $fileId);
2527 (
new IM\V2\Link\File\FileService())->deleteFilesByDiskFileId($fileId);
2530 \CIMMessageParam::SendPull((
int)
$messageId, Array(
'FILE_ID'));
2546 if ($storageId === self::GetStorageId())
2552 !Loader::includeModule(
'disk')
2553 || !Loader::includeModule(
'socialnetwork')
2559 $storage = Disk\Storage::loadById($storageId);
2565 if (!(
$storage->getProxyType() instanceof Disk\ProxyType\Group))
2570 $groupId = (int)
$storage->getEntityId();
2572 return CollabProvider::getInstance()->isCollab($groupId);
if(! $messageFields||!isset($messageFields['message_id'])||!isset($messageFields['status'])||!CModule::IncludeModule("messageservice")) $messageId
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
static getConnection($name="")
static get($moduleId, $name, $default="", $siteId=false)
static set($moduleId, $name, $value="", $siteId="")
static includeModule($moduleName)
static add($recipient, array $parameters, $channelType=\CPullChannel::TYPE_PRIVATE)
static UploadFileUnRegister($chatId, $files, $messages)
static getFileModel(int $fileId, ?int $contextUserId)
static createSymlink(File $fileModel, int $chatId, int $userId, bool $withSharingRights=true)
static RecordShare(int $chatId, int $fileId, ?int $userId=null)
static CommitBackgroundFile($userId, $fileId)
static GetFolderModel($chatId, $createFolder=true)
static OnAfterDeleteFile($fileId, $userId, $fileParams=Array())
static DeleteBackgroundFile($userId, $fileId)
static updateFolderRights(int $chatId, bool $fullRights=false)
static createSubFolder(int $chatId, int $parentId)
static SaveToLocalDisk($fileId)
static UploadFileFromMain($chatId, $files, ?int $authorId=null)
static GetTopDepartmentCode()
static SetEnabledExternalLink($flag=true)
static UploadFileRegister($chatId, $files, $text='', $linesSilentMode=false)
static GetLocalDiskSavedModel($userId=null)
static uploadFromLocalDisk(int $chatId, int $fileId, ?int $userId=null, bool $asFile=false)
static ChangeFolderMembers($chatId, $userId, $append=true)
static RemoveTmpFileAgent()
static GetBackgroundFolderModel($userId=null)
static GetStorage(?int $chatId=null)
static createFolder(int $chatId, string $chatType)
static UploadFileFromDisk($chatId, $files, $text='', $options=[], $robot=false)
static IncreaseFileVersionDisk($chatId, $fileId, ?int $userId=null)
static DeleteFile($chatId, $fileId)
static EnabledExternalLink()
static checkDirectlyUseFileAccess(File $fileModel, Disk\Folder $folderModel, int $userId)
static GetFiles($chatId, $fileId=false, $checkPermission=true)
static UploadAvatar($hash, &$file, &$package, &$upload, &$error)
static GetLocalDiskFolderPath()
static SaveFromLocalDisk($chatId, $fileId, bool $symlink=false, ?int $userId=null)
static GetHistoryFilesByName($chatId, $name)
static GetMaxFileId($chatId)
static GetHistoryFiles($chatId, $historyPage=1)
static GetFileParams($chatId, $fileModel, $options=[])
static GetStorageId(?int $chatId=null)
static GetFileLink(File $fileModel)
static isStorageAssociatedWithChat(int $storageId)
static GetPublicPath($type, File $fileModel, $checkContentVersion=true)
static UpdateAvatarId($chatId, $fileId, $userId=null)
static UploadFile($hash, &$file, &$package, &$upload, &$error)
static GetLocalDiskFilePath($fileId=0)
static Delete($id, $userId=null, $completeDelete=false, $byEvent=false)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
ExecuteModuleEventEx($arEvent, $arParams=[])
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if(empty($signedUserToken)) $key
if(empty($decryptedData)) $storage
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
$GLOBALS['_____370096793']