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;
}