• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/lib/V2/Chat/GroupChat.php
  • Класс: BitrixImV2ChatGroupChat
  • Вызов: GroupChat::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())
		->setNotifyModule('im')
		->setNotifyEvent(Notify::EVENT_GROUP)
	;

	// 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());
	}

	// 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));
	}

	if ($sendingServiceConfig->keepConnectorSilence())
	{
		$message->getParams()->get(Params::STYLE_CLASS)->setValue('bx-messenger-content-item-system');
	}


	// 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());
	}

	$sendService->updateMessageUuid($message);

	// 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->sendPushGroupChat($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;
}