• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/classes/general/im_chat.php
  • Класс: CIMChat
  • Вызов: CIMChat::DeleteUser
public function DeleteUser($chatId, $userId, $checkPermission = true, $skipMessage = false, $skipRecent = false)
{
	global $DB;
	$chatId = intval($chatId);
	$userId = intval($userId);
	if ($chatId <= 0 || $userId <= 0)
	{
		$GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_ERROR_EMPTY_USER_OR_CHAT"), "EMPTY_USER_OR_CHAT");
		return false;
	}

	if (
		!BitrixImChat::isActionAllowed('chat' . $chatId, 'LEAVE_OWNER')
		&& BitrixImChat::getOwnerById('chat' . $chatId) === $userId
	)
	{
		$GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_ERROR_LEAVE_OWNER_FORBIDDEN"), "LEAVE_OWNER_FORBIDDEN");
		return false;
	}

	$pullLoad = CModule::IncludeModule('pull');

	$strSql = "
		SELECT
			R.CHAT_ID,
			C.PARENT_MID CHAT_PARENT_MID,
			C.TITLE CHAT_TITLE,
			C.AUTHOR_ID CHAT_AUTHOR_ID,
			C.EXTRANET CHAT_EXTRANET,
			C.ENTITY_TYPE CHAT_ENTITY_TYPE,
			C.ENTITY_ID CHAT_ENTITY_ID,
			C.TYPE CHAT_TYPE
		FROM b_im_relation R LEFT JOIN b_im_chat C ON R.CHAT_ID = C.ID
		WHERE R.USER_ID = ".$userId." AND R.MESSAGE_TYPE IN ('".IM_MESSAGE_OPEN."','".IM_MESSAGE_CHAT."','".IM_MESSAGE_OPEN_LINE."') AND R.CHAT_ID = ".$chatId;
	$dbRes = $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__); $arRes = $dbRes->Fetch(); if (!$arRes) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_ERROR_USER_NOT_FOUND"), "USER_NOT_FOUND"); return false; } $chatParentMessageId = $arRes['CHAT_PARENT_MID']; $arRes['CHAT_TYPE'] = trim($arRes['CHAT_TYPE']); $chatEntityType = trim($arRes['CHAT_ENTITY_TYPE']); $chatEntityId = trim($arRes['CHAT_ENTITY_ID']); $extranetFlag = false; if (!in_array($arRes['CHAT_ENTITY_TYPE'], Array('LINES', 'LIVECHAT'))) { $extranetFlag = $arRes["CHAT_EXTRANET"] == ""? "": ($arRes["CHAT_EXTRANET"] == "Y"? true: false); } $chatTitle = BitrixImText::decodeEmoji($arRes['CHAT_TITLE']); $chatType = $arRes['CHAT_TYPE']; $chatAuthorId = intval($arRes['CHAT_AUTHOR_ID']); if ($chatAuthorId == $userId) { $strSql = " SELECT R.USER_ID FROM b_im_relation R WHERE R.CHAT_ID = ".$chatId." AND R.USER_ID <> ".$chatAuthorId; $strSql = $DB->TopSql($strSql, 1); $dbRes = $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__); if ($res = $dbRes->Fetch()) { self::SetOwner($chatId, $res['USER_ID']); } } $bSelf = true; $arUsers = Array($userId); if($this->user_id != $userId) { if ( $chatEntityType === 'VIDEOCONF' && !IMUser::getInstance($this->user_id)->isExtranet() && IMUser::getInstance($userId)->isExtranet() ) { } else if ($checkPermission && $chatAuthorId != $this->user_id) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("IM_ERROR_KICK"), "IM_ERROR_KICK"); return false; } $bSelf = false; $arUsers[] = $this->user_id; } $arOldRelation = CIMChat::GetRelationById($chatId, false, true, false); $arUsers = CIMContactList::GetUserData(array( 'ID' => array_keys($arOldRelation), 'DEPARTMENT' => 'N', 'USE_CACHE' => 'N' )); $arUsers = $arUsers['users']; if ($chatEntityType === 'VIDEOCONF') { $externalAuthId = IMUser::getInstance($userId)->getExternalAuthId(); if ($externalAuthId === 'call') { IMModelBlockUserTable::add( [ 'CHAT_ID' => $chatId, 'USER_ID' => $userId, 'BLOCK_DATE' => new SqlExpression("NOW()") ] ); } } $message = ''; if ($skipMessage) { $message = ''; } else if ($bSelf) { if (in_array($chatEntityType, ['ANNOUNCEMENT'])) { $message = ''; } else if ($chatId == self::GetGeneralChatId()) { if (self::GetGeneralChatAutoMessageStatus(self::GENERAL_MESSAGE_TYPE_LEAVE)) { $message = GetMessage("IM_CHAT_GENERAL_LEAVE_".$arUsers[$userId]['gender'], Array('#USER_NAME#' => htmlspecialcharsback($arUsers[$userId]['name']))); } } else { $message = GetMessage("IM_CHAT_LEAVE_".$arUsers[$userId]['gender'], Array('#USER_NAME#' => htmlspecialcharsback($arUsers[$userId]['name']))); } } else { $message = GetMessage("IM_CHAT_KICK_".$arUsers[$this->user_id]['gender'], Array('#USER_1_NAME#' => htmlspecialcharsback($arUsers[$this->user_id]['name']), '#USER_2_NAME#' => htmlspecialcharsback($arUsers[$userId]['name']))); } CIMContactList::DeleteRecent($chatId, true, $userId); BitrixImLastSearch::delete('chat'.$chatId, $userId); $relationList = IMModelRelationTable::getList(array( "select" => array("ID", "USER_ID"), "filter" => array( "=CHAT_ID" => $chatId, "=USER_ID" => $userId, ), )); while ($relation = $relationList->fetch()) { IMModelRelationTable::delete($relation["ID"]); if ($extranetFlag !== false) { $isExtranet = false; foreach ($arUsers as $userData) { if ($userData['id'] == $userId) continue; if ($userData['extranet']) { $isExtranet = true; break; } } if (!$isExtranet || $extranetFlag === "") { IMModelChatTable::update($chatId, Array('EXTRANET' => $isExtranet? "Y":"N")); } $extranetFlag = $isExtranet; } } if (IMUser::getInstance($userId)->isBot()) { IMBot::changeChatMembers($chatId, $userId, false); IMBot::onLeaveChat('chat'.$chatId, Array( 'CHAT_TYPE' => $chatType, 'MESSAGE_TYPE' => $chatType, 'BOT_ID' => $userId, 'USER_ID' => $this->user_id, "CHAT_AUTHOR_ID" => $chatAuthorId, "CHAT_ENTITY_TYPE" => $chatEntityType, "CHAT_ENTITY_ID" => $chatEntityId, )); } CIMDisk::ChangeFolderMembers($chatId, $userId, false); if ($message) { self::AddMessage(Array( "TO_CHAT_ID" => $chatId, "MESSAGE" => $message, "FROM_USER_ID" => $this->user_id, "SYSTEM" => 'Y', "RECENT_ADD" => $skipRecent? 'N': 'Y', "PARAMS" => Array( "CODE" => 'CHAT_LEAVE', "NOTIFY" => $chatEntityType == 'LINES'? 'Y': 'N', ), "PUSH" => 'N', "SKIP_USER_CHECK" => "Y", )); } if (!$bSelf && $chatType !== IM_MESSAGE_OPEN_LINE) { $gender = BitrixImUser::getInstance($this->user_id)->getGender(); $userName = BitrixImUser::getInstance($this->user_id)->getFullName(false); $userName = '[USER='.$this->user_id.']'.$userName.'[/USER]'; $notificationMessage = Loc::getMessage('IM_CHAT_KICK_NOTIFICATION_'. $gender, ["#USER_NAME#" => $userName]); $notificationFields = [ 'TO_USER_ID' => $userId, 'FROM_USER_ID' => 0, 'NOTIFY_TYPE' => IM_NOTIFY_SYSTEM, 'NOTIFY_MODULE' => 'im', 'NOTIFY_TITLE' => htmlspecialcharsback(BitrixMainTextEmoji::decode($arRes['CHAT_TITLE'])), 'NOTIFY_MESSAGE' => $notificationMessage, ]; CIMNotify::Add($notificationFields); } if ($chatType == IM_MESSAGE_OPEN) { CIMContactList::CleanAllChatCache(); } else { CIMContactList::CleanChatCache($userId); } $newUsersCount = $this->getChatActiveUserCount($chatId); $this->updateChatUserCount($chatId, $newUsersCount); $pushMessage = Array( 'module_id' => 'im', 'command' => 'chatUserLeave', 'params' => Array( 'dialogId' => 'chat'.$chatId, 'chatId' => (int)$chatId, 'chatTitle' => $chatTitle, 'userId' => (int)$userId, 'message' => $bSelf? '': htmlspecialcharsbx($message), 'userCount' => $newUsersCount ), 'extra' => BitrixImCommon::getPullExtra() ); if ($arRes['CHAT_ENTITY_TYPE'] == 'LINES' ) { foreach ($arOldRelation as $rel) { if ($rel["EXTERNAL_AUTH_ID"] == 'imconnector') { unset($arOldRelation[$rel["USER_ID"]]); } } } if ($pullLoad) { BitrixPullEvent::add(array_keys($arOldRelation), $pushMessage); } if ( in_array($arRes['CHAT_TYPE'], [BitrixImChat::TYPE_OPEN, BitrixImChat::TYPE_GROUP]) && $arRes['CHAT_ENTITY_TYPE'] != 'LIVECHAT' ) { self::updateChatIndex($chatId); } if (!empty($chatEntityType)) { $eventCode = str_replace('_', '', ucfirst(ucwords(mb_strtolower($chatEntityType), '_'))); foreach(GetModuleEvents("im", "OnChatUserDeleteEntityType".$eventCode, true) as $arEvent) { ExecuteModuleEventEx($arEvent, array([ 'CHAT_ID' => $chatId, 'USER_ID' => $userId, ])); } } IMV2Chat::cleanAccessCache($chatId); return true; }