• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/lib/bot.php
  • Класс: BitrixImBot
  • Вызов: Bot::onMessageAdd
static function onMessageAdd($messageId, $messageFields)
{
	$botExecModule = self::getBotsForMessage($messageFields);
	if (!$botExecModule)
	{
		return true;
	}

	if ($messageFields['MESSAGE_TYPE'] != IM_MESSAGE_PRIVATE)
	{
		$messageFields['MESSAGE_ORIGINAL'] = $messageFields['MESSAGE'];
		if (preg_match("/[USER=([0-9]+)( REPLACE)?](.*?)[/USER]/i", $messageFields['MESSAGE'], $matches))
		{
			$messageFields['TO_USER_ID'] = $matches[1];
		}
		else
		{
			$messageFields['TO_USER_ID'] = 0;
		}
		$messageFields['MESSAGE'] = trim(preg_replace('#[(?PUSER)=d+].+?[/(?P=tag)],?#', '', $messageFields['MESSAGE']));
	}

	$messageFields['DIALOG_ID'] = self::getDialogId($messageFields);
	$messageFields = self::removeFieldsToEvent($messageFields);

	foreach ($botExecModule as $params)
	{
		if (!$params['MODULE_ID'] || !BitrixMainLoader::includeModule($params['MODULE_ID']))
		{
			continue;
		}

		$messageFields['BOT_ID'] = $params['BOT_ID'];

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

			call_user_func_array(array($params["CLASS"], $params["METHOD_MESSAGE_ADD"]), Array($messageId, $messageFields));
		}
		else if (class_exists($params["CLASS"]) && method_exists($params["CLASS"], "onMessageAdd"))
		{
			call_user_func_array(array($params["CLASS"], "onMessageAdd"), Array($messageId, $messageFields));
		}
	}
	unset($messageFields['BOT_ID']);

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

	if (
		$messageFields['CHAT_ENTITY_TYPE'] == 'LINES'
		&& trim($messageFields['MESSAGE']) === '0'
		&& BitrixMainLoader::includeModule('imopenlines')
	)
	{
		$chat = new BitrixImopenlinesChat($messageFields['TO_CHAT_ID']);
		$chat->endBotSession();
	}

	return true;
}