1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
ForwardService.php
См. документацию.
1<?php
2
4
12use Bitrix\Imbot\Bot\CopilotChatBot;
14
16{
17 use ContextCustomer;
18
19 private const PARAMS_TO_COPY_WHITELIST = [
30 ];
31
32 private Chat $toChat;
33
34 public function __construct(Chat $toChat)
35 {
36 $this->toChat = $toChat;
37 }
38
43 public function createMessages(MessageCollection $forwardingMessages): Result
44 {
45 $result = new Result();
46
47 $uuidMap = [];
48 foreach ($forwardingMessages as $forwardingMessage)
49 {
50 if ($this->canForward($forwardingMessage))
51 {
52 $forwardMessageResult = $this->createForwardMessage($forwardingMessage);
53 if ($forwardMessageResult->hasResult())
54 {
55 $messageMap = $forwardMessageResult->getResult();
56 $uuidMap[$messageMap['uuid']] = $messageMap['id'];
57 }
58
59 $result->addErrors($forwardMessageResult->getErrors());
60 }
61 }
62
63 return $result->setResult($uuidMap);
64 }
65
66 public static function getChatTypeByContextId(string $contextId): string
67 {
68 $dialogId = Chat::getDialogIdByContextId($contextId);
69
70 if (!str_starts_with($dialogId, 'chat'))
71 {
72 return \Bitrix\Im\Chat::getType(['TYPE' => Chat::IM_TYPE_PRIVATE]);
73 }
74
75 $chatId = mb_substr($dialogId, 4);
76
77 return Chat::getInstance($chatId)->getExtendedType();
78 }
79
84 private function createForwardMessage(Message $forwardingMessage): Result
85 {
86 $paramsResult = $this->createParamsForForwardMessage($forwardingMessage);
87 if (!$paramsResult->hasResult())
88 {
89 return $paramsResult;
90 }
91
92 $messageConfig = [
93 'MESSAGE_TYPE' => $this->toChat->getType(),
94 'MESSAGE' => $forwardingMessage->getMessage() !== '' ? $forwardingMessage->getMessage() : null,
95 'PARAMS' => $paramsResult->getResult()['PARAMS'] ?? [],
96 'TO_CHAT_ID' => $this->toChat->getChatId(),
97 'FROM_USER_ID' => $this->getContext()->getUserId(),
98 'URL_PREVIEW' => 'N',
99 'TEMPLATE_ID' => $forwardingMessage->getForwardUuid() ?? '',
100 'FILE_MODELS' => $paramsResult->getResult()['FILE_MODELS'] ?? [],
101 'WAIT_FULL_EXECUTION' => 'N',
102 ];
103
104 $result = new Result();
105
106 $messageId = \CIMMessenger::Add($messageConfig); //TODO replace with $chat->sendMessage
107 if (!$messageId)
108 {
110 }
111
112 return $result->setResult([
113 'uuid' => $forwardingMessage->getForwardUuid(),
114 'id' => $messageId
115 ]);
116 }
117
122 private function createParamsForForwardMessage(Message $forwardingMessage): Result
123 {
124 $result = new Result();
125
126 $newParams = $this->getForwardingMessageParams($forwardingMessage);
127
128 if ($this->isOriginalMessage($newParams))
129 {
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;
134 if ($forwardingMessage->getChat() instanceof Chat\OpenChannelChat)
135 {
136 $newParams[Message\Params::FORWARD_CHAT_TITLE] = $forwardingMessage->getChat()->getDisplayedTitle();
137 }
138 }
139
140 $diskFiles = [];
141
142 if ($forwardingMessage->getParams()->isSet(Message\Params::FILE_ID))
143 {
144 $newFileIds = [];
145 foreach ($forwardingMessage->getFiles() as $file)
146 {
147 $copy = $file->getCopyToChat($this->toChat);
148 if ($copy instanceof FileItem)
149 {
150 $newFileIds[] = $copy->getId();
151 $diskFiles[] = $copy->getDiskFile();
152 }
153 }
154
155 $newParams[Message\Params::FILE_ID] = $newFileIds;
156 }
157
158 if (Loader::includeModule('imbot') && $forwardingMessage->getAuthorId() === CopilotChatBot::getBotId())
159 {
160 if ($forwardingMessage->getParams()->isSet(Message\Params::COPILOT_ROLE))
161 {
162 $copilotRole = $forwardingMessage->getParams()->get(Message\Params::COPILOT_ROLE)->getValue();
163 }
164
165 $newParams[Message\Params::COPILOT_ROLE] = $copilotRole ?? RoleManager::getDefaultRoleCode();
166 }
167
168 return $result->setResult(['PARAMS' => $newParams, 'FILE_MODELS' => $diskFiles]);
169 }
170
176 private function isOriginalMessage(array $messageParams): bool
177 {
178 return !isset(
179 $messageParams[Message\Params::FORWARD_CONTEXT_ID],
180 $messageParams[Message\Params::FORWARD_USER_ID]
181 );
182 }
183
188 private function getForwardingMessageParams(Message $message): array
189 {
190 $result = [];
191 foreach ($message->getParams() as $param)
192 {
193 if (isset(self::PARAMS_TO_COPY_WHITELIST[$param->getName()]))
194 {
195 $value = $param->getValue();
196 if (is_bool($value))
197 {
198 $value = $value ? 'Y' : 'N';
199 }
200 $result[$param->getName()] = $value;
201 }
202 }
203
204 return $result;
205 }
206
207 private function canForward(Message $message): bool
208 {
209 $chat = $message->getChat();
210
211 return $chat->checkAccess($this->getContext()->getUserId())->isSuccess() && !($chat instanceof Chat\CommentChat);
212 }
213}
if(! $messageFields||!isset($messageFields['message_id'])||!isset($messageFields['status'])||!CModule::IncludeModule("messageservice")) $messageId
Определения callback_ismscenter.php:26
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
static getChatTypeByContextId(string $contextId)
Определения ForwardService.php:66
createMessages(MessageCollection $forwardingMessages)
Определения ForwardService.php:43
const COPILOT_ROLE
Определения Params.php:71
const FILE_ID
Определения Params.php:26
const REPLY_ID
Определения Params.php:68
const URL_ID
Определения Params.php:58
const FORWARD_CHAT_TITLE
Определения Params.php:67
const FORWARD_CONTEXT_ID
Определения Params.php:65
const ATTACH
Определения Params.php:27
const URL_ONLY
Определения Params.php:37
const IS_DELETED
Определения Params.php:31
const FORWARD_USER_ID
Определения Params.php:66
const FORWARD_ID
Определения Params.php:64
const LARGE_FONT
Определения Params.php:38
getMessage()
Определения Message.php:906
getForwardUuid()
Определения Message.php:278
static getInstance()
Определения application.php:98
Определения result.php:20
Определения loader.php:13
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
Определения Uuid.php:3
$value
Определения Param.php:39
trait ContextCustomer
Определения ContextCustomer.php:12
$message
Определения payment.php:8