- Модуль: im
- Путь к файлу: ~/bitrix/modules/im/lib/V2/Chat/PrivateChat.php
- Класс: BitrixImV2ChatPrivateChat
- Вызов: PrivateChat::sendMessage
public function sendMessage($message, $sendingConfig = null): Result
{
$result = new Result;
if (!$this->getChatId())
{
return $result->addError(new ChatError(ChatError::WRONG_TARGET_CHAT));
}
if (is_string($message))
{
$message = (new Message)->setMessage($message);
}
elseif (!$message instanceof Message)
{
$message = new Message($message);
}
$message
->setRegistry($this->messageRegistry)
->setContext($this->context)
->setChatId($this->getChatId())
;
if (!$message->getNotifyModule())
{
$message->setNotifyModule('im');
}
if ($message->isSystem())
{
$message->setNotifyEvent(Notify::EVENT_PRIVATE_SYSTEM);
}
else
{
$message->setNotifyEvent(Notify::EVENT_PRIVATE);
}
// config for sending process
if ($sendingConfig instanceof SendingConfig)
{
$sendingServiceConfig = $sendingConfig;
}
else
{
$sendingServiceConfig = new SendingConfig();
if (is_array($sendingConfig))
{
$sendingServiceConfig->fill($sendingConfig);
}
}
// sending process
$sendService = new SendingService($sendingServiceConfig);
$sendService->setContext($this->context);
// check duplication by UUID
if (
!$message->isSystem()
&& $message->getUuid()
)
{
$checkUuidResult = $sendService->checkDuplicateByUuid($message);
if (!$checkUuidResult->isSuccess())
{
return $result->addErrors($checkUuidResult->getErrors());
}
$data = $checkUuidResult->getResult();
if (!empty($data['messageId']))
{
return $result->setResult($checkUuidResult->getResult());
}
}
// author from current context
if (
!$message->getAuthorId()
&& !$message->isSystem()
)
{
$message->setAuthorId($this->getContext()->getUserId());
if (!$message->getAuthorId())
{
return $result->addError(new ChatError(ChatError::WRONG_SENDER));
}
}
// Extranet cannot send system
if (
$message->isSystem()
&& $message->getAuthorId()
&& User::getInstance($message->getAuthorId())->isExtranet()
)
{
$message->markAsSystem(false);
}
// permissions
if (
!$sendingServiceConfig->skipUserCheck()
&& !$sendingServiceConfig->convertMode()
&& !$message->isSystem()
)
{
if (!$this->hasAccess($message->getAuthorId()))
{
return $result->addError(new ChatError(ChatError::ACCESS_DENIED));
}
}
// fire event `im:OnBeforeChatMessageAdd` before message send
$eventResult = $sendService->fireEventBeforeMessageSend($this, $message);
if (!$eventResult->isSuccess())
{
// cancel sending by event
return $result->addErrors($eventResult->getErrors());
}
// check for empty message
if (
!$message->getMessage()
&& !$message->hasFiles()
&& !$message->getParams()->isSet(Params::ATTACH)
)
{
return $result->addError(new MessageError(MessageError::EMPTY_MESSAGE));
}
// Replacements / DateLink
if ($sendingServiceConfig->generateUrlPreview())
{
$message->parseDates();
}
// Emoji
$message->checkEmoji();
// BB codes with disk files
$message->uploadFileFromText();
// Format attached files
$message->formatFilesMessageOut();
// Save + Save Params
$saveResult = $message->save();
if (!$saveResult->isSuccess())
{
return $result->addErrors($saveResult->getErrors());
}
// Unread
$readService = new ReadService($message->getAuthorId());
$readService->markMessageUnread($message, $this->getRelations());
// Chat message counter
$this
->setLastMessageId($message->getMessageId())
->incrementMessageCount()
->save()
;
// Recent
if ($sendingServiceConfig->addRecent())
{
$readService->markRecentUnread($message);
}
// Counters
$counters = [];
if ($sendingServiceConfig->sendPush())
{
$counters = $readService->getCountersForUsers($message, $this->getRelations());
}
// fire event `im:OnAfterMessagesAdd`
$sendService->fireEventAfterMessageSend($this, $message);
// Recent
if (
$sendingServiceConfig->addRecent()
&& !$sendingServiceConfig->skipAuthorAddRecent()// Do not add author into recent list in case of self message chat.
)
{
$this->riseInRecent($message);
}
// Rich
if ($sendingServiceConfig->generateUrlPreview())
{
// generate preview or set bg job
$message->generateUrlPreview();
}
if ($this->getParentMessageId())
{
$this->updateParentMessageCount();
}
// send Push
if ($sendingServiceConfig->sendPush())
{
$pushService = new PushService($sendingServiceConfig);
$pushService->sendPushPrivateChat($this, $message, $counters);
}
// Mentions
if (!$message->isSystem())
{
$mentionService = new MentionService($sendingServiceConfig);
$mentionService->setContext($this->context);
$mentionService->sendMentions($this, $message);
}
// Run message command
$botService = new BotService($sendingServiceConfig);
$botService->setContext($this->context);
$botService->runMessageCommand($this, $message);
// Links
(new UrlService())->saveUrlsFromMessage($message);
// search
$message->updateSearchIndex();
$result->setResult(['messageId' => $message->getMessageId()]);
return $result;
}