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