- Модуль: 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;
}