• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/lib/command.php
  • Класс: BitrixImCommand
  • Вызов: Command::onCommandAdd
static function onCommandAdd($messageId, $messageFields)
{
	$skipCommand = $messageFields['SKIP_COMMAND'] ?? null;
	$isSystem = $messageFields['SYSTEM'] ?? null;

	if ($skipCommand === 'Y' || $isSystem === 'Y')
	{
		return true;
	}

	$commands = self::getListCache();
	if (empty($commands))
	{
		return false;
	}

	$commandList = Array();
	$message = $messageFields['MESSAGE'] ?? null;
	if (preg_match_all("/^\/(?P[^\040\n]*)(\040?)(?P.*)$/m", $message, $matches))
	{
		foreach($matches['COMMAND'] as $idx => $cmd)
		{
			$commandData = self::findCommands(Array('COMMAND' => $cmd, 'EXEC_PARAMS' => $matches['PARAMS'][$idx], 'MESSAGE_FIELDS' => $messageFields));
			if (!$commandData)
			{
				continue;
			}

			$commandList = array_merge($commandList, $commandData);
		}
	}
	if (empty($commandList))
	{
		return false;
	}

	$messageFields['DIALOG_ID'] = self::getDialogId($messageFields);
	unset(
		$messageFields['MESSAGE_OUT'],
		$messageFields['NOTIFY_EVENT'],
		$messageFields['NOTIFY_MODULE'],
		$messageFields['URL_PREVIEW']
	);

	$count = 0;
	$executed = Array();
	foreach ($commandList as $params)
	{
		if (!$params['MODULE_ID'] || !BitrixMainLoader::includeModule($params['MODULE_ID']))
		{
			continue;
		}
		$hash = md5($params['EXEC_PARAMS'].$params['COMMAND_ID']);
		if (isset($executed[$hash]) && $executed[$hash])
		{
			continue;
		}
		$executed[$hash] = true;

		if ($count >= 10)
		{
			break;
		}
		$count++;

		if ($params['BOT_ID'] > 0)
		{
			BotToken::add($params['BOT_ID'], $messageFields['DIALOG_ID']);
			if ($messageFields['MESSAGE_TYPE'] == IM_MESSAGE_PRIVATE)
			{
				BotToken::add($params['BOT_ID'], $messageFields['TO_USER_ID']);
			}
		}

		$messageFields['COMMAND'] = $params['COMMAND'];
		$messageFields['COMMAND_ID'] = $params['COMMAND_ID'];
		$messageFields['COMMAND_PARAMS'] = $params['EXEC_PARAMS'];

		if ($params["METHOD_COMMAND_ADD"] && class_exists($params["CLASS"]) && method_exists($params["CLASS"], $params["METHOD_COMMAND_ADD"]))
		{
			if ($params['BOT_ID'] > 0)
			{
				BitrixImModelBotTable::update($params['BOT_ID'], array(
					"COUNT_COMMAND" => new BitrixMainDBSqlExpression("?# + 1", "COUNT_COMMAND")
				));
			}

			call_user_func_array(array($params["CLASS"], $params["METHOD_COMMAND_ADD"]), Array($messageId, $messageFields));
		}
	}
	unset(
		$messageFields['COMMAND'],
		$messageFields['COMMAND_ID'],
		$messageFields['COMMAND_PARAMS'],
		$messageFields['COMMAND_CONTEXT']
	);

	foreach(BitrixMainEventManager::getInstance()->findEventHandlers("im", "onImCommandAdd") as $event)
	{
		ExecuteModuleEventEx($event, Array($commandList, $messageId, $messageFields));
	}

	return true;
}