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

	if ($messageFields['COMMAND'] === self::COMMAND_SUPPORT24)
	{
		$messageParams = [];

		if ($messageFields['COMMAND_PARAMS'] === self::COMMAND_ACTIVATE_PARTNER)
		{
			$keyboard = new Keyboard(self::getBotId());
			$keyboard->addButton([
				"DISPLAY" => "LINE",
				"TEXT" => self::getMessage('PARTNER_BUTTON_MANAGE'),
				"LINK" => self::getMessage('PARTNER_BUTTON_MANAGE_URL'),
				"CONTEXT" => "DESKTOP",
			]);
			$messageParams[self::MESSAGE_PARAM_KEYBOARD] = $keyboard;

			$attach = new CIMMessageParamAttach(null, CIMMessageParamAttach::NORMAL);
			$attach->addMessage(self::getMessage('PARTNER_REQUEST_PROCESSED'));
			$messageParams[self::MESSAGE_PARAM_ATTACH] = $attach;

			$result = Partner24::acceptRequest($messageFields['FROM_USER_ID']);
			if (!$result)
			{
				return false;
			}
		}
		else
		{
			if ($messageFields['COMMAND_PARAMS'] === self::COMMAND_DEACTIVATE_PARTNER)
			{
				Partner24::deactivate($messageFields['FROM_USER_ID']);

				$attach = new CIMMessageParamAttach(null, CIMMessageParamAttach::NORMAL);
				$attach->addMessage(self::getMessage('PARTNER_REQUEST_PROCESSED'));
				$messageParams[self::MESSAGE_PARAM_ATTACH] = $attach;
			}
			elseif ($messageFields['COMMAND_PARAMS'] === self::COMMAND_DECLINE_PARTNER_REQUEST)
			{
				Partner24::declineRequest($messageFields['FROM_USER_ID']);

				$attach = new CIMMessageParamAttach(null, CIMMessageParamAttach::PROBLEM);
				$attach->addMessage(self::getMessage('PARTNER_REQUEST_REJECTED'));
				$messageParams[self::MESSAGE_PARAM_ATTACH] = $attach;
			}
			$messageParams[self::MESSAGE_PARAM_KEYBOARD] = 'N';
		}

		CIMMessageParam::set($messageId, $messageParams);
		CIMMessageParam::sendPull($messageId, [self::MESSAGE_PARAM_ATTACH, 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',
				MixinMESSAGE_PARAM_MENU_ACTION => 'SKIP:MENU',
			],
		]);

		$userGender = ImUser::getInstance(self::getCurrentUser()->getId())->getGender();
		$forward = self::getMessage('START_DIALOG_'. ($userGender == 'F' ? 'F' : 'M'));
		if (!$forward)
		{
			$forward = Loc::getMessage('SUPPORT24_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'] === ItrMenu::COMMAND_MENU)
	{
		if (
			self::isEnabledQuestionFunctional()
			&& !(self::instanceDialogSession(self::getBotId(), $messageFields['DIALOG_ID'])->getSessionId() > 0)
		)
		{
			if ($messageFields['COMMAND_PARAMS'] === MixinCOMMAND_RESUME_SESSION)
			{
				self::dropMessage((int)$messageId);

				// restart itr
				if (self::hasBotMenu())
				{
					self::showMenu([
						'DIALOG_ID' => $messageFields['DIALOG_ID'],
						'FULL_REDRAW' => true,
					]);
				}

				return true;
			}

			// block only redirect on operator
			if (
				self::isQuitMenuCommand($messageFields)
				&& !self::allowAdditionalQuestion()
			)
			{
				self::resetMenuState($messageFields['DIALOG_ID']);

				static::disableMessageButtons((int)$messageId);

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

				return false;
			}
		}

		self::handleMenuCommand($messageId, $messageFields);

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