• Модуль: imopenlines
  • Путь к файлу: ~/bitrix/modules/imopenlines/lib/chat.php
  • Класс: BitrixImOpenLinesChat
  • Вызов: Chat::setOperators
public function setOperators($users = [], $sessionId = 0): bool
{
	$result = false;

	if(
		$this->isDataLoaded() &&
		is_array($users)
	)
	{
		$users = array_unique($users);
		$addUsers = $users;

		$delete = [];
		$relationList = RelationTable::getList([
			"select" => [
				'ID',
				'USER_ID'
			],
			"filter" => [
				"=CHAT_ID" => $this->chat['ID']
			],
		]);

		while ($relation = $relationList->fetch())
		{
			if(Queue::isRealOperator($relation['USER_ID']))
			{
				$keySearch = array_search($relation['USER_ID'], $addUsers);

				if($keySearch !== false)
				{
					unset($addUsers[$keySearch]);
				}
				else
				{
					$delete[] = $relation['USER_ID'];
				}
			}
		}

		if(
			!empty($addUsers) ||
			!empty($delete)
		)
		{
			$chat = new CIMChat($this->joinByUserId);

			if(!empty($addUsers))
			{
				$result = $chat->AddUser($this->chat['ID'], $addUsers, false, true);

				$options['SESSION_ID'] = (int)$sessionId;
				$options['CHAT_DATA'] = ChatTable::getList([
					'select' => [
						'TYPE',
						'LAST_MESSAGE_ID',
						'LAST_MESSAGE_DATE' => 'MESSAGE.DATE_CREATE'
					],
					'filter' => [
						'=ID' => $this->chat['ID'],
					],
					'runtime' => [
						new ReferenceField(
							'MESSAGE',
							'BitrixImModelMessageTable',
							["=ref.ID" => "this.LAST_MESSAGE_ID"],
							["join_type" => "LEFT"]
						),
					]
				])->fetch();

				self::setCounterRelationForChat($this->chat['ID'], $addUsers);

				foreach($addUsers as $userId)
				{
					Recent::show('chat'.$this->chat['ID'], $options, $userId);
				}
			}

			if(!empty($delete))
			{
				foreach ($delete as $userId)
				{
					$result = $chat->DeleteUser($this->chat['ID'], $userId, false, true);
				}
			}
		}
	}

	return $result;
}