- Модуль: im
- Путь к файлу: ~/bitrix/modules/im/lib/command.php
- Класс: BitrixImCommand
- Вызов: Command::addMessage
static function addMessage(array $access, array $messageFields)
{
$messageId = intval($access['MESSAGE_ID']);
$commandId = intval($access['COMMAND_ID']);
$moduleId = isset($access['MODULE_ID'])? $access['MODULE_ID']: '';
$appId = isset($access['APP_ID'])? $access['APP_ID']: '';
if ($messageId <= 0 || $commandId <= 0)
return false;
$commands = self::getListCache();
if (!isset($commands[$commandId]))
return false;
if ($moduleId <> '' && $commands[$commandId]['MODULE_ID'] != $moduleId)
return false;
if ($appId <> '' && $commands[$commandId]['APP_ID'] != $appId)
return false;
$botId = intval($commands[$commandId]['BOT_ID']);
$orm = BitrixImModelMessageTable::getById($messageId);
if (!($message = $orm->fetch()))
return false;
$orm = BitrixImModelChatTable::getById($message['CHAT_ID']);
if (!($chat = $orm->fetch()))
return false;
$relations = CIMChat::GetRelationById($message['CHAT_ID'], false, true, false);
$chatWithBot = false;
foreach ($relations as $userId => $relation)
{
if ($relation['MESSAGE_TYPE'] != IM_MESSAGE_PRIVATE)
{
$messageFields['DIALOG_ID'] = 'chat'.$message['CHAT_ID'];
break;
}
if ($message['AUTHOR_ID'] == $botId)
{
$chatWithBot = true;
if ($botId != $relation['USER_ID'])
{
$messageFields['DIALOG_ID'] = $relation['USER_ID'];
break;
}
}
else if ($message['AUTHOR_ID'] != $relation['USER_ID'])
{
$messageFields['DIALOG_ID'] = $relation['USER_ID'];
break;
}
}
if ($botId > 0)
{
$grantAccess = false;
if (BotToken::isActive($botId, $messageFields['DIALOG_ID']))
{
$grantAccess = true;
}
}
else
{
$grantAccess = false;
if (preg_match_all("/^\/(?P[^\040\n]*)(\040?)(?P.*)$/m", $message['MESSAGE'], $matches))
{
foreach($matches['COMMAND'] as $idx => $cmd)
{
if ($commands[$commandId]['COMMAND'] == $cmd)
{
$grantAccess = true;
break;
}
}
}
}
if (!$grantAccess)
return true;
$messageFields['ATTACH'] = $messageFields['ATTACH']? $messageFields['ATTACH']: null;
$messageFields['KEYBOARD'] = $messageFields['KEYBOARD']? $messageFields['KEYBOARD']: null;
$messageFields['MENU'] = $messageFields['MENU']? $messageFields['MENU']: null;
if (Common::isChatId($messageFields['DIALOG_ID']))
{
$chatId = BitrixImDialog::getChatId($messageFields['DIALOG_ID']);
if ($chatId <= 0)
return false;
if (isset($relations[$botId]) && $messageFields['SYSTEM'] != 'Y')
{
$ar = Array(
"FROM_USER_ID" => $botId,
"TO_CHAT_ID" => $chatId,
"ATTACH" => $messageFields['ATTACH'],
"KEYBOARD" => $messageFields['KEYBOARD'],
"MENU" => $messageFields['MENU'],
);
if (isset($messageFields['MESSAGE']))
{
$ar['MESSAGE'] = $messageFields['MESSAGE'];
}
}
else
{
$ar = Array(
"FROM_USER_ID" => $botId,
"TO_CHAT_ID" => $chatId,
"ATTACH" => $messageFields['ATTACH'],
"KEYBOARD" => $messageFields['KEYBOARD'],
"MENU" => $messageFields['MENU'],
"SYSTEM" => 'Y',
);
if (isset($messageFields['MESSAGE']))
{
$ar['MESSAGE'] = $messageFields['MESSAGE'];
}
if ($botId > 0)
{
$ar['MESSAGE'] = Loc::getMessage("COMMAND_BOT_ANSWER", Array("#BOT_NAME#" => "[USER=".$botId."][/USER]n ")).$ar['MESSAGE'];
}
else
{
$ar['MESSAGE'] = "[B]".Loc::getMessage("COMMAND_SYSTEM_ANSWER", Array("#COMMAND#" => "/".$commands[$commandId]['COMMAND']))."[/B]n ".$ar['MESSAGE'];
}
}
if (isset($messageFields['URL_PREVIEW']) && $messageFields['URL_PREVIEW'] == 'N')
{
$ar['URL_PREVIEW'] = 'N';
}
$ar['SKIP_USER_CHECK'] = 'Y';
$ar['SKIP_COMMAND'] = 'Y';
$id = CIMChat::AddMessage($ar);
}
else
{
if ($chatWithBot)
{
$message['AUTHOR_ID'] = intval($messageFields['DIALOG_ID']);
$userId = $botId;
}
else
{
$userId = intval($messageFields['DIALOG_ID']);
}
CModule::IncludeModule('imbot');
if ($botId == $userId && $messageFields['SYSTEM'] != 'Y')
{
$ar = Array(
"FROM_USER_ID" => $userId,
"TO_USER_ID" => $message['AUTHOR_ID'],
"ATTACH" => $messageFields['ATTACH'],
"KEYBOARD" => $messageFields['KEYBOARD'],
);
if (isset($messageFields['MESSAGE']))
{
$ar['MESSAGE'] = $messageFields['MESSAGE'];
}
}
else
{
$ar = Array(
"FROM_USER_ID" => $message['AUTHOR_ID'],
"TO_USER_ID" => $userId,
"ATTACH" => $messageFields['ATTACH'],
"KEYBOARD" => $messageFields['KEYBOARD'],
"SYSTEM" => "Y",
);
if (isset($messageFields['MESSAGE']))
{
$ar['MESSAGE'] = $messageFields['MESSAGE'];
}
if ($botId > 0)
{
$ar['MESSAGE'] = Loc::getMessage("COMMAND_BOT_ANSWER", Array("#BOT_NAME#" => "[USER=".$botId."][/USER]n ")).$ar['MESSAGE'];
}
else
{
$ar['MESSAGE'] = "[B]".Loc::getMessage("COMMAND_SYSTEM_ANSWER", Array("#COMMAND#" => "/".$commands[$commandId]['COMMAND']))."[/B]n ".$ar['MESSAGE'];
}
}
if (isset($messageFields['URL_PREVIEW']) && $messageFields['URL_PREVIEW'] == 'N')
{
$ar['URL_PREVIEW'] = 'N';
}
$ar['SKIP_COMMAND'] = 'Y';
$id = CIMMessage::Add($ar);
}
return $id;
}