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

	global $DB, $USER;

	$arConfig['RECIPIENT_ID'] = intval($arParams['RECIPIENT_ID']);
	$arConfig['USER_ID'] = intval($arParams['USER_ID']) > 0? intval($arParams['USER_ID']): intval($USER->GetID());
	$arConfig['VIDEO'] = isset($arParams['VIDEO']) && $arParams['VIDEO'] == 'N'? 'N': 'Y';
	$arConfig['MOBILE'] = isset($arParams['MOBILE']) && $arParams['MOBILE'] == 'Y'? 'Y': 'N';

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

	$arConfig['CALL_TO_GROUP'] = $arChat['chat'][$arConfig['CHAT_ID']]['message_type'] != IM_MESSAGE_PRIVATE;
	$arConfig['STATUS_TYPE'] = intval($arChat['chat'][$arConfig['CHAT_ID']]['call']);

	if (!$arConfig['CALL_TO_GROUP'] && !IsModuleInstalled('intranet') && CIMSettings::GetPrivacy(CIMSettings::PRIVACY_CALL, $arConfig['RECIPIENT_ID']) == CIMSettings::PRIVACY_RESULT_CONTACT
		&& CModule::IncludeModule('socialnetwork') && CSocNetUser::IsFriendsAllowed() && !CSocNetUserRelations::IsFriends($arConfig['USER_ID'], $arConfig['RECIPIENT_ID']))
	{
		$GLOBALS["APPLICATION"]->ThrowException(GetMessage('IM_ERROR_CALL_PRIVACY'), "ERROR_FROM_PRIVACY");
		return false;
	}

	if ($arConfig['STATUS_TYPE'] != IM_CALL_NONE)
	{
		if ($arConfig['CALL_TO_GROUP'])
			self::MessageToChat($arConfig['CHAT_ID'], "IM_CALL_CHAT_START_", $arConfig['USER_ID'], true);

		$strSql = "UPDATE b_im_relation SET CALL_STATUS = ".IM_CALL_STATUS_ANSWER." WHERE CHAT_ID = ".$arConfig['CHAT_ID']." AND USER_ID = ".$arConfig['USER_ID'];
		$DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__); $arUserData = CIMContactList::GetUserData(Array('ID' => $arChat['userInChat'][$arConfig['CHAT_ID']], 'DEPARTMENT' => 'N', 'HR_PHOTO' => 'Y')); $arConfig['USER_DATA']['USERS'] = $arUserData['users']; $arConfig['USER_DATA']['HR_PHOTO'] = $arUserData['hrphoto']; 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))) $arUserToConnect[$userId] = $callStatus; } $arConfig['USERS_CONNECT'] = $arUserToConnect; $arSend['users'] = $arUserData['users']; $arSend['hrphoto'] = $arUserData['hrphoto']; $arSend['video'] = $arConfig['VIDEO'] == 'Y'? true: false; $arSend['callToGroup'] = $arConfig['CALL_TO_GROUP']; if ($arConfig['CALL_TO_GROUP']) { $arSend['chat'] = $arChat['chat']; } $arSend['userChatBlockStatus'] = $arChat['userChatBlockStatus']; $arSend['userInChat'] = $arChat['userInChat']; foreach ($arChat['userCallStatus'][$arConfig['CHAT_ID']] as $userId => $callStatus) { if ($userId != $arConfig['USER_ID'] && !in_array($callStatus, Array(IM_CALL_STATUS_DECLINE))) { self::Command($arConfig['CHAT_ID'], $userId, 'invite_join', $arSend); } } } else { if ($arConfig['CALL_TO_GROUP']) self::MessageToChat($arConfig['CHAT_ID'], "IM_CALL_CHAT_INIT_", $arConfig['USER_ID'], true); $strSql = "UPDATE b_im_chat SET CALL_TYPE = ".($arConfig['VIDEO'] == 'Y'? IM_CALL_VIDEO: IM_CALL_AUDIO)." WHERE ID = ".$arConfig['CHAT_ID']; $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__); $strSql = "UPDATE b_im_relation SET CALL_STATUS = ".IM_CALL_STATUS_ANSWER." WHERE CHAT_ID = ".$arConfig['CHAT_ID']." AND USER_ID = ".$arConfig['USER_ID']; $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__); $arUserToConnect = Array(); foreach ($arChat['userCallStatus'][$arConfig['CHAT_ID']] as $userId => $callStatus) { if ($userId != $arConfig['USER_ID']) $arUserToConnect[$userId] = $callStatus; } $arUserData = CIMContactList::GetUserData(Array('ID' => $arChat['userInChat'][$arConfig['CHAT_ID']], 'DEPARTMENT' => 'N', 'HR_PHOTO' => 'Y')); $arSend['users'] = $arUserData['users']; $arSend['hrphoto'] = $arUserData['hrphoto']; $arSend['video'] = $arConfig['VIDEO'] == 'Y'; $arSend['callToGroup'] = $arConfig['CALL_TO_GROUP']; if ($arConfig['CALL_TO_GROUP']) { $arSend['chat'] = $arChat['chat']; } $arSend['userChatBlockStatus'] = $arChat['userChatBlockStatus']; $arSend['userInChat'] = $arChat['userInChat']; $arSend['isMobile'] = $arConfig['MOBILE'] == 'Y'; foreach ($arUserToConnect as $userId => $callStatus) self::Command($arConfig['CHAT_ID'], $userId, 'invite', $arSend); $arConfig['USER_DATA']['USERS'] = $arUserData['users']; $arConfig['USER_DATA']['HR_PHOTO'] = $arUserData['hrphoto']; if (!$arConfig['CALL_TO_GROUP'] && CModule::IncludeModule('pull') && CPullOptions::GetPushStatus()) { $arSelect = Array("ID", "LAST_NAME", "NAME", "LOGIN", "SECOND_NAME"); $dbUsers = CUser::GetList('', '', array('ID_EQUAL_EXACT' => $USER->GetID()), array('FIELDS' => $arSelect)); if ($arUser = $dbUsers->GetNext(true, false)) { $sName = BitrixImUser::formatFullNameFromDatabase($arUser); $pushText = GetMessage('IM_CALL_INVITE', Array('#USER_NAME#' => $sName)); } else { $pushText = GetMessage('IM_CALL_INVITE', Array('#USER_NAME#' => GetMessage('IM_CALL_INVITE_NA'))); } $pushParams = $arSend; $pushParams['senderId'] = (int)$USER->GetID(); $pushParams['chatId'] = $arConfig['CHAT_ID']; BitrixPullPush::add(array_keys($arUserToConnect), Array( 'module_id' => 'im', 'push' => Array( 'message' => $pushText, 'expiry' => 0, 'params' => array( 'ACTION' => 'IMINV_'. $USER->GetID()."_".time()."_".$arConfig['VIDEO'], 'PARAMS' => $pushParams ), 'advanced_params' => Array( 'id' => 'IM_CALL_'.$USER->GetID(), 'notificationsToCancel' => array('IM_CALL_'.$USER->GetID()), 'androidHighPriority' => true, 'useVibration'=>true ), 'app_id' => 'Bitrix24', 'sound'=>'call.aif', 'send_immediately' => 'Y' ) )); } } foreach(GetModuleEvents("im", "OnCallStart", true) as $arEvent) ExecuteModuleEventEx($arEvent, array($arConfig)); return $arConfig; }