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

	$clientId = $server->getClientId();
	if (!$clientId)
	{
		if (!empty($arParams['CLIENT_ID']))
		{
			$clientId = 'custom'.$arParams['CLIENT_ID'];
		}
		else
		{
			throw new BitrixRestAccessException("Client ID not specified");
		}
	}

	$bots = BitrixImBot::getListCache();
	if (isset($arParams['BOT_ID']))
	{
		if (!isset($bots[$arParams['BOT_ID']]))
		{
			throw new BitrixRestRestException("Bot not found", "BOT_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST);
		}
		if ($clientId && $bots[$arParams['BOT_ID']]['APP_ID'] != $clientId)
		{
			throw new BitrixRestRestException("Bot was installed by another rest application", "APP_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST);
		}
	}
	else
	{
		$botFound = false;
		foreach ($bots as $bot)
		{
			if ($bot['APP_ID'] == $clientId)
			{
				$botFound = true;
				$arParams['BOT_ID'] = $bot['BOT_ID'];
				break;
			}
		}
		if (!$botFound)
		{
			throw new BitrixRestRestException("Bot not found", "BOT_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST);
		}
	}

	$arParams['MESSAGE_ID'] = intval($arParams['MESSAGE_ID']);
	if ($arParams['MESSAGE_ID'] <= 0)
	{
		throw new BitrixRestRestException("Message ID can't be empty", "MESSAGE_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST);
	}

	$message = null;
	if (isset($arParams['ATTACH']))
	{
		$message = CIMMessenger::CheckPossibilityUpdateMessage(IM_CHECK_UPDATE, $arParams['MESSAGE_ID'], $arParams['BOT_ID']);
		if (!$message)
		{
			throw new BitrixRestRestException("Time has expired for modification or you don't have access", "CANT_EDIT_MESSAGE", CRestServer::STATUS_FORBIDDEN);
		}

		if (empty($arParams['ATTACH']) || $arParams['ATTACH'] == 'N')
		{
			CIMMessageParam::Set($arParams['MESSAGE_ID'], Array('ATTACH' => Array()));
		}
		else
		{
			$attach = CIMMessageParamAttach::GetAttachByJson($arParams['ATTACH']);
			if ($attach)
			{
				if ($attach->IsAllowSize())
				{
					CIMMessageParam::Set($arParams['MESSAGE_ID'], Array('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']))
	{
		if (is_null($message))
		{
			$message = CIMMessenger::CheckPossibilityUpdateMessage(IM_CHECK_UPDATE, $arParams['MESSAGE_ID'], $arParams['BOT_ID']);
		}
		if (!$message)
		{
			throw new BitrixRestRestException("Time has expired for modification or you don't have access", "CANT_EDIT_MESSAGE", CRestServer::STATUS_FORBIDDEN);
		}

		if (empty($arParams['KEYBOARD']) || $arParams['KEYBOARD'] == 'N')
		{
			CIMMessageParam::Set($arParams['MESSAGE_ID'], Array('KEYBOARD' => 'N'));
		}
		else
		{
			$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)
			{
				if ($keyboard->isAllowSize())
				{
					CIMMessageParam::Set($arParams['MESSAGE_ID'], Array('KEYBOARD' => $keyboard));
				}
				else
				{
					throw new BitrixRestRestException("You have exceeded the maximum allowable size of keyboard", "KEYBOARD_OVERSIZE", CRestServer::STATUS_WRONG_REQUEST);
				}
			}
			else if ($arParams['KEYBOARD'])
			{
				throw new BitrixRestRestException("Incorrect keyboard params", "KEYBOARD_ERROR", CRestServer::STATUS_WRONG_REQUEST);
			}
		}
	}

	if (isset($arParams['MENU']))
	{
		if (is_null($message))
		{
			$message = CIMMessenger::CheckPossibilityUpdateMessage(IM_CHECK_UPDATE, $arParams['MESSAGE_ID'], $arParams['BOT_ID']);
		}
		if (!$message)
		{
			throw new BitrixRestRestException("Time has expired for modification or you don't have access", "CANT_EDIT_MESSAGE", CRestServer::STATUS_FORBIDDEN);
		}

		if (empty($arParams['MENU']) || $arParams['MENU'] == 'N')
		{
			CIMMessageParam::Set($arParams['MESSAGE_ID'], Array('MENU' => 'N'));
		}
		else
		{
			$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)
			{
				if ($menu->isAllowSize())
				{
					CIMMessageParam::Set($arParams['MESSAGE_ID'], Array('MENU' => $menu));
				}
				else
				{
					throw new BitrixRestRestException("You have exceeded the maximum allowable size of menu", "MENU_OVERSIZE", CRestServer::STATUS_WRONG_REQUEST);
				}
			}
			else if ($arParams['MENU'])
			{
				throw new BitrixRestRestException("Incorrect menu params", "menu_ERROR", CRestServer::STATUS_WRONG_REQUEST);
			}
		}
	}

	if (isset($arParams['MESSAGE']))
	{
		$urlPreview = isset($arParams['URL_PREVIEW']) && $arParams['URL_PREVIEW'] == "N"? false: true;
		$skipConnector = isset($arParams['SKIP_CONNECTOR']) && mb_strtoupper($arParams['SKIP_CONNECTOR']) == "Y"? true: false;

		$res = CIMMessenger::Update($arParams['MESSAGE_ID'], $arParams['MESSAGE'], $urlPreview, false, $arParams['BOT_ID'], $skipConnector);
		if (!$res)
		{
			throw new BitrixRestRestException("Time has expired for modification or you don't have access", "CANT_EDIT_MESSAGE", CRestServer::STATUS_FORBIDDEN);
		}
	}

	CIMMessageParam::SendPull($arParams['MESSAGE_ID'], Array('KEYBOARD', 'ATTACH', 'MENU'));

	return true;
}