• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/lib/call/conference.php
  • Класс: BitrixImCallConference
  • Вызов: Conference::update
public function update(array $fields = []): Result
{
	$result = new Result();

	if (!static::isEnvironmentConfigured())
	{
		return $result->addError(
			new Error(
				Loc::getMessage('IM_CALL_CONFERENCE_ERROR_ENVIRONMENT_CONFIG'),
				'ENVIRONMENT_CONFIG_ERROR'
			)
		);
	}

	$validationResult = static::validateFields($fields);
	if (!$validationResult->isSuccess())
	{
		return $result->addErrors($validationResult->getErrors());
	}
	$updateData = $validationResult->getData()['FIELDS'];

	if (!isset($fields['ID']))
	{
		return $result->addError(
			new Error(
				Loc::getMessage('IM_CALL_CONFERENCE_ERROR_ID_NOT_PROVIDED'),
				'CONFERENCE_ID_EMPTY'
			)
		);
	}

	$updateData = $this->getChangedFields($updateData);
	if (empty($updateData))
	{
		return $result;
	}
	$updateData['ID'] = $fields['ID'];

	if (!isset($fields['PASSWORD']))
	{
		unset($updateData['VIDEOCONF']['PASSWORD']);
	}

	global $USER;
	$chat = new CIMChat($USER->GetID());

	//Chat update
	if ($updateData['TITLE'])
	{
		$renameResult = $chat->Rename($this->getChatId(), $updateData['TITLE']);

		if (!$renameResult)
		{
			return $result->addError(
				new Error(
					Loc::getMessage('IM_CALL_CONFERENCE_ERROR_RENAMING_CHAT'),
					'CONFERENCE_RENAMING_ERROR'
				)
			);
		}

		$this->chatName = $updateData['TITLE'];
	}

	//Adding users
	if (isset($updateData['NEW_USERS']))
	{
		//check user count
		$userLimit = $this->getUserLimit();

		$currentUserCount = CIMChat::getUserCount($this->chatId);
		$newUserCount = $currentUserCount + count($updateData['NEW_USERS']);
		if (isset($updateData['DELETED_USERS']))
		{
			$newUserCount -= count($updateData['DELETED_USERS']);
		}

		if ($newUserCount > $userLimit)
		{
			return $result->addError(
				new Error(
					Loc::getMessage('IM_CALL_CONFERENCE_ERROR_MAX_USERS'),
					'USER_LIMIT_ERROR'
				)
			);
		}

		foreach ($updateData['NEW_USERS'] as $newUser)
		{
			$addingResult = $chat->AddUser($this->getChatId(), $newUser);

			if (!$addingResult)
			{
				return $result->addError(
					new Error(
						Loc::getMessage('IM_CALL_CONFERENCE_ERROR_ADDING_USERS'),
						'ADDING_USER_ERROR'
					)
				);
			}
		}
	}

	//Deleting users
	if (isset($updateData['DELETED_USERS']))
	{
		foreach ($updateData['DELETED_USERS'] as $deletedUser)
		{
			$addingResult = $chat->DeleteUser($this->getChatId(), $deletedUser);

			if (!$addingResult)
			{
				return $result->addError(
					new Error(
						Loc::getMessage('IM_CALL_CONFERENCE_ERROR_DELETING_USERS'),
						'DELETING_USER_ERROR'
					)
				);
			}
		}
	}

	//Conference update
	if (isset($updateData['VIDEOCONF']))
	{
		if (isset($updateData['VIDEOCONF']['IS_BROADCAST']))
		{
			CIMChat::SetChatParams($this->getChatId(), [
				'ENTITY_DATA_1' => $updateData['VIDEOCONF']['IS_BROADCAST'] === 'Y'? self::BROADCAST_MODE: ''
			]);
		}

		$updateResult = ConferenceTable::update($updateData['ID'], $updateData['VIDEOCONF']);

		if (!$updateResult->isSuccess())
		{
			return $result->addErrors($updateResult->getErrors());
		}
	}

	//update presenters
	if (isset($updateData['NEW_PRESENTERS']) && !empty($updateData['NEW_PRESENTERS']))
	{
		$setManagers = [];
		foreach ($updateData['NEW_PRESENTERS'] as $newPresenter)
		{
			$this->makePresenter($newPresenter);
			$setManagers[$newPresenter] = true;
		}
		$chat->SetManagers($this->getChatId(), $setManagers, false);
	}

	if (isset($updateData['DELETED_PRESENTERS']) && !empty($updateData['DELETED_PRESENTERS']))
	{
		$removeManagers = [];
		foreach ($updateData['DELETED_PRESENTERS'] as $deletedPresenter)
		{
			$this->deletePresenter($deletedPresenter);
			$removeManagers[$deletedPresenter] = false;
		}
		$chat->SetManagers($this->getChatId(), $removeManagers, false);
	}

	// delete presenters if we change mode to normal
	if (isset($updateData['VIDEOCONF']['IS_BROADCAST']) && $updateData['VIDEOCONF']['IS_BROADCAST'] === 'N')
	{
		$presentersList = $this->getPresentersList();
		foreach ($presentersList as $presenter)
		{
			$this->deletePresenter($presenter);
		}
	}

	// send pull
	$isPullNeeded = isset($updateData['VIDEOCONF']['IS_BROADCAST']) || isset($updateData['NEW_PRESENTERS']) || isset($updateData['DELETED_PRESENTERS']);
	if ($isPullNeeded && Loader::includeModule("pull"))
	{
		$relations = CIMChat::GetRelationById($this->getChatId(), false, true, false);
		$pushMessage = [
			'module_id' => 'im',
			'command' => 'conferenceUpdate',
			'params' => [
				'chatId' => $this->getChatId(),
				'isBroadcast' => isset($updateData['VIDEOCONF']['IS_BROADCAST']) ? $updateData['VIDEOCONF']['IS_BROADCAST'] === 'Y' : '',
				'presenters' => $this->getPresentersList()
			],
			'extra' => BitrixImCommon::getPullExtra()
		];
		BitrixPullEvent::add(array_keys($relations), $pushMessage);
	}

	return $result;
}