• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/classes/general/im_chat.php
  • Класс: CIMChat
  • Вызов: CIMChat::Add
public function Add($arParams)
{
	$type = '';
	if (isset($arParams['MESSAGE_TYPE']))
	{
		$type = $arParams['MESSAGE_TYPE'];
	}
	elseif (isset($arParams['TYPE']))
	{
		$type = $arParams['MESSAGE_TYPE'] = $arParams['TYPE'];
	}

	$arParams['USER_ID'] = $this->user_id;

	$authorId = $arParams['USER_ID'];
	if (isset($arParams['AUTHOR_ID']))
	{
		$authorId = intval($arParams['AUTHOR_ID']);
	}

	if (isset($arParams['OWNER_ID']))
	{
		$authorId = intval($arParams['OWNER_ID']);
	}

	if ($authorId)
	{
		$arParams['AUTHOR_ID'] = $authorId;
	}

	if (isset($arParams['AVATAR_ID']))
	{
		$arParams['AVATAR'] = (int) $arParams['AVATAR_ID'];
	}

	$chatResult = IMV2ChatChatFactory::getInstance()->addChat($arParams);
	if (!$chatResult->isSuccess() || !$chatResult->hasResult())
	{
		return false;
	}

	if (isset($arParams['MESSAGE']))
	{
		$message = trim($arParams['MESSAGE']);
	}

	if (isset($message) && $message)
	{
		if ($type === IMV2Chat::IM_TYPE_PRIVATE)
		{
			CIMMessage::Add([
				"FROM_USER_ID" => $this->user_id,
				"TO_USER_ID" => $this->user_id,
				"MESSAGE" => $message,
			]);
		}
		else
		{
			self::AddMessage([
				"TO_CHAT_ID" => $chatResult->getResult()['CHAT_ID'],
				"FROM_USER_ID" => $this->user_id,
				"SYSTEM" => $this->user_id ? 'N' : 'Y',
				"MESSAGE" => $message,
			]);
		}
	}

	$chat = $chatResult->getResult()['CHAT'];

	CIMContactList::CleanAllChatCache();

	return $chat->getChatId();

	/**
	global $DB;

	$chatTitle = '';
	if (isset($arParams['TITLE']))
		$chatTitle = trim($arParams['TITLE']);

	$chatDescription = '';
	if (isset($arParams['DESCRIPTION']))
		$chatDescription = trim($arParams['DESCRIPTION']);

	$userId = Array();
	if (isset($arParams['USERS']))
		$userId = $arParams['USERS'];

	$callNumber = '';
	if (isset($arParams['CALL_NUMBER']))
		$callNumber = $arParams['CALL_NUMBER'];

	$avatarId = 0;
	if (isset($arParams['AVATAR_ID']))
		$avatarId = intval($arParams['AVATAR_ID']);

	$authorId = $this->user_id;
	if (isset($arParams['AUTHOR_ID']))
		$authorId = intval($arParams['AUTHOR_ID']);

	if (isset($arParams['OWNER_ID']))
		$authorId = intval($arParams['OWNER_ID']);

	$parentId = 0;
	if (isset($arParams['PARENT_ID']))
		$parentId = intval($arParams['PARENT_ID']);

	$parentMid = 0;
	if (isset($arParams['PARENT_MID']))
		$parentMid = intval($arParams['PARENT_MID']);

	$pinMessageId = 0;
	if (isset($arParams['PIN_MESSAGE_ID']))
		$pinMessageId = intval($arParams['PIN_MESSAGE_ID']);

	$managers = array();
	if (isset($arParams['MANAGERS']))
		$managers = $arParams['MANAGERS'];

	$entityType = '';
	if (isset($arParams['ENTITY_TYPE']))
		$entityType = $arParams['ENTITY_TYPE'];

	$entityId = '';
	if (isset($arParams['ENTITY_ID']))
		$entityId = $arParams['ENTITY_ID'];

	$entityData1 = '';
	if (isset($arParams['ENTITY_DATA_1']))
		$entityData1 = $arParams['ENTITY_DATA_1'];

	$entityData2 = '';
	if (isset($arParams['ENTITY_DATA_2']))
		$entityData2 = $arParams['ENTITY_DATA_2'];

	$entityData3 = '';
	if (isset($arParams['ENTITY_DATA_3']))
		$entityData3 = $arParams['ENTITY_DATA_3'];

	$message = '';
	if (isset($arParams['MESSAGE']))
		$message = trim($arParams['MESSAGE']);

	$color = '';
	if (isset($arParams['COLOR']) && IMColor::isSafeColor($arParams['COLOR']))
		$color = $arParams['COLOR'];

	$skipAddMessage = isset($arParams['SKIP_ADD_MESSAGE']) && $arParams['SKIP_ADD_MESSAGE'] === 'Y';

	$type = IM_MESSAGE_CHAT;

	if (isset($arParams['TYPE']) && in_array($arParams['TYPE'], Array(IM_MESSAGE_OPEN, IM_MESSAGE_CHAT, IM_MESSAGE_PRIVATE, IM_MESSAGE_OPEN_LINE)))
	{
		if (!CIMMessenger::CheckEnableOpenChat() && $arParams['TYPE'] == IM_MESSAGE_OPEN)
		{
			$type = IM_MESSAGE_CHAT;
		}
		else if ($this->user_id == 0 || !IMUser::getInstance($this->user_id)->isExtranet())
		{
			$type = $arParams['TYPE'];
		}
	}

	$skipUserAdd = false;
	if ($userId === false)
	{
		$skipUserAdd = true;
	}

	$arUserId = Array();
	if ($this->user_id > 0)
	{
		$arUserId[$this->user_id] = $this->user_id;
	}

	if (is_array($userId))
	{
		$arUserId += CIMContactList::PrepareUserIds($userId);
	}
	else if (intval($userId) > 0)
	{
		$arUserId[intval($userId)] = intval($userId);
	}

	if (!$skipUserAdd)
	{
		if (count($arUserId) < 1)
		{
			$GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_ERROR_MIN_USER"), "MIN_USER");
			return false;
		}

		if (false && count($arUserId) > 500)
		{
			$GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_ERROR_MAX_USER", Array('#COUNT#' => 500)), "MAX_USER");
			return false;
		}

		if (
			$entityType != 'PERSONAL'
			&& !IsModuleInstalled('intranet')
			&& CModule::IncludeModule('socialnetwork')
			&& CSocNetUser::IsFriendsAllowed()
		)
		{
			$arFriendUsers = Array();
			$dbFriends = CSocNetUserRelations::GetList(array(),array("USER_ID" => $this->user_id, "RELATION" => SONET_RELATIONS_FRIEND), false, false, array("ID", "FIRST_USER_ID", "SECOND_USER_ID", "DATE_CREATE", "DATE_UPDATE", "INITIATED_BY"));
			while ($arFriends = $dbFriends->Fetch())
			{
				$friendId = $this->user_id == $arFriends["FIRST_USER_ID"]? $arFriends["SECOND_USER_ID"]: $arFriends["FIRST_USER_ID"];
				$arFriendUsers[$friendId] = $friendId;
			}
			foreach ($arUserId as $id => $userId)
			{
				if ($userId == $this->user_id)
					continue;

				if (!isset($arFriendUsers[$userId]) && CIMSettings::GetPrivacy(CIMSettings::PRIVACY_CHAT, $userId) == CIMSettings::PRIVACY_RESULT_CONTACT)
					unset($arUserId[$id]);
			}

			if (count($arUserId) <= 1)
			{
				$GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_ERROR_MIN_USER_BY_PRIVACY"), "MIN_USER_BY_PRIVACY");
				return false;
			}
		}
	}

	$arUsers = CIMContactList::GetUserData(array(
		'ID' => array_values($arUserId),
		'DEPARTMENT' => 'N',
		'USE_CACHE' => 'N'
	));
	$arUsers = is_array($arUsers['users'])? $arUsers['users']: Array();

	$arUsersName = Array();

	if ($chatDescription == '' && $type == IM_MESSAGE_OPEN)
	{
		$chatDescription = $message;
	}

	$chatColorCode = "";
	if ($entityType === 'VIDEOCONF')
	{
		CGlobalCounter::Increment('im_videoconf_count', CGlobalCounter::ALL_SITES, false);
		$videoconfCount = CGlobalCounter::GetValue('im_videoconf_count', CGlobalCounter::ALL_SITES);

		if ($videoconfCount === 999)
		{
			CGlobalCounter::Set('im_videoconf_count', 1, CGlobalCounter::ALL_SITES, '', false);
		}
	}
	else if (IMColor::isEnabled())
	{
		if ($color)
		{
			$chatColorCode = $color;
		}
		else
		{
			CGlobalCounter::Increment('im_chat_color_id', CGlobalCounter::ALL_SITES, false);
			$chatColorId = CGlobalCounter::GetValue('im_chat_color_id', CGlobalCounter::ALL_SITES);
			$chatColorCode = BitrixImColor::getCodeByNumber($chatColorId);
			CGlobalCounter::Increment('im_chat_color_'.$chatColorCode, CGlobalCounter::ALL_SITES, false);
		}

		$chatColorCodeCount = CGlobalCounter::GetValue('im_chat_color_'.$chatColorCode, CGlobalCounter::ALL_SITES);
		if ($chatColorCodeCount == 99)
		{
			CGlobalCounter::Set('im_chat_color_'.$chatColorCode, 1, CGlobalCounter::ALL_SITES, '', false);
		}
	}

	if ($chatTitle == "")
	{
		if ($entityType === 'VIDEOCONF')
		{
			$chatTitle = GetMessage('IM_VIDEOCONF_NAME_FORMAT_NEW', [
				'#NUMBER#' => $videoconfCount
			]);
		}
		else if (IMColor::isEnabled())
		{
			$chatTitle = GetMessage('IM_CHAT_NAME_FORMAT', Array(
				'#COLOR#' => BitrixImColor::getName($chatColorCode),
				'#NUMBER#' => $chatColorCodeCount+1,
			));
		}
		else
		{
			foreach ($arUserId as $userId)
			{
				$arUsersName[$userId] = htmlspecialcharsback($arUsers[$userId]['name']);
			}

			$chatTitle = implode(', ', $arUsersName);
		}
	}

	$isExtranet = false;
	if (!in_array($entityType, Array('LINES', 'LIVECHAT')))
	{
		foreach ($arUsers as $userData)
		{
			if ($userData['extranet'])
			{
				$isExtranet = true;
				break;
			}
		}
	}

	$result = IMModelChatTable::add(Array(
		"PARENT_ID"	=> $parentId,
		"PARENT_MID" => $parentMid,
		"PIN_MESSAGE_ID" => $pinMessageId,
		"TITLE"	=> mb_substr($chatTitle, 0, 255),
		"DESCRIPTION" => $chatDescription,
		"TYPE"	=> $type,
		"COLOR"	=> $chatColorCode,
		"AVATAR"	=> $avatarId,
		"AUTHOR_ID"	=> $authorId,
		"ENTITY_TYPE" => $entityType,
		"ENTITY_ID" => $entityId,
		"ENTITY_DATA_1" => $entityData1,
		"ENTITY_DATA_2" => $entityData2,
		"ENTITY_DATA_3" => $entityData3,
		"EXTRANET" => $isExtranet? 'Y': 'N',
		"CALL_NUMBER" => $callNumber,
		"USER_COUNT" => count($arUsers)
	));

	$publicLink = '';
	$chatId = $result->getId();
	if (!$result->isSuccess())
	{
		$errors = $result->getErrors();
		if (!empty($errors))
		{
			$firstError = $errors[0];
			$GLOBALS["APPLICATION"]->ThrowException($firstError->getMessage(), $firstError->getCode());
		}
		return false;
	}

	if ($chatId > 0)
	{
		$params = $result->getData();

		if (intval($params['AVATAR']) > 0)
			$this->lastAvatarId = $params['AVATAR'];

		$arUsersName = Array();
		foreach ($arUserId as $userId)
		{
			if ($userId != $this->user_id)
				$arUsersName[$userId] = htmlspecialcharsback($arUsers[$userId]['name']);

			ImModelRelationTable::add(array(
				"CHAT_ID" => $chatId,
				"MESSAGE_TYPE" => $params['TYPE'],
				"USER_ID" => $userId,
				//"STATUS" => IM_STATUS_READ,
				"MANAGER" => $authorId == $userId || isset($managers[$userId]) ? 'Y' : 'N',
			));

			if ($params['TYPE'] != IM_MESSAGE_OPEN)
			{
				CIMContactList::CleanChatCache($userId);
			}
		}
		if ($params['TYPE'] == IM_MESSAGE_OPEN)
		{
			CIMContactList::CleanAllChatCache();
		}

		$generalChatId = self::GetGeneralChatId();
		if (false && $params['TYPE'] == IM_MESSAGE_OPEN && $generalChatId > 0) // disabled auto-posting in general chat about new open chan
		{
			$attach = new CIMMessageParamAttach(null, BitrixImColor::getColor($chatColorCode));
			$attach->AddChat(Array(
				"NAME" => $params['TITLE'],
				"CHAT_ID" => $chatId
			));
			$attach->AddMessage($params['DESCRIPTION']);

			if ($this->user_id > 0 && !$skipAddMessage)
			{
				$createText = GetMessage("IM_GENERAL_CREATE_BY_USER_NEW", Array('#USER_NAME#' => htmlspecialcharsback($arUsers[$this->user_id]['name'])));
			}
			else
			{
				$createText = GetMessage("IM_GENERAL_CREATE_NEW");
			}

			self::AddMessage(Array(
				"TO_CHAT_ID" => $generalChatId,
				"FROM_USER_ID" => $this->user_id,
				"MESSAGE" => $createText,
				"SYSTEM" => 'Y',
				"ATTACH" => $attach
			));
		}

		if ($entityType === 'VIDEOCONF')
		{
			$aliasData = $arParams['VIDEOCONF']['ALIAS_DATA'];
			IMModelAliasTable::update($aliasData['ID'], [
				'ENTITY_ID' => $chatId
			]);

			$conferenceData = [
				'ALIAS_ID' => $aliasData['ID']
			];

			if (isset($arParams['VIDEOCONF']['PASSWORD']))
			{
				$conferenceData['PASSWORD'] = $arParams['VIDEOCONF']['PASSWORD'];
			}

			if (isset($arParams['VIDEOCONF']['INVITATION']))
			{
				$conferenceData['INVITATION'] = $arParams['VIDEOCONF']['INVITATION'];
			}

			$conferenceData['IS_BROADCAST'] = isset($arParams['VIDEOCONF']['IS_BROADCAST']) && $arParams['VIDEOCONF']['IS_BROADCAST'] === 'Y'? 'Y': 'N';

			$creationResult = IMModelConferenceTable::add($conferenceData);
			if (isset($arParams['VIDEOCONF']['PRESENTERS']))
			{
				foreach ($arParams['VIDEOCONF']['PRESENTERS'] as $presenter)
				{
					IMModelConferenceUserRoleTable::add([
						'CONFERENCE_ID' => $creationResult->getId(),
				  		'USER_ID' => $presenter,
				  		'ROLE' => ImCallConference::ROLE_PRESENTER
				  	]);
				}
			}

			$attach = new CIMMessageParamAttach(null, BitrixImColor::getColor($chatColorCode));
			$attach->AddLink([
				"NAME" => $aliasData['LINK'],
				"DESC" => GetMessage("IM_VIDEOCONF_SHARE_LINK"),
				"LINK" => $aliasData['LINK']
			]);

			$keyboard = new BitrixImBotKeyboard();
			$keyboard->addButton(
				[
					"TEXT" => GetMessage("IM_VIDEOCONF_COPY_LINK"),
					"ACTION" => "COPY",
					"ACTION_VALUE" => $aliasData['LINK'],
					"DISPLAY" => "LINE",
					"BG_COLOR" => "#A4C31E",
					"TEXT_COLOR" => "#FFF"
				]
			);

			self::AddMessage([
				"TO_CHAT_ID" => $chatId,
				"SYSTEM" => 'Y',
				"FROM_USER_ID" => $this->user_id,
				"MESSAGE" => GetMessage("IM_VIDEOCONF_LINK_TITLE"),
				"ATTACH" => $attach,
				"KEYBOARD" => $keyboard
			]);
		}

		if ($message)
		{
			if ($params['TYPE'] == IM_MESSAGE_PRIVATE)
			{
				if ($params['ENTITY_TYPE'] == 'PERSONAL')
				{
					CUserOptions::SetOption('im', 'personalChat', $chatId, false, $this->user_id);
				}
				CIMMessage::Add(Array(
					"FROM_USER_ID" => $this->user_id,
					"TO_USER_ID" => $this->user_id,
					"MESSAGE" 	 => $message,
				));
			}
			else
			{
				self::AddMessage(Array(
					"TO_CHAT_ID" => $chatId,
					"FROM_USER_ID" => $this->user_id,
					"SYSTEM" => $this->user_id? 'N': 'Y',
					"MESSAGE" 	 => $message,
				));
			}
		}
		else if ($params['TYPE'] == IM_MESSAGE_OPEN && !$skipUserAdd)
		{
			if ($this->user_id > 0)
			{
				$createText = GetMessage("IM_CHAT_CREATE_OPEN_".$arUsers[$this->user_id]['gender']."_NEW", Array('#USER_NAME#' => htmlspecialcharsback($arUsers[$this->user_id]['name']), '#CHAT_TITLE#' => $params['TITLE']));
			}
			else
			{
				$createText = GetMessage("IM_CHAT_CREATE_OPEN_NEW", Array('#CHAT_TITLE#' => $params['TITLE']));
			}

			self::AddMessage(Array(
				"TO_CHAT_ID" => $chatId,
				"FROM_USER_ID" => $this->user_id,
				"MESSAGE" 	 => $createText,
				"SYSTEM"	 => 'Y',
			));
		}

		if (isset($arUsers[$this->user_id]) && count($arUsersName) >= 1 && !$skipUserAdd && !$skipAddMessage)
		{
			self::AddMessage(Array(
				"TO_CHAT_ID" => $chatId,
				"FROM_USER_ID" => $this->user_id,
				"MESSAGE" 	 => GetMessage("IM_CHAT_JOIN_".$arUsers[$this->user_id]['gender'], Array('#USER_1_NAME#' => htmlspecialcharsback($arUsers[$this->user_id]['name']), '#USER_2_NAME#' => implode(', ', $arUsersName))),
				"SYSTEM"	 => 'Y',
			));
		}

		foreach ($arUserId as $userId)
		{
			if (IMUser::getInstance($userId)->isBot())
			{
				IMBot::changeChatMembers($chatId, $userId);
				IMBot::onJoinChat('chat'.$chatId, Array(
					'CHAT_TYPE' => $type,
					'MESSAGE_TYPE' => $type,
					'BOT_ID' => $userId,
					'USER_ID' => $this->user_id,
					"CHAT_AUTHOR_ID"	=> $authorId,
					"CHAT_ENTITY_TYPE" => $entityType,
					"CHAT_ENTITY_ID" => $entityId,
					"ACCESS_HISTORY" => true,
				));
			}
		}

		self::addChatIndex((int)$chatId, mb_substr($chatTitle, 0, 255));
	}
	else
	{
		$GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_IM_ERROR_EMPTY_USER_OR_CHAT"), "ERROR_OF_CREATE_CHAT");
		return false;
	}

	return $chatId;
	*/
}