• Модуль: imbot
  • Путь к файлу: ~/bitrix/modules/imbot/lib/bot/support24.php
  • Класс: BitrixImBotBotSupport24
  • Вызов: Support24::onMessageAdd
static function onMessageAdd($messageId, $messageFields)
{
	if (!MainLoader::includeModule('im'))
	{
		return false;
	}

	$fromUserId = (int)$messageFields['FROM_USER_ID'];
	$dialogId = (string)$messageFields['FROM_USER_ID'];
	$isChat = (
		isset($messageFields['CHAT_ENTITY_TYPE'])
		&& $messageFields['CHAT_ENTITY_TYPE'] === self::CHAT_ENTITY_TYPE
	);
	if ($isChat)
	{
		$dialogId = 'chat'.(int)$messageFields['CHAT_ID'];
	}

	// check restrictions
	if (!self::checkMembershipRestriction($messageFields))
	{
		$groupLimited = self::getMessage('GROUP_LIMITED');
		if ($groupLimited)
		{
			self::sendMessage([
				'TO_USER_ID' => $fromUserId,
				'DIALOG_ID' => $dialogId,
				'MESSAGE' => $groupLimited,
				'SYSTEM' => 'Y',
				'URL_PREVIEW' => 'N'
			]);
		}

		(new CIMChat(self::getBotId()))->deleteUser($messageFields['CHAT_ID'], self::getBotId());

		return true;
	}

	// specialized support chats
	if (
		self::isEnabledQuestionFunctional()
		&& !(self::instanceDialogSession(self::getBotId(), $dialogId)->getSessionId() > 0)
		&& !self::allowAdditionalQuestion()
	)
	{
		self::markMessageUndelivered($messageId);

		$questionDisallowed = self::getQuestionDisallowMessage();
		if ($questionDisallowed)
		{
			self::sendMessage([
				'DIALOG_ID' => $dialogId,
				'MESSAGE' => $questionDisallowed,
				'KEYBOARD' => self::getQuestionResumeButton(),
				'URL_PREVIEW' => 'N',
				'SYSTEM' => 'Y',
			]);
		}

		return true;
	}

	$allowShowMenu = self::hasBotMenu();
	$warningRestrictionMessage = '';
	if (
		self::isActivePartnerSupport() &&
		self::isUserIntegrator($fromUserId)
	)
	{
		// check if integrator may write to support24 OL
		if (!Partner24::allowIntegratorAccessAlongSupport24())
		{
			// show message about partner OL
			$warningRestrictionMessage = self::getMessage('MESSAGE_PARTNER_INTEGRATOR');
			$allowShowMenu = false;
		}
	}
	elseif (
		self::isActivePartnerSupport() &&
		!self::isUserIntegrator($fromUserId)
	)
	{
		$warningRestrictionMessage = self::getMessage('MESSAGE_PARTNER');
		$allowShowMenu = false;
	}
	else if (self::getSupportLevel() == self::SUPPORT_LEVEL_FREE)
	{
		if (self::isActiveFreeSupport())
		{
			if (!self::isActiveFreeSupportForUser($fromUserId))
			{
				$warningRestrictionMessage = self::getMessage('MESSAGE_LIMITED');
			}
		}
		else if (!self::isUserIntegrator($fromUserId))
		{
			$warningRestrictionMessage = self::getMessage('MESSAGE_END');
		}
	}
	else if (self::getSupportLevel() == self::SUPPORT_LEVEL_PAID)
	{
		if (!self::isActivePaidSupportForUser($fromUserId))
		{
			$warningRestrictionMessage = self::getMessage('MESSAGE_LIMITED');
		}
	}

	// ITR menu on before any dialog starts
	if ($allowShowMenu)
	{
		if ((int)self::instanceDialogSession(self::getBotId(), $dialogId)->getParam('CLOSED') == 1)
		{
			self::instanceDialogSession(self::getBotId(), $dialogId)->update(['MENU_STATE' => null]);
		}

		if (!self::isMenuTrackFinished((string)$dialogId))
		{
			$lastMenuItemId = self::getBotMenu()->setDialogId($dialogId)->getLastTrackItemId();
			if (!$lastMenuItemId && !empty($warningRestrictionMessage))
			{
				// show restriction warning message first
				self::sendMessage([
					'DIALOG_ID' => $dialogId,
					'MESSAGE' => $warningRestrictionMessage,
					'URL_PREVIEW' => 'N',
				]);
			}

			if ($lastMenuItemId !== ItrMenu::MENU_EXIT_ID)
			{
				self::markMessageUndelivered($messageId);

				$undeliveredMessage = self::getMessage('MESSAGE_UNDELIVERED');
				if ($undeliveredMessage)
				{
					self::sendMessage([
						'DIALOG_ID' => $dialogId,
						'MESSAGE' => $undeliveredMessage,
						'URL_PREVIEW' => 'N',
					]);
				}

				self::showMenu([
					'DIALOG_ID' => $dialogId,
					'FULL_REDRAW' => true,
					'UNDELIVERED_MESSAGE' => $messageId
				]);

				if (!self::isMenuTrackFinished((string)$dialogId))
				{
					return false;//continue menu travel
				}
			}
		}
	}
	elseif (
		// disallow start dialog
		!empty($warningRestrictionMessage)
		// allow start dialog if greeting has been shown @see
		&& self::allowSendStartMessage(['BOT_ID' => self::getBotId(), 'DIALOG_ID' => $messageFields['DIALOG_ID']])
	)
	{
		self::markMessageUndelivered($messageId);

		// show restriction warning message
		self::sendMessage([
			'DIALOG_ID' => $dialogId,
			'MESSAGE' => $warningRestrictionMessage,
			'URL_PREVIEW' => 'N',
		]);

		return true;
	}
	elseif ($dialogId)
	{
		self::startDialogSession([
			'BOT_ID' => self::getBotId(),
			'DIALOG_ID' => $dialogId,
			'GREETING_SHOWN' => 'Y',
		]);
		self::stopMenuTrack((string)$dialogId);
	}

	// add menu action
	if ($relatedMessages = (new CIMHistory)->getRelatedMessages($messageId, 1, 0, false, false))
	{
		foreach ($relatedMessages['message'] as $message)
		{
			if (
				$message['system'] != 'Y'
				&& isset($message['params'][self::MESSAGE_PARAM_ALLOW_QUOTE])
				&& $message['params'][self::MESSAGE_PARAM_ALLOW_QUOTE] === 'Y'
			)
			{
				$messageParameters = IMModelMessageParamTable::getList([
					'select' => ['PARAM_VALUE'],
					'filter' => [
						'=MESSAGE_ID' => $message['id'],
						'=PARAM_NAME' => MixinMESSAGE_PARAM_MENU_ACTION,
					]
				]);
				if (($relatedMessageParam = $messageParameters->fetch()) && !empty($relatedMessageParam['PARAM_VALUE']))
				{
					$messageFields['PARAMS'] = $messageFields['PARAMS'] ?? [];
					$messageFields['PARAMS'][MixinMESSAGE_PARAM_MENU_ACTION] = $relatedMessageParam['PARAM_VALUE'];
				}
				break;
			}
		}
	}

	return parent::onMessageAdd($messageId, $messageFields);
}