27 'SUCCESS_RESULT' => [],
36 $externalId =
$message[
'externalId'] ===
'' ? $index :
$message[
'externalId'];
37 $addResult = $this->addMessage(
$message);
38 if (!$addResult->isSuccess())
40 $sendStubResult = $this->sendStubMessage(
$message);
41 if (!$sendStubResult->isSuccess())
43 return $sendStubResult;
45 $error = $addResult->getErrors()[0];
46 $resultArray[
'ERROR_RESULT'][] = [
47 'ID' => $sendStubResult->getResult(),
48 'EXTERNAL_ID' => $externalId,
49 'ERROR_CODE' =>
$error->getCode(),
50 'ERROR_MESSAGE' =>
$error->getMessage(),
55 $resultArray[
'SUCCESS_RESULT'][] = [
56 'ID' => $addResult->getResult()[
'ID'],
57 'EXTERNAL_ID' => $externalId,
59 $this->lastDateCreate = $this->getDateTimeFromAtom(
$message[
'dateCreate']);
62 $addedFiles[] = (int)
$message[
'fileId'];
66 $this->increaseFilesVersion($addedFiles);
68 return (
new Result())->setResult($resultArray);
75 'SUCCESS_RESULT' => [],
80 $chatIds = $this->getChatIdsByMessageIds($ids);
87 $updateResult = $this->updateMessage(
$message);
88 if (!$updateResult->isSuccess())
90 $error = $updateResult->getErrors()[0];
91 $resultArray[
'ERROR_RESULT'][] = [
93 'ERROR_CODE' =>
$error->getCode(),
94 'ERROR_MESSAGE' =>
$error->getMessage(),
99 $resultArray[
'SUCCESS_RESULT'][] = $updateResult->getResult();
102 $addedFiles[] = (int)
$message[
'fileId'];
106 $this->increaseFilesVersion($addedFiles);
108 return $result->setResult($resultArray);
134 $fileIds[] = (int)
$message[
'fileId'];
143 $files = File::getModelList([
'filter' => [
'ID' => $fileIds]]);
148 $filesById[$file->getId()] = $file;
154 private function increaseFilesVersion(
array $files): void
161 $implodeFileId = implode(
',',
$files);
162 $sql =
"UPDATE b_disk_object SET GLOBAL_CONTENT_VERSION=2 WHERE ID IN ({$implodeFileId})";
163 Application::getConnection()->query($sql);
170 $validateResult = $this->validateFields(
$message);
171 if (!$validateResult->isSuccess())
173 return $validateResult;
175 $message = $validateResult->getResult();
176 $messageFieldsResult = $this->getMessageFields(
$message);
177 $messageId = \CIMMessenger::Add($messageFieldsResult);
181 return $result->addError($this->getErrorLegacy());
195 if ((
int)
$message[
'file']->getParentId() !== (
int)$this->chat[
'DISK_FOLDER_ID'])
207 if ((
int)$this->chat[
'ID'] !==
$message[
'chatId'])
209 return $result->addError(
new MessageError(MessageError::MESSAGE_NOT_FOUND));
212 $validateResult = $this->validateParams(
$message);
214 if (!$validateResult->isSuccess())
216 return $validateResult;
219 $params = $validateResult->getResult();
223 \CIMMessageParam::Set($id,
$params);
228 $urlPreview = !(isset(
$message[
'urlPreview']) &&
$message[
'urlPreview'] ===
"N");
229 $isSuccessUpdate = \CIMMessenger::Update($id,
$message[
'message'], $urlPreview,
false,
null,
false,
true);
230 if (!$isSuccessUpdate)
236 return $result->setResult([
'ID' => $id]);
239 private function getErrorLegacy():
Error
243 if (
$error instanceof \CAdminException)
250 $errorCode =
$error->GetID();
257 private function getChatIdsByMessageIds(
array $messageIds):
array
260 if (empty($messageIds))
266 ->setSelect([
'ID',
'CHAT_ID'])
267 ->whereIn(
'ID', $messageIds)
279 private function sendStubMessage(
array $originalMessage): Result
282 $chatId = (int)$this->chat[
'ID'];
283 $originalDate = $this->getDateTimeFromAtom($originalMessage[
'dateCreate']);
284 if (isset($originalDate) && !$this->hasDateError())
286 $date = $originalDate;
290 $date = $this->getLastDateCreate();
299 'MESSAGE' => Loc::getMessage(
'IM_IMPORT_BROKEN_MESSAGE'),
300 'MESSAGE_DATE' => $date->toString(),
301 'FROM_USER_ID' => $originalMessage[
'authorId'] ?? 0,
302 'TO_CHAT_ID' => $chatId,
303 'MESSAGE_TYPE' => $this->chat[
'MESSAGE_TYPE'],
304 'SYSTEM' => $originalMessage[
'system'],
305 'URL_PREVIEW' =>
'N',
308 'SKIP_COMMAND' =>
'Y',
309 'SKIP_USER_CHECK' =>
'Y',
316 private function getLastDateCreate(): ?DateTime
318 if (isset($this->lastDateCreate))
320 return $this->lastDateCreate;
323 $result = MessageTable::query()
324 ->setSelect([
'DATE_CREATE'])
325 ->where(
'CHAT_ID', (
int)$this->chat[
'ID'])
326 ->setOrder([
'DATE_CREATE' =>
'DESC'])
333 return $this->lastDateCreate;
336 private function hasDateError(): bool
344 if (
$error instanceof \CAdminException)
348 if (
$message[
'id'] ??
'' ===
'MESSAGE_DATE')
356 return $error->GetID() ===
'MESSAGE_DATE';
365 $dateCreate = $this->getDateTimeFromAtom(
$message[
'dateCreate']);
366 if (!isset($dateCreate))
370 if ($this->getLastDateCreate() !==
null && $dateCreate->getTimestamp() < $this->getLastDateCreate()->getTimestamp())
374 $validateParams = $this->validateParams(
$message);
375 if (!$validateParams->isSuccess())
377 return $validateParams;
379 $params = $validateParams->getResult();
381 $message[
'dateCreate'] = $dateCreate->toString();
395 'FILE_ID' => $this->getFileIdParams(
$message),
396 'KEYBOARD' => $this->getKeyboard(
$message),
398 'ATTACH' => $this->getAttach(
$message)
401 foreach ($results as $paramName =>
$result)
407 if (
$result->getResult() !==
null)
413 return (
new Result())->setResult(
$params);
420 'MESSAGE_DATE' =>
$message[
'dateCreate'],
421 'FROM_USER_ID' => (int)
$message[
'authorId'],
422 'TO_CHAT_ID' => (
int)$this->chat[
'ID'],
423 'MESSAGE_TYPE' => $this->chat[
'MESSAGE_TYPE'],
428 'URL_PREVIEW' =>
'N',
432 'SKIP_COMMAND' =>
'Y',
433 'SKIP_USER_CHECK' =>
'Y',
438 private function getDateTimeFromAtom(
string $dateAtom): ?DateTime
440 return DateTime::tryParse($dateAtom, \DateTimeInterface::RFC3339);
454 $fileCheckResult = $this->checkFileAccess(
$message);
455 if (!$fileCheckResult->isSuccess())
457 return $fileCheckResult;
459 $fileId = [(int)
$message[
'fileId']];
462 return $result->setResult($fileId);
473 return $result->setResult(
'N');
476 if (!isset(
$message[
'keyboard'][
'BUTTONS']))
478 $keyboard[
'BUTTONS'] =
$message[
'keyboard'];
484 $keyboard[
'BOT_ID'] =
$message[
'botId'];
485 $keyboard = \Bitrix\Im\Bot\Keyboard::getKeyboardByJson($keyboard);
486 if (!isset($keyboard))
488 return $result->addError(
new ImportError(
'KEYBOARD_ERROR',
'Incorrect keyboard params'));
490 if (!$keyboard->isAllowSize())
492 return $result->addError(
new ImportError(
'KEYBOARD_OVERSIZE',
'You have exceeded the maximum allowable size of keyboard'));
496 return $result->setResult($keyboard);
507 return $result->setResult(
'N');
510 if (!isset(
$message[
'menu'][
'ITEMS']))
518 $menu[
'BOT_ID'] =
$message[
'botId'];
519 $menu = \Bitrix\Im\Bot\ContextMenu::getByJson($menu);
522 return $result->addError(
new ImportError(
'MENU_ERROR',
'Incorrect menu params'));
524 if (!$menu->isAllowSize())
526 return $result->addError(
new ImportError(
'MENU_OVERSIZE',
'You have exceeded the maximum allowable size of menu'));
530 return $result->setResult($menu);
541 return $result->setResult(
'N');
543 $attach = \CIMMessageParamAttach::GetAttachByJson(
$message[
'attach']);
546 return $result->addError(
new ImportError(
'ATTACH_ERROR',
'Incorrect attach params'));
548 if (!$attach->IsAllowSize())
550 return $result->addError(
new ImportError(
'ATTACH_OVERSIZE',
'You have exceeded the maximum allowable size of attach'));
554 return $result->setResult($attach);