• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/classes/general/im_call.php
  • Класс: CIMCall
  • Вызов: CIMCall::End
static function End($arParams)
{
	$arConfig['CHAT_ID'] = intval($arParams['CHAT_ID']);
	if ($arConfig['CHAT_ID'] <= 0)
		return false;

	global $DB, $USER;
	$arConfig['USER_ID'] = intval($arParams['USER_ID']) > 0? intval($arParams['USER_ID']): intval($USER->GetID());
	$arConfig['RECIPIENT_ID'] = intval($arParams['RECIPIENT_ID']);

	$arChat = CIMChat::GetChatData(Array('ID' => $arConfig['CHAT_ID'], 'USER_ID' => $USER->GetId()));
	if (empty($arChat['chat']))
		return false;

	$arUserToConnect = Array();
	$acceptUserExists = false;
	foreach ($arChat['userCallStatus'][$arConfig['CHAT_ID']] as $userId => $callStatus)
	{
		if ($userId != $arConfig['USER_ID'] && in_array($callStatus, Array(IM_CALL_STATUS_WAIT, IM_CALL_STATUS_ANSWER)))
		{
			if ($callStatus == IM_CALL_STATUS_ANSWER)
				$acceptUserExists = true;

			$arUserToConnect[] = $userId;
		}
	}

	if (!$acceptUserExists || empty($arUserToConnect) || count($arUserToConnect) == 1)
	{
		$arConfig['CLOSE_CONNECT'] = true;

		$strSql = "UPDATE b_im_chat SET CALL_TYPE = ".IM_CALL_NONE." WHERE ID = ".$arConfig['CHAT_ID'];
		$DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__); $strSql = "UPDATE b_im_relation SET CALL_STATUS = ".IM_CALL_STATUS_NONE." WHERE CHAT_ID = ".$arConfig['CHAT_ID']; $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__); } else { $arConfig['CLOSE_CONNECT'] = false; $strSql = "UPDATE b_im_relation SET CALL_STATUS = ".IM_CALL_STATUS_DECLINE." WHERE CHAT_ID = ".$arConfig['CHAT_ID']." AND USER_ID = ".$arConfig['USER_ID']; $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__); } $arConfig['CALL_TO_GROUP'] = $arChat['chat'][$arConfig['CHAT_ID']]['message_type'] != IM_MESSAGE_PRIVATE; if ($arParams['REASON'] == 'decline') { if ($arConfig['CALL_TO_GROUP']) { if ($arParams['ACTIVE'] == 'Y') { self::MessageToChat($arConfig['CHAT_ID'], $arConfig['CLOSE_CONNECT']? "IM_CALL_CHAT_CLOSE_": "IM_CALL_CHAT_END_", $arConfig['USER_ID'], true); } else { self::MessageToChat($arConfig['CHAT_ID'], $arConfig['CLOSE_CONNECT']? "IM_CALL_CHAT_CLOSE_": "IM_CALL_CHAT_G_DECLINE_", $arConfig['USER_ID'], true); } } else { if ($arParams['ACTIVE'] == 'Y') { self::MessageToPrivate($arConfig['USER_ID'], $arConfig['RECIPIENT_ID'], "IM_CALL_CHAT_END"); } else { self::MessageToPrivate($arConfig['USER_ID'], $arConfig['RECIPIENT_ID'], "IM_CALL_CHAT_DECLINE_", true); } } } else if ($arParams['REASON'] == 'busy') { if ($arConfig['CALL_TO_GROUP']) { self::MessageToChat($arConfig['CHAT_ID'], "IM_CALL_CHAT_G_BUSY_", $arConfig['USER_ID'], true); } else { self::MessageToPrivate($arConfig['USER_ID'], $arConfig['RECIPIENT_ID'], "IM_CALL_CHAT_BUSY_", true); } } else if ($arParams['REASON'] == 'waitTimeout') { if ($arConfig['CALL_TO_GROUP']) { self::MessageToChat($arConfig['CHAT_ID'], "IM_CALL_CHAT_TIMEOUT"); } else { self::MessageToPrivate($arConfig['USER_ID'], $arConfig['RECIPIENT_ID'], "IM_CALL_CHAT_WAIT", $arConfig['RECIPIENT_ID'], false); } } else if ($arParams['REASON'] == 'errorOffline') { if ($arConfig['CALL_TO_GROUP']) { self::MessageToChat($arConfig['CHAT_ID'], "IM_CALL_CHAT_TIMEOUT"); } else { self::MessageToPrivate($arConfig['RECIPIENT_ID'], $arConfig['USER_ID'], "IM_CALL_CHAT_OFFLINE", true, false); } } else if ($arParams['REASON'] == 'errorAccess') { if ($arConfig['CALL_TO_GROUP']) { self::MessageToChat($arConfig['CHAT_ID'], "IM_CALL_CHAT_ERROR_", $arConfig['USER_ID'], true); } else { self::MessageToPrivate($arConfig['USER_ID'], $arConfig['RECIPIENT_ID'], "IM_CALL_CHAT_ERROR", true, false); } } $arSend = Array(); $arSend['callToGroup'] = $arConfig['CALL_TO_GROUP']; $arSend['closeConnect'] = $arConfig['CLOSE_CONNECT']; if (isset($arParams['VIDEO'])) $arSend['video'] = $arParams['VIDEO'] == 'Y'? true: false; foreach ($arUserToConnect as $userId) { self::Command($arConfig['CHAT_ID'], $userId, $arParams['REASON'], $arSend); } if ($arParams['REASON'] == 'decline') { self::Command($arConfig['CHAT_ID'], $arConfig['USER_ID'], 'decline_self', $arSend); self::Command($arConfig['CHAT_ID'], $arConfig['RECIPIENT_ID'], 'end_call', $arSend); } if (!$arConfig['CALL_TO_GROUP'] && CModule::IncludeModule('pull') && CPullOptions::GetPushStatus()) { BitrixPullPush::add($arConfig['USER_ID'], Array( 'module_id' => 'im', 'push' => Array( 'expiry' => 0, 'advanced_params' => Array( 'notificationsToCancel' => array('IM_CALL_'. $arConfig['RECIPIENT_ID']), ), 'send_immediately' => 'Y' ) )); BitrixPullPush::add($arConfig['RECIPIENT_ID'], Array( 'module_id' => 'im', 'push' => Array( 'expiry' => 0, 'advanced_params' => Array( 'notificationsToCancel' => array('IM_CALL_'. $arConfig['USER_ID']), ), 'send_immediately' => 'Y' ) )); } return true; }