• Модуль: imbot
  • Путь к файлу: ~/bitrix/modules/imbot/lib/bot/supportbox.php
  • Класс: BitrixImBotBotSupportBox
  • Вызов: SupportBox::onCommandAdd
static function onCommandAdd($messageId, $messageFields)
{
	$command = static::getCommandByMessage($messageFields);
	if (!$command)
	{
		return false;
	}

	if ($messageFields['COMMAND'] == self::COMMAND_ACTIVATE)
	{
		ImBot::startWriting(['BOT_ID' => self::getBotId()], $messageFields['DIALOG_ID']);

		if (self::activate())
		{
			foreach (self::getRecentDialogs() as $dialog)
			{
				if (
					$dialog['MESSAGE_ID'] > 0
					&& $dialog['MESSAGE_TYPE'] == IM_MESSAGE_PRIVATE
				)
				{
					CIMMessageParam::set($dialog['MESSAGE_ID'], [self::MESSAGE_PARAM_KEYBOARD => 'N']);
					CIMMessageParam::sendPull($dialog['MESSAGE_ID'], [self::MESSAGE_PARAM_KEYBOARD]);
				}
			}

			parent::sendMessage([
				'DIALOG_ID' => self::USER_LEVEL_ADMIN,
				'MESSAGE' => self::getMessage('ACTIVATION_SUCCESS', Loc::getMessage('SUPPORT_BOX_ACTIVATION_SUCCESS')),
				'SYSTEM' => 'N',
				'URL_PREVIEW' => 'N'
			]);
		}
		else
		{
			$error = self::getError();

			$helpDeskUrl = '';
			if (MainLoader::includeModule('ui'))
			{
				$helpDeskUrl = BitrixUIUtil::getArticleUrlByCode(self::HELP_DESK_CODE);
			}

			$message = Loc::getMessage('SUPPORT_BOX_ACTIVATION_ERROR', [
				'#ERROR#' => $error->msg,
				'#HELP_DESK#' => $helpDeskUrl,
			]);
			$keyboard = new Keyboard(self::getBotId());
			$keyboard->addButton([
				'DISPLAY' => 'LINE',
				'TEXT' =>  Loc::getMessage('SUPPORT_BOX_ACTIVATE'),
				'BG_COLOR' => '#29619b',
				'TEXT_COLOR' => '#fff',
				'BLOCK' => 'Y',
				'COMMAND' => self::COMMAND_ACTIVATE,
			]);

			parent::sendMessage([
				'DIALOG_ID' => $messageFields['DIALOG_ID'],
				'MESSAGE' => $message,
				'KEYBOARD' => $keyboard,
				'URL_PREVIEW' => 'N',
				'SYSTEM' => 'N',
			]);

			CIMMessageParam::set($messageId, [self::MESSAGE_PARAM_KEYBOARD => 'N']);
			CIMMessageParam::sendPull($messageId, [self::MESSAGE_PARAM_KEYBOARD]);
		}

		return true;
	}
	elseif ($messageFields['COMMAND'] === self::COMMAND_START_DIALOG)
	{
		$message = (new CIMChat(self::getBotId()))->getMessage($messageId);

		// duplicate message
		self::operatorMessageAdd(0, [
			'BOT_ID' => self::getBotId(),
			'BOT_CODE' => self::getBotCode(),
			'DIALOG_ID' => self::getCurrentUser()->getId(),
			'MESSAGE' => $message['MESSAGE'],
			'PARAMS' => [
				self::MESSAGE_PARAM_ALLOW_QUOTE => 'Y',
				'IMB_MENU_ACTION' => 'SKIP:MENU', /** @see BitrixImbotBotMixinMESSAGE_PARAM_MENU_ACTION */
			],
		]);

		$userGender = ImUser::getInstance(self::getCurrentUser()->getId())->getGender();
		$forward = self::getMessage('START_DIALOG_'. ($userGender == 'F' ? 'F' : 'M'));
		if (!$forward)
		{
			$forward = Loc::getMessage('SUPPORT_BOX_START_DIALOG_'. ($userGender == 'F' ? 'F' : 'M'));
		}

		CIMMessenger::add([
			'MESSAGE_TYPE' => IM_MESSAGE_CHAT,
			'SYSTEM' => 'Y',
			'FROM_USER_ID' => self::getBotId(),
			'TO_CHAT_ID' => $message['CHAT_ID'],
			'MESSAGE' => self::replacePlaceholders($forward, self::getCurrentUser()->getId()),
		]);

		// Send push command to chat switch
		ImBot::sendPullOpenDialog(self::getBotId());

		self::disableMessageButtons($messageId);

		return true;
	}
	elseif ($messageFields['COMMAND'] === MixinCOMMAND_QUEUE_NUMBER)
	{
		$sessionId = self::instanceDialogSession(self::getBotId(), $messageFields['DIALOG_ID'])->getSessionId();
		if (!$sessionId)
		{
			$lastMessages = (new CIMMessage())->getLastMessage($messageFields['FROM_USER_ID'], static::getBotId(), false, false);
			foreach ($lastMessages['message'] as $message)
			{
				if ($message['senderId'] != self::getBotId())
				{
					continue;
				}
				if (
					!$sessionId
					&& isset($message['params'], $message['params'][self::MESSAGE_PARAM_SESSION_ID])
					&& (int)$message['params'][self::MESSAGE_PARAM_SESSION_ID] > 0 //SESSION_ID
				)
				{
					$sessionId = (int)$message['params'][self::MESSAGE_PARAM_SESSION_ID];
				}
				if (isset($message['params'], $message['params'][self::MESSAGE_PARAM_IMOL_VOTE]))
				{
					break;// it is previous session
				}
			}
		}

		self::requestQueueNumber([
			'MESSAGE_ID' => $messageId,
			'BOT_ID' => self::getBotId(),
			'DIALOG_ID' => $messageFields['DIALOG_ID'],
			'SESSION_ID' => $sessionId,
		]);

		return true;
	}

	elseif (
		$messageFields['COMMAND'] === self::COMMAND_NETWORK_SESSION
		&& $messageFields['COMMAND_PARAMS'] === 'resume' /** @see MixinCOMMAND_RESUME_SESSION */
	)
	{
		if (
			self::isEnabledQuestionFunctional()
			&& !(self::instanceDialogSession(self::getBotId(), $messageFields['DIALOG_ID'])->getSessionId() > 0)
		)
		{
			self::dropMessage((int)$messageId);

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

				return false;
			}

			return true;
		}
	}

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