static function botUpdate($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);
$clientId = $server->getClientId();
$customClientId = false;
if (!$clientId)
{
if (!empty($arParams['CLIENT_ID']))
{
$customClientId = true;
$clientId = 'custom'.$arParams['CLIENT_ID'];
}
else
{
throw new BitrixRestAccessException("Client ID not specified");
}
}
$bots = BitrixImBot::getListCache();
if (!isset($bots[$arParams['BOT_ID']]))
{
throw new BitrixRestRestException("Bot not found", "BOT_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST);
}
if ($bots[$arParams['BOT_ID']]['APP_ID'] != $clientId)
{
throw new BitrixRestRestException("Bot was installed by another rest application", "APP_ID_ERROR", CRestServer::STATUS_WRONG_REQUEST);
}
if ($customClientId)
{
$arApp = ['ID' => '', 'CLIENT_ID' => $arParams['CLIENT_ID']];
}
else
{
$dbRes = BitrixRestAppTable::getList(array('filter' => array('=CLIENT_ID' => $clientId)));
$arApp = $dbRes->fetch();
}
$updateEvents = Array();
if (isset($arParams['FIELDS']['EVENT_HANDLER']) && !empty($arParams['FIELDS']['EVENT_HANDLER']))
{
$arParams['FIELDS']['EVENT_MESSAGE_ADD'] = $arParams['FIELDS']['EVENT_MESSAGE_UPDATE'] = $arParams['FIELDS']['EVENT_MESSAGE_DELETE'] = $arParams['FIELDS']['EVENT_WELCOME_MESSAGE'] = $arParams['FIELDS']['EVENT_BOT_DELETE'] = $arParams['FIELDS']['EVENT_HANDLER'];
}
if (isset($arParams['FIELDS']['EVENT_MESSAGE_ADD']) && !empty($arParams['FIELDS']['EVENT_MESSAGE_ADD']))
{
$updateEvents['EVENT_MESSAGE_ADD'] = $arParams['FIELDS']['EVENT_MESSAGE_ADD'];
if ($customClientId)
{
$updateEvents['EVENT_MESSAGE_ADD'] = $updateEvents['EVENT_MESSAGE_ADD'].(mb_strpos($updateEvents['EVENT_MESSAGE_ADD'], '?') === false? '?': '&').'CLIENT_ID='.$arParams['CLIENT_ID'];
}
try
{
BitrixRestHandlerHelper::checkCallback($arParams['FIELDS']['EVENT_MESSAGE_ADD'], $arApp);
}
catch(Exception $e)
{
throw new BitrixRestRestException($e->getMessage(), "EVENT_MESSAGE_ADD_ERROR", CRestServer::STATUS_WRONG_REQUEST);
}
}
if (isset($arParams['FIELDS']['EVENT_MESSAGE_UPDATE']) && !empty($arParams['FIELDS']['EVENT_MESSAGE_UPDATE']))
{
$updateEvents['EVENT_MESSAGE_UPDATE'] = $arParams['FIELDS']['EVENT_MESSAGE_UPDATE'];
if ($customClientId)
{
$updateEvents['EVENT_MESSAGE_UPDATE'] = $updateEvents['EVENT_MESSAGE_UPDATE'].(mb_strpos($updateEvents['EVENT_MESSAGE_UPDATE'], '?') === false? '?': '&').'CLIENT_ID='.$arParams['CLIENT_ID'];
}
try
{
BitrixRestHandlerHelper::checkCallback($arParams['FIELDS']['EVENT_MESSAGE_UPDATE'], $arApp);
}
catch(Exception $e)
{
throw new BitrixRestRestException($e->getMessage(), "EVENT_MESSAGE_UPDATE_ERROR", CRestServer::STATUS_WRONG_REQUEST);
}
}
if (isset($arParams['FIELDS']['EVENT_MESSAGE_DELETE']) && !empty($arParams['FIELDS']['EVENT_MESSAGE_DELETE']))
{
$updateEvents['EVENT_MESSAGE_DELETE'] = $arParams['FIELDS']['EVENT_MESSAGE_DELETE'];
if ($customClientId)
{
$updateEvents['EVENT_MESSAGE_DELETE'] = $updateEvents['EVENT_MESSAGE_DELETE'].(mb_strpos($updateEvents['EVENT_MESSAGE_DELETE'], '?') === false? '?': '&').'CLIENT_ID='.$arParams['CLIENT_ID'];
}
try
{
BitrixRestHandlerHelper::checkCallback($arParams['FIELDS']['EVENT_MESSAGE_DELETE'], $arApp);
}
catch(Exception $e)
{
throw new BitrixRestRestException($e->getMessage(), "EVENT_MESSAGE_DELETE_ERROR", CRestServer::STATUS_WRONG_REQUEST);
}
}
if (isset($arParams['FIELDS']['EVENT_WELCOME_MESSAGE']) && !empty($arParams['FIELDS']['EVENT_WELCOME_MESSAGE']))
{
$updateEvents['EVENT_WELCOME_MESSAGE'] = $arParams['FIELDS']['EVENT_WELCOME_MESSAGE'];
if ($customClientId)
{
$updateEvents['EVENT_WELCOME_MESSAGE'] = $updateEvents['EVENT_WELCOME_MESSAGE'].(mb_strpos($updateEvents['EVENT_WELCOME_MESSAGE'], '?') === false? '?': '&').'CLIENT_ID='.$arParams['CLIENT_ID'];
}
try
{
BitrixRestHandlerHelper::checkCallback($arParams['FIELDS']['EVENT_WELCOME_MESSAGE'], $arApp);
}
catch(Exception $e)
{
throw new BitrixRestRestException($e->getMessage(), "EVENT_WELCOME_MESSAGE_ERROR", CRestServer::STATUS_WRONG_REQUEST);
}
}
if (isset($arParams['FIELDS']['EVENT_BOT_DELETE']) && !empty($arParams['FIELDS']['EVENT_BOT_DELETE']))
{
$updateEvents['EVENT_BOT_DELETE'] = $arParams['FIELDS']['EVENT_BOT_DELETE'];
if ($customClientId)
{
$updateEvents['EVENT_BOT_DELETE'] = $updateEvents['EVENT_BOT_DELETE'].(mb_strpos($updateEvents['EVENT_BOT_DELETE'], '?') === false? '?': '&').'CLIENT_ID='.$arParams['CLIENT_ID'];
}
try
{
BitrixRestHandlerHelper::checkCallback($arParams['FIELDS']['EVENT_BOT_DELETE'], $arApp);
}
catch(Exception $e)
{
throw new BitrixRestRestException($e->getMessage(), "EVENT_BOT_DELETE_ERROR", CRestServer::STATUS_WRONG_REQUEST);
}
}
$updateFields = Array();
if (isset($arParams['FIELDS']['CODE']) && !empty($arParams['FIELDS']['CODE']))
{
$updateFields['CODE'] = $arParams['FIELDS']['CODE'];
}
if (isset($arParams['FIELDS']['TYPE']) && !empty($arParams['FIELDS']['TYPE']) && in_array($arParams['TYPE'], Array('O', 'B', 'H')))
{
$updateFields['TYPE'] = $arParams['FIELDS']['TYPE'];
}
if (isset($arParams['FIELDS']['OPENLINE']) && !empty($arParams['FIELDS']['OPENLINE']))
{
$updateFields['OPENLINE'] = $arParams['FIELDS']['OPENLINE'];
}
$properties = Array();
if (isset($arParams['FIELDS']['PROPERTIES']['NAME']))
{
$properties['NAME'] = $arParams['FIELDS']['PROPERTIES']['NAME'];
}
if (isset($arParams['FIELDS']['PROPERTIES']['LAST_NAME']))
{
$properties['LAST_NAME'] = $arParams['FIELDS']['PROPERTIES']['LAST_NAME'];
}
if (isset($properties['NAME']) && empty($properties['NAME']) && isset($properties['LAST_NAME']) && empty($properties['LAST_NAME']))
{
throw new BitrixRestRestException("Bot name isn't specified", "NAME_ERROR", CRestServer::STATUS_WRONG_REQUEST);
}
if (isset($arParams['FIELDS']['PROPERTIES']['COLOR']))
{
$properties['COLOR'] = $arParams['FIELDS']['PROPERTIES']['COLOR'];
}
if (isset($arParams['FIELDS']['PROPERTIES']['EMAIL']))
{
$properties['EMAIL'] = $arParams['FIELDS']['PROPERTIES']['EMAIL'];
}
if (isset($arParams['FIELDS']['PROPERTIES']['PERSONAL_BIRTHDAY']))
{
$birthday = new BitrixMainTypeDateTime($arParams['FIELDS']['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['FIELDS']['PROPERTIES']['WORK_POSITION']))
{
$properties['WORK_POSITION'] = $arParams['FIELDS']['PROPERTIES']['WORK_POSITION'];
}
if (isset($arParams['FIELDS']['PROPERTIES']['PERSONAL_WWW']))
{
$properties['PERSONAL_WWW'] = $arParams['FIELDS']['PROPERTIES']['PERSONAL_WWW'];
}
if (isset($arParams['FIELDS']['PROPERTIES']['PERSONAL_GENDER']))
{
$properties['PERSONAL_GENDER'] = $arParams['FIELDS']['PROPERTIES']['PERSONAL_GENDER'];
}
if (isset($arParams['FIELDS']['PROPERTIES']['PERSONAL_PHOTO']))
{
$avatar = CRestUtil::saveFile($arParams['FIELDS']['PROPERTIES']['PERSONAL_PHOTO'], $bots[$arParams['BOT_ID']]['CODE'].'.png');
$imageCheck = (new BitrixMainFileImage($avatar["tmp_name"]))->getInfo();
if(
!$imageCheck
|| !$imageCheck->getWidth()
|| $imageCheck->getWidth() > 5000
|| !$imageCheck->getHeight()
|| $imageCheck->getHeight() > 5000
)
{
$avatar = null;
}
if ($avatar && mb_strpos($avatar['type'], "image/") === 0)
{
$avatar['MODULE_ID'] = 'imbot';
$properties['PERSONAL_PHOTO'] = $avatar;
}
}
if (!empty($properties))
{
$updateFields['PROPERTIES'] = $properties;
}
if (empty($updateFields))
{
if (empty($updateEvents))
{
throw new BitrixRestRestException("Update fields can't be empty", "WRONG_REQUEST", CRestServer::STATUS_WRONG_REQUEST);
}
}
else
{
$result = BitrixImBot::update(Array('BOT_ID' => $arParams['BOT_ID']), $updateFields);
if (!$result)
{
throw new BitrixRestRestException("Bot can't be updated", "WRONG_REQUEST", CRestServer::STATUS_WRONG_REQUEST);
}
}
if (isset($updateEvents['EVENT_MESSAGE_ADD']))
{
self::unbindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotMessageAdd', 'OnImBotMessageAdd', true);
self::bindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotMessageAdd', 'OnImBotMessageAdd', $updateEvents['EVENT_MESSAGE_ADD']);
}
if (isset($updateEvents['EVENT_MESSAGE_UPDATE']))
{
self::unbindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotMessageUpdate', 'OnImBotMessageUpdate', true);
self::bindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotMessageUpdate', 'OnImBotMessageUpdate', $updateEvents['EVENT_MESSAGE_UPDATE']);
}
if (isset($updateEvents['EVENT_MESSAGE_DELETE']))
{
self::unbindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotMessageDelete', 'OnImBotMessageDelete', true);
self::bindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotMessageDelete', 'OnImBotMessageDelete', $updateEvents['EVENT_MESSAGE_DELETE']);
}
if (isset($updateEvents['EVENT_WELCOME_MESSAGE']))
{
self::unbindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotJoinChat', 'OnImBotJoinChat', true);
self::bindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotJoinChat', 'OnImBotJoinChat', $updateEvents['EVENT_WELCOME_MESSAGE']);
}
if (isset($updateEvents['EVENT_BOT_DELETE']))
{
self::unbindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotDelete', 'OnImBotDelete', true);
self::bindEvent($arApp['ID'], $arApp['CLIENT_ID'], 'im', 'onImBotDelete', 'OnImBotDelete', $updateEvents['EVENT_BOT_DELETE']);
}
return true;
}