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