19 private const PARAMS_TO_COPY_WHITELIST = [
36 $this->toChat = $toChat;
48 foreach ($forwardingMessages as $forwardingMessage)
50 if ($this->canForward($forwardingMessage))
52 $forwardMessageResult = $this->createForwardMessage($forwardingMessage);
53 if ($forwardMessageResult->hasResult())
55 $messageMap = $forwardMessageResult->getResult();
56 $uuidMap[$messageMap[
'uuid']] = $messageMap[
'id'];
59 $result->addErrors($forwardMessageResult->getErrors());
63 return $result->setResult($uuidMap);
68 $dialogId = Chat::getDialogIdByContextId($contextId);
70 if (!str_starts_with($dialogId,
'chat'))
72 return \Bitrix\Im\Chat::getType([
'TYPE' => Chat::IM_TYPE_PRIVATE]);
75 $chatId = mb_substr($dialogId, 4);
84 private function createForwardMessage(
Message $forwardingMessage):
Result
86 $paramsResult = $this->createParamsForForwardMessage($forwardingMessage);
87 if (!$paramsResult->hasResult())
93 'MESSAGE_TYPE' => $this->toChat->getType(),
95 'PARAMS' => $paramsResult->getResult()[
'PARAMS'] ?? [],
96 'TO_CHAT_ID' => $this->toChat->getChatId(),
97 'FROM_USER_ID' => $this->getContext()->getUserId(),
100 'FILE_MODELS' => $paramsResult->getResult()[
'FILE_MODELS'] ?? [],
101 'WAIT_FULL_EXECUTION' =>
'N',
106 $messageId = \CIMMessenger::Add($messageConfig);
122 private function createParamsForForwardMessage(
Message $forwardingMessage):
Result
126 $newParams = $this->getForwardingMessageParams($forwardingMessage);
128 if ($this->isOriginalMessage($newParams))
130 $userId = $forwardingMessage->isSystem() ? 0 : $forwardingMessage->getAuthorId();
131 $newParams[Message\Params::FORWARD_ID] = $forwardingMessage->getId();
132 $newParams[Message\Params::FORWARD_CONTEXT_ID] = $forwardingMessage->getContextId();
133 $newParams[Message\Params::FORWARD_USER_ID] =
$userId;
136 $newParams[Message\Params::FORWARD_CHAT_TITLE] = $forwardingMessage->getChat()->getDisplayedTitle();
145 foreach ($forwardingMessage->getFiles() as $file)
147 $copy = $file->getCopyToChat($this->toChat);
148 if ($copy instanceof FileItem)
150 $newFileIds[] = $copy->getId();
151 $diskFiles[] = $copy->getDiskFile();
155 $newParams[Message\Params::FILE_ID] = $newFileIds;
158 if (Loader::includeModule(
'imbot') && $forwardingMessage->getAuthorId() === CopilotChatBot::getBotId())
165 $newParams[Message\Params::COPILOT_ROLE] = $copilotRole ?? RoleManager::getDefaultRoleCode();
168 return $result->setResult([
'PARAMS' => $newParams,
'FILE_MODELS' => $diskFiles]);
176 private function isOriginalMessage(
array $messageParams): bool
188 private function getForwardingMessageParams(Message
$message):
array
191 foreach (
$message->getParams() as $param)
193 if (isset(self::PARAMS_TO_COPY_WHITELIST[$param->getName()]))
195 $value = $param->getValue();
207 private function canForward(Message
$message): bool
211 return $chat->checkAccess($this->
getContext()->getUserId())->isSuccess() && !($chat instanceof Chat\CommentChat);