• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/classes/general/im_rest.php
  • Класс: CIMRestService
  • Вызов: CIMRestService::messageAdd
static function messageAdd($arParams, $n, CRestServer $server)
{
	global $USER;

	$arParams = array_change_key_case($arParams, CASE_UPPER);

	if (isset($arParams['MESSAGE']))
	{
		if (!is_string($arParams['MESSAGE']))
		{
			throw new BitrixRestRestException("Wrong message type", "MESSAGE_EMPTY", CRestServer::STATUS_WRONG_REQUEST);
		}

		$arParams['MESSAGE'] = trim($arParams['MESSAGE']);

		if ($arParams['MESSAGE'] == '' && empty($arParams['ATTACH']))
		{
			throw new BitrixRestRestException("Message can't be empty", "MESSAGE_EMPTY", CRestServer::STATUS_WRONG_REQUEST);
		}
	}
	else if (!isset($arParams['ATTACH']))
	{
		throw new BitrixRestRestException("Message can't be empty", "MESSAGE_EMPTY", CRestServer::STATUS_WRONG_REQUEST);
	}

	if (isset($arParams['DIALOG_ID']))
	{
		if (BitrixImCommon::isChatId($arParams['DIALOG_ID']))
		{
			$arParams['CHAT_ID'] = BitrixImDialog::getChatId($arParams['DIALOG_ID']);
		}
		else
		{
			$arParams['USER_ID'] = intval($arParams['DIALOG_ID']);
		}
	}

	$arParams['FROM_USER_ID'] = $USER->GetId();
	if (isset($arParams['USER_ID']))
	{
		$arParams['USER_ID'] = intval($arParams['USER_ID']);
		if ($arParams['USER_ID'] <= 0)
		{
			throw new BitrixRestRestException("User ID can't be empty", "USER_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST);
		}

		if (!BitrixImUser::getInstance($arParams['USER_ID'])->isExists())
		{
			throw new BitrixRestRestException("User not found", "USER_NOT_FOUND", CRestServer::STATUS_WRONG_REQUEST);
		}

		$arMessageFields = Array(
			"MESSAGE_TYPE" => IM_MESSAGE_PRIVATE,
			"FROM_USER_ID" => $arParams['FROM_USER_ID'],
			"DIALOG_ID" => $arParams['USER_ID'],
		);
	}
	else if (isset($arParams['CHAT_ID']))
	{
		$arParams['CHAT_ID'] = intval($arParams['CHAT_ID']);
		if ($arParams['CHAT_ID'] <= 0)
		{
			throw new BitrixRestRestException("Chat ID can't be empty", "CHAT_ID_EMPTY", CRestServer::STATUS_WRONG_REQUEST);
		}

		if (
			CIMChat::GetGeneralChatId() == $arParams['CHAT_ID']
			&& !CIMChat::CanSendMessageToGeneralChat($arParams['FROM_USER_ID'])
		)
		{
			throw new BitrixRestRestException("Action unavailable", "ACCESS_ERROR", CRestServer::STATUS_FORBIDDEN);
		}

		if (!Chat::isActionAllowed('chat' . $arParams['CHAT_ID'], 'SEND'))
		{
			throw new BitrixRestRestException('It is forbidden to send messages to this chat', 'ACCESS_ERROR', CRestServer::STATUS_FORBIDDEN);
		}

		if (isset($arParams['SYSTEM']) && $arParams['SYSTEM'] == 'Y')
		{
			$clientId = $server->getClientId();
			if ($clientId)
			{
				$result = BitrixRestAppTable::getList(
					array(
						'filter' => array(
							'=CLIENT_ID' => $clientId
						),
						'select' => array(
							'CODE',
							'APP_NAME',
							'APP_NAME_DEFAULT' => 'LANG_DEFAULT.MENU_NAME',
						)
					)
				);
				$result = $result->fetch();
				$moduleName = !empty($result['APP_NAME'])
					? $result['APP_NAME']
					: (!empty($result['APP_NAME_DEFAULT'])
						? $result['APP_NAME_DEFAULT']
						: $result['CODE']
					)
				;

				$arParams['MESSAGE'] = "[b]".$moduleName."[/b]n".$arParams['MESSAGE'];
			}
		}

		$arMessageFields = Array(
			"MESSAGE_TYPE" => IM_MESSAGE_CHAT,
			"FROM_USER_ID" => $arParams['FROM_USER_ID'],
			"DIALOG_ID" => 'chat'.$arParams['CHAT_ID'],
		);
	}
	else
	{
		throw new BitrixRestRestException("Incorrect params", "PARAMS_ERROR", CRestServer::STATUS_WRONG_REQUEST);
	}

	if (isset($arParams['MESSAGE']))
	{
		$arMessageFields["MESSAGE"]	= $arParams['MESSAGE'];
	}

	$attach = CIMMessageParamAttach::GetAttachByJson($arParams['ATTACH']);
	if ($attach)
	{
		if ($attach->IsAllowSize())
		{
			$arMessageFields['ATTACH'] = $attach;
		}
		else
		{
			throw new BitrixRestRestException("You have exceeded the maximum allowable size of attach", "ATTACH_OVERSIZE", CRestServer::STATUS_WRONG_REQUEST);
		}
	}
	else if ($arParams['ATTACH'])
	{
		throw new BitrixRestRestException("Incorrect attach params", "ATTACH_ERROR", CRestServer::STATUS_WRONG_REQUEST);
	}

	if (isset($arParams['KEYBOARD']) && !empty($arParams['KEYBOARD']))
	{
		$keyboard = Array();
		if (is_string($arParams['KEYBOARD']))
		{
			$arParams['KEYBOARD'] = CUtil::JsObjectToPhp($arParams['KEYBOARD']);
		}
		if (!isset($arParams['KEYBOARD']['BUTTONS']))
		{
			$keyboard['BUTTONS'] = $arParams['KEYBOARD'];
		}
		else
		{
			$keyboard = $arParams['KEYBOARD'];
		}
		$keyboard['BOT_ID'] = $arParams['BOT_ID'];

		$keyboard = BitrixImBotKeyboard::getKeyboardByJson($keyboard);
		if ($keyboard)
		{
			$arMessageFields['KEYBOARD'] = $keyboard;
		}
		else
		{
			throw new BitrixRestRestException("Incorrect keyboard params", "KEYBOARD_ERROR", CRestServer::STATUS_WRONG_REQUEST);
		}
	}

	if (isset($arParams['MENU']) && !empty($arParams['MENU']))
	{
		$menu = Array();
		if (is_string($arParams['MENU']))
		{
			$arParams['MENU'] = CUtil::JsObjectToPhp($arParams['MENU']);
		}
		if (!isset($arParams['MENU']['ITEMS']))
		{
			$menu['ITEMS'] = $arParams['MENU'];
		}
		else
		{
			$menu = $arParams['MENU'];
		}
		$menu['BOT_ID'] = $arParams['BOT_ID'];

		$menu = BitrixImBotContextMenu::getByJson($menu);
		if ($menu)
		{
			$arMessageFields['MENU'] = $menu;
		}
		else
		{
			throw new BitrixRestRestException("Incorrect menu params", "MENU_ERROR", CRestServer::STATUS_WRONG_REQUEST);
		}
	}

	if (
		isset($arParams['SYSTEM']) && $arParams['SYSTEM'] == 'Y'
		&& $server->getAuthType() !== BitrixRestSessionAuthAuth::AUTH_TYPE
		&& BitrixImDialog::hasAccess($arMessageFields['DIALOG_ID'])
	)
	{
		$arMessageFields['SYSTEM'] = 'Y';
	}

	if (isset($arParams['URL_PREVIEW']) && $arParams['URL_PREVIEW'] == 'N')
	{
		$arMessageFields['URL_PREVIEW'] = 'N';
	}
	if (isset($arParams['SKIP_CONNECTOR']) && mb_strtoupper($arParams['SKIP_CONNECTOR']) == 'Y')
	{
		$arMessageFields['SKIP_CONNECTOR'] = 'Y';
		$arMessageFields['SILENT_CONNECTOR'] = 'Y';
	}
	if (isset($arParams['TEMPLATE_ID']) && !empty($arParams['TEMPLATE_ID']))
	{
		$arMessageFields['TEMPLATE_ID'] = mb_substr((string)$arParams['TEMPLATE_ID'], 0, 255);
	}
	if (isset($arParams['REPLY_ID']) && (int)$arParams['REPLY_ID'] > 0)
	{
		$message = new BitrixImV2Message((int)$arParams['REPLY_ID']);
		if (!$message->hasAccess())
		{
			throw new BitrixRestRestException("Action unavailable", "REPLY_ACCESS_ERROR", CRestServer::STATUS_FORBIDDEN);
		}
		if ($message->getChat()->getDialogId() !== (string)$arMessageFields['DIALOG_ID'])
		{
			throw new BitrixRestRestException("You can only reply to a message within the same chat", "REPLY_FROM_OTHER_CHAT_ERROR", CRestServer::STATUS_FORBIDDEN);
		}
		$arMessageFields['PARAMS']['REPLY_ID'] = $message->getId();
	}

	$id = CIMMessenger::Add($arMessageFields);
	if (!$id)
	{
		throw new BitrixRestRestException("Message isn't added", "PARAMS_ERROR", CRestServer::STATUS_WRONG_REQUEST);
	}

	return (int)$id;

}