• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/lib/bot.php
  • Класс: BitrixImBot
  • Вызов: Bot::register
static function register(array $fields)
{
	$code = isset($fields['CODE'])? $fields['CODE']: '';
	$type = in_array($fields['TYPE'], [self::TYPE_HUMAN, self::TYPE_BOT, self::TYPE_SUPERVISOR, self::TYPE_NETWORK, self::TYPE_OPENLINE])
		? $fields['TYPE']
		: self::TYPE_BOT;
	$moduleId = $fields['MODULE_ID'];
	$installType = in_array($fields['INSTALL_TYPE'], [self::INSTALL_TYPE_SYSTEM, self::INSTALL_TYPE_USER, self::INSTALL_TYPE_SILENT])
		? $fields['INSTALL_TYPE']
		: self::INSTALL_TYPE_SILENT;
	$botFields = $fields['PROPERTIES'];
	$language = isset($fields['LANG'])? $fields['LANG']: null;

	/* vars for module install */
	$class = isset($fields['CLASS'])? $fields['CLASS']: '';
	$methodBotDelete = isset($fields['METHOD_BOT_DELETE'])? $fields['METHOD_BOT_DELETE']: '';
	$methodMessageAdd = isset($fields['METHOD_MESSAGE_ADD'])? $fields['METHOD_MESSAGE_ADD']: '';
	$methodMessageUpdate = isset($fields['METHOD_MESSAGE_UPDATE'])? $fields['METHOD_MESSAGE_UPDATE']: '';
	$methodMessageDelete = isset($fields['METHOD_MESSAGE_DELETE'])? $fields['METHOD_MESSAGE_DELETE']: '';
	$methodWelcomeMessage = isset($fields['METHOD_WELCOME_MESSAGE'])? $fields['METHOD_WELCOME_MESSAGE']: '';
	$textPrivateWelcomeMessage = isset($fields['TEXT_PRIVATE_WELCOME_MESSAGE'])? $fields['TEXT_PRIVATE_WELCOME_MESSAGE']: '';
	$textChatWelcomeMessage = isset($fields['TEXT_CHAT_WELCOME_MESSAGE'])? $fields['TEXT_CHAT_WELCOME_MESSAGE']: '';
	$openline = isset($fields['OPENLINE']) && $fields['OPENLINE'] == 'Y'? 'Y': 'N';

	/* rewrite vars for openline type */
	if ($type == self::TYPE_OPENLINE)
	{
		$openline = 'Y';
		$installType = self::INSTALL_TYPE_SILENT;
	}

	/* vars for rest install */
	$appId = isset($fields['APP_ID'])? $fields['APP_ID']: '';
	$verified = isset($fields['VERIFIED']) && $fields['VERIFIED'] == 'Y'? 'Y': 'N';

	if ($moduleId == 'rest')
	{
		if (empty($appId))
		{
			return false;
		}
	}
	else
	{
		if (empty($class) || empty($methodMessageAdd))
		{
			return false;
		}
		if (!(!empty($methodWelcomeMessage) || isset($fields['TEXT_PRIVATE_WELCOME_MESSAGE'])))
		{
			return false;
		}
	}

	$bots = self::getListCache();
	if ($moduleId && $code)
	{
		foreach ($bots as $bot)
		{
			if ($bot['MODULE_ID'] == $moduleId && $bot['CODE'] == $code)
			{
				return $bot['BOT_ID'];
			}
		}
	}

	$userCode = $code? $moduleId.'_'.$code: $moduleId;

	$color = null;
	if (isset($botFields['COLOR']))
	{
		$color = $botFields['COLOR'];
		unset($botFields['COLOR']);
	}

	$userId = 0;
	if ($installType == self::INSTALL_TYPE_USER)
	{
		if (isset($fields['USER_ID']) && intval($fields['USER_ID']) > 0)
		{
			$userId = intval($fields['USER_ID']);
		}
		else
		{
			global $USER;
			if (is_object($USER))
			{
				$userId = $USER->GetID() > 0? $USER->GetID(): 0;
			}
		}
		if ($userId <= 0)
		{
			$installType = self::INSTALL_TYPE_SYSTEM;
		}
	}

	if ($moduleId == '')
	{
		return false;
	}

	if (!(isset($botFields['NAME']) || isset($botFields['LAST_NAME'])))
	{
		return false;
	}

	$botFields['LOGIN'] = mb_substr(self::LOGIN_START. mb_substr($userCode, 0, 40). '_'. randString(5), 0, 50);
	$botFields['PASSWORD'] = md5($botFields['LOGIN'].'|'.rand(1000,9999).'|'.time());
	$botFields['CONFIRM_PASSWORD'] = $botFields['PASSWORD'];
	$botFields['EXTERNAL_AUTH_ID'] = self::EXTERNAL_AUTH_ID;

	unset($botFields['GROUP_ID']);

	$botFields['ACTIVE'] = 'Y';

	unset($botFields['UF_DEPARTMENT']);

	$botFields['WORK_POSITION'] = isset($botFields['WORK_POSITION'])? trim($botFields['WORK_POSITION']): '';
	if (empty($botFields['WORK_POSITION']))
	{
		$botFields['WORK_POSITION'] = Loc::getMessage('BOT_DEFAULT_WORK_POSITION');
	}

	$user = new CUser;
	$botId = $user->Add($botFields);
	if (!$botId)
	{
		return false;
	}

	$result = BitrixImModelBotTable::add(Array(
		'BOT_ID' => $botId,
		'CODE' => $code? $code: $botId,
		'MODULE_ID' => $moduleId,
		'CLASS' => $class,
		'TYPE' => $type,
		'LANG' => $language? $language: '',
		'METHOD_BOT_DELETE' => $methodBotDelete,
		'METHOD_MESSAGE_ADD' => $methodMessageAdd,
		'METHOD_MESSAGE_UPDATE' => $methodMessageUpdate,
		'METHOD_MESSAGE_DELETE' => $methodMessageDelete,
		'METHOD_WELCOME_MESSAGE' => $methodWelcomeMessage,
		'TEXT_PRIVATE_WELCOME_MESSAGE' => $textPrivateWelcomeMessage,
		'TEXT_CHAT_WELCOME_MESSAGE' => $textChatWelcomeMessage,
		'APP_ID' => $appId,
		'VERIFIED' => $verified,
		'OPENLINE' => $openline
	));

	$cache = BitrixMainDataCache::createInstance();
	$cache->cleanDir(self::CACHE_PATH);

	if ($result->isSuccess())
	{
		if (BitrixMainLoader::includeModule('pull'))
		{
			if ($color)
			{
				CIMStatus::SetColor($botId, $color);
			}

			self::sendPullNotify($botId, 'botAdd');

			if ($installType != self::INSTALL_TYPE_SILENT)
			{
				$message = '';
				if ($installType == self::INSTALL_TYPE_USER && BitrixImUser::getInstance($userId)->isExists())
				{
					$userName = '[USER='.$userId.'][/USER]';
					$userGender = BitrixImUser::getInstance($userId)->getGender();
					$message = Loc::getMessage('BOT_MESSAGE_INSTALL_USER'.($userGender == 'F'? '_F':''), Array('#USER_NAME#' => $userName));
				}
				if (empty($message))
				{
					$message = Loc::getMessage('BOT_MESSAGE_INSTALL_SYSTEM');
				}

				$attach = new CIMMessageParamAttach(null, $color);
				$attach->AddBot(Array(
					"NAME" => BitrixImUser::getInstance($botId)->getFullName(),
					"AVATAR" => BitrixImUser::getInstance($botId)->getAvatar(),
					"BOT_ID" => $botId,
				));
				$attach->addMessage(BitrixImUser::getInstance($botId)->getWorkPosition());

				CIMChat::AddGeneralMessage(Array(
					'MESSAGE' => $message,
					'ATTACH' => $attach,
					'SKIP_USER_CHECK' => 'Y',
				));
			}
		}

		BitrixMainApplication::getInstance()->getTaggedCache()->clearByTag("IM_CONTACT_LIST");
	}
	else
	{
		$user->Delete($botId);
		$botId = 0;
	}

	return $botId;
}