- Модуль: 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;
}