• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/classes/general/im_rest.php
  • Класс: CIMRestService
  • Вызов: CIMRestService::botRegister
static function botRegister($arParams, $n, CRestServer $server)
{
	if ($server->getAuthType() == BitrixRestSessionAuthAuth::AUTH_TYPE)
	{
		throw new BitrixRestRestException("Access for this method not allowed by session authorization.", "WRONG_AUTH_TYPE", CRestServer::STATUS_FORBIDDEN);
	}

	$arParams = array_change_key_case($arParams, CASE_UPPER);

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

	if ($customClientId)
	{
		$arApp = ['ID' => '', 'CLIENT_ID' => $arParams['CLIENT_ID']];
	}
	else
	{
		$dbRes = BitrixRestAppTable::getList(array('filter' => array('=CLIENT_ID' => $clientId)));
		$arApp = $dbRes->fetch();
	}

	if (isset($arParams['EVENT_HANDLER']) && !empty($arParams['EVENT_HANDLER']))
	{
		$arParams['EVENT_MESSAGE_ADD'] = $arParams['EVENT_MESSAGE_UPDATE'] = $arParams['EVENT_MESSAGE_DELETE'] = $arParams['EVENT_WELCOME_MESSAGE'] = $arParams['EVENT_BOT_DELETE']	= $arParams['EVENT_HANDLER'];
	}

	if (isset($arParams['EVENT_MESSAGE_ADD']) && !empty($arParams['EVENT_MESSAGE_ADD']))
	{
		if ($customClientId)
		{
			$arParams['EVENT_MESSAGE_ADD'] = $arParams['EVENT_MESSAGE_ADD'].(mb_strpos($arParams['EVENT_MESSAGE_ADD'], '?') === false? '?': '&').'CLIENT_ID='.$arParams['CLIENT_ID'];
		}
		try
		{
			BitrixRestHandlerHelper::checkCallback($arParams['EVENT_MESSAGE_ADD'], $arApp);
		}
		catch(Exception $e)
		{
			throw new BitrixRestRestException($e->getMessage(), "EVENT_MESSAGE_ADD_ERROR", CRestServer::STATUS_WRONG_REQUEST);
		}
	}
	else
	{
		throw new BitrixRestRestException("Handler for "Message add" event isn't specified", "EVENT_MESSAGE_ADD_ERROR", CRestServer::STATUS_WRONG_REQUEST);
	}

	if (isset($arParams['EVENT_MESSAGE_UPDATE']) && !empty($arParams['EVENT_MESSAGE_UPDATE']))
	{
		if ($customClientId)
		{
			$arParams['EVENT_MESSAGE_UPDATE'] = $arParams['EVENT_MESSAGE_UPDATE'].(mb_strpos($arParams['EVENT_MESSAGE_UPDATE'], '?') === false? '?': '&').'CLIENT_ID='.$arParams['CLIENT_ID'];
		}
		try
		{
			BitrixRestHandlerHelper::checkCallback($arParams['EVENT_MESSAGE_UPDATE'], $arApp);
		}
		catch(Exception $e)
		{
			throw new BitrixRestRestException($e->getMessage(), "EVENT_MESSAGE_UPDATE_ERROR", CRestServer::STATUS_WRONG_REQUEST);
		}
	}

	if (isset($arParams['EVENT_MESSAGE_DELETE']) && !empty($arParams['EVENT_MESSAGE_DELETE']))
	{
		if ($customClientId)
		{
			$arParams['EVENT_MESSAGE_DELETE'] = $arParams['EVENT_MESSAGE_DELETE'].(mb_strpos($arParams['EVENT_MESSAGE_DELETE'], '?') === false? '?': '&').'CLIENT_ID='.$arParams['CLIENT_ID'];
		}
		try
		{
			BitrixRestHandlerHelper::checkCallback($arParams['EVENT_MESSAGE_DELETE'], $arApp);
		}
		catch(Exception $e)
		{
			throw new BitrixRestRestException($e->getMessage(), "EVENT_MESSAGE_DELETE_ERROR", CRestServer::STATUS_WRONG_REQUEST);
		}
	}

	if (isset($arParams['EVENT_WELCOME_MESSAGE']) && !empty($arParams['EVENT_WELCOME_MESSAGE']))
	{
		if ($customClientId)
		{
			$arParams['EVENT_WELCOME_MESSAGE'] = $arParams['EVENT_WELCOME_MESSAGE'].(mb_strpos($arParams['EVENT_WELCOME_MESSAGE'], '?') === false? '?': '&').'CLIENT_ID='.$arParams['CLIENT_ID'];
		}
		try
		{
			BitrixRestHandlerHelper::checkCallback($arParams['EVENT_WELCOME_MESSAGE'], $arApp);
		}
		catch(Exception $e)
		{
			throw new BitrixRestRestException($e->getMessage(), "EVENT_WELCOME_MESSAGE_ERROR", CRestServer::STATUS_WRONG_REQUEST);
		}
	}
	else
	{
		throw new BitrixRestRestException("Handler for "Welcome message" event isn't specified", "EVENT_WELCOME_MESSAGE_ERROR", CRestServer::STATUS_WRONG_REQUEST);
	}

	if (isset($arParams['EVENT_BOT_DELETE']) && !empty($arParams['EVENT_BOT_DELETE']))
	{
		if ($customClientId)
		{
			$arParams['EVENT_BOT_DELETE'] = $arParams['EVENT_BOT_DELETE'].(mb_strpos($arParams['EVENT_BOT_DELETE'], '?') === false? '?': '&').'CLIENT_ID='.$arParams['CLIENT_ID'];
		}
		try
		{
			BitrixRestHandlerHelper::checkCallback($arParams['EVENT_BOT_DELETE'], $arApp);
		}
		catch(Exception $e)
		{
			throw new BitrixRestRestException($e->getMessage(), "EVENT_BOT_DELETE_ERROR", CRestServer::STATUS_WRONG_REQUEST);
		}
	}
	else
	{
		throw new BitrixRestRestException("Handler for "Bot delete" event isn't specified", "EVENT_BOT_DELETE_ERROR", CRestServer::STATUS_WRONG_REQUEST);
	}

	if (!isset($arParams['CODE']) || empty($arParams['CODE']))
	{
		throw new BitrixRestRestException("Bot code isn't specified", "CODE_ERROR", CRestServer::STATUS_WRONG_REQUEST);
	}

	if (CModule::IncludeModule('bitrix24'))
	{
		$counter = BitrixImModelBotTable::getCount(array('=APP_ID' => $clientId));
		$restRegisterLimit = BitrixBitrix24Feature::getVariable('imbot_rest_register_limit')?: 5;

		if ($counter >= $restRegisterLimit)
		{
			throw new BitrixRestRestException("Has reached the maximum number of bots for application (max: $restRegisterLimit)", "MAX_COUNT_ERROR", CRestServer::STATUS_WRONG_REQUEST);
		}
	}

	$arParams['TYPE'] = in_array($arParams['TYPE'], Array('O', 'B', 'H', 'S'))? $arParams['TYPE']: 'B';
	$arParams['OPENLINE'] = $arParams['OPENLINE'] == 'Y'? 'Y': 'N';

	if (!(in_array($arParams['TYPE'], Array('S', 'O')) || $arParams['OPENLINE'] == 'Y'))
	{
		unset($arParams['EVENT_MESSAGE_UPDATE']);
		unset($arParams['EVENT_MESSAGE_DELETE']);
	}

	$properties = Array();
	if (isset($arParams['PROPERTIES']['NAME']))
	{
		$properties['NAME'] = $arParams['PROPERTIES']['NAME'];
	}
	if (isset($arParams['PROPERTIES']['LAST_NAME']))
	{
		$properties['LAST_NAME'] = $arParams['PROPERTIES']['LAST_NAME'];
	}
	if (!(isset($properties['NAME']) || isset($properties['LAST_NAME'])))
	{
		throw new BitrixRestRestException("Bot name isn't specified", "NAME_ERROR", CRestServer::STATUS_WRONG_REQUEST);
	}

	if (isset($arParams['PROPERTIES']['COLOR']))
	{
		$properties['COLOR'] = $arParams['PROPERTIES']['COLOR'];
	}
	if (isset($arParams['PROPERTIES']['EMAIL']))
	{
		$properties['EMAIL'] = $arParams['PROPERTIES']['EMAIL'];
	}
	if (isset($arParams['PROPERTIES']['PERSONAL_BIRTHDAY']))
	{
		$birthday = new BitrixMainTypeDateTime($arParams['PROPERTIES']['PERSONAL_BIRTHDAY'].' 19:45:00', 'Y-m-d H:i:s');
		$birthday = $birthday->format(BitrixMainTypeDate::convertFormatToPhp(CSite::GetDateFormat('SHORT')));

		$properties['PERSONAL_BIRTHDAY'] = $birthday;
	}
	if (isset($arParams['PROPERTIES']['WORK_POSITION']))
	{
		$properties['WORK_POSITION'] = $arParams['PROPERTIES']['WORK_POSITION'];
	}
	if (isset($arParams['PROPERTIES']['PERSONAL_WWW']))
	{
		$properties['PERSONAL_WWW'] = $arParams['PROPERTIES']['PERSONAL_WWW'];
	}
	if (isset($arParams['PROPERTIES']['PERSONAL_GENDER']))
	{
		$properties['PERSONAL_GENDER'] = $arParams['PROPERTIES']['PERSONAL_GENDER'];
	}
	if (isset($arParams['PROPERTIES']['PERSONAL_PHOTO']))
	{
		$avatar = CRestUtil::saveFile($arParams['PROPERTIES']['PERSONAL_PHOTO'], $arParams['CODE'].'.png');
		$imageCheck = (new BitrixMainFileImage($avatar["tmp_name"]))->getInfo();
		if(
			!$imageCheck
			|| !$imageCheck->getWidth()
			|| $imageCheck->getWidth() > 5000
			|| !$imageCheck->getHeight()
			|| $imageCheck->getHeight() > 5000
		)
		{
			$avatar = null;
		}

		if (isset($avatar) && mb_strpos($avatar['type'], "image/") === 0)
		{
			$avatar['MODULE_ID'] = 'imbot';
			$properties['PERSONAL_PHOTO'] = $avatar;
		}
	}

	$botId = BitrixImBot::register(Array(
										  'APP_ID' => $clientId,
										  'CODE' => $arParams['CODE'],
										  'TYPE' => $arParams['TYPE'],
										  'OPENLINE' => $arParams['OPENLINE'],
										  'MODULE_ID' => 'rest',
										  'PROPERTIES' => $properties
									  ));
	if ($botId)
	{
		self::unbindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotMessageAdd', 'OnImBotMessageAdd', true);
		self::bindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotMessageAdd', 'OnImBotMessageAdd', $arParams['EVENT_MESSAGE_ADD']);

		if ($arParams['EVENT_MESSAGE_UPDATE'])
		{
			self::unbindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotMessageUpdate', 'OnImBotMessageUpdate', true);
			self::bindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotMessageUpdate', 'OnImBotMessageUpdate', $arParams['EVENT_MESSAGE_UPDATE']);
		}

		if ($arParams['EVENT_MESSAGE_DELETE'])
		{
			self::unbindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotMessageDelete', 'OnImBotMessageDelete', true);
			self::bindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotMessageDelete', 'OnImBotMessageDelete', $arParams['EVENT_MESSAGE_DELETE']);
		}

		self::unbindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotJoinChat', 'OnImBotJoinChat', true);
		self::bindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotJoinChat', 'OnImBotJoinChat', $arParams['EVENT_WELCOME_MESSAGE']);

		self::unbindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotDelete', 'OnImBotDelete', true);
		self::bindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotDelete', 'OnImBotDelete', $arParams['EVENT_BOT_DELETE']);
	}
	else
	{
		throw new BitrixRestRestException("Bot can't be created", "WRONG_REQUEST", CRestServer::STATUS_WRONG_REQUEST);
	}

	return $botId;
}