• Модуль: imopenlines
  • Путь к файлу: ~/bitrix/modules/imopenlines/lib/chat.php
  • Класс: BitrixImOpenLinesChat
  • Вызов: Chat::answer
public function answer($userId, $skipSession = false, $skipMessage = false, $skipRead = false): Result
{
	$result = new Result();
	$result->setResult(true);
	$keyLock = self::PREFIX_KEY_LOCK_ANSWER_SESSION . $this->chat['ID'];
	$session = null;

	if ($this->chat['AUTHOR_ID'] == $userId)
	{
		$result->addError(new Error(Loc::getMessage('IMOL_CHAT_ERROR_ANSWER_ALREADY_RESPONSIBLE'), 'IMOL_CHAT_ERROR_ANSWER_ALREADY_RESPONSIBLE', __METHOD__, ['$userId' => $userId]));
	}

	if(!$this->isDataLoaded())
	{
		$result->addError(new Error('Chat failed to load', 'NOT_LOAD_CHAT', __METHOD__, ['chat' => $this->chat]));
	}

	if($result->isSuccess())
	{
		if (ToolsLock::getInstance()->set($keyLock))
		{
			$chat = new CIMChat(0);
			$relations = CIMChat::GetRelationById($this->chat['ID'], false, true, false);

			if (!isset($relations[$userId]))
			{
				$chat->AddUser($this->chat['ID'], $userId, false, true);
			}

			if($skipSession !== true)
			{
				$session = new Session();
				$session->setChat($this);

				$resultLoad = $session->load([
					'USER_CODE' => $this->chat['ENTITY_ID'],
					'MODE' => Session::MODE_OUTPUT,
					'SKIP_CREATE' => 'Y'
				]);
				if ($resultLoad)
				{
					if($this->validationAction($session->getData('CHAT_ID')))
					{
						if (!$session->isNowCreated())
						{
							$session->answer($userId);
						}
					}
					else
					{
						$result->addError(new Error(Loc::getMessage('IMOL_CHAT_ERROR_NOT_LOAD_DATA'), 'IMOL_CHAT_ERROR_NOT_LOAD_DATA', __METHOD__, ['chat' => $this->chat]));
					}
				}
				else
				{
					$result->setResult(false);
					$result->addError(new Error(Loc::getMessage('IMOL_CHAT_ERROR_ANSWER_NOT_LOAD_SESSION'), 'IMOL_CHAT_ERROR_ANSWER_NOT_LOAD_SESSION', __METHOD__, ['USER_CODE' => $this->chat['ENTITY_ID'], 'MODE' => Session::MODE_OUTPUT, 'OPERATOR_ID' => $userId]));
				}
			}

			if($result->isSuccess())
			{
				$relations = CIMChat::GetRelationById($this->chat['ID'], false, true, false);
				foreach ($relations as $relation)
				{
					if(
						$userId != $relation['USER_ID'] &&
						Queue::isRealOperator($relation['USER_ID'])
					)
					{
						$chat->DeleteUser($this->chat['ID'], $relation['USER_ID'], false, true);
					}
				}

				$this->update([
					'AUTHOR_ID' => $userId
				]);

				PullEvent::add($userId, [
					'module_id' => 'imopenlines',
					'command' => 'linesAnswer',
					'params' => [
						'chatId' => $this->chat['ID']
					]
				]);

				if (!$skipMessage)
				{
					$userAnswer = User::getInstance($userId);

					Im::addMessage([
						'FROM_USER_ID' => $userId,
						'TO_CHAT_ID' => $this->chat['ID'],
						'MESSAGE' => Loc::getMessage('IMOL_CHAT_ANSWER_'.$userAnswer->getGender(), ['#USER#' => '[USER='.$userAnswer->getId().'][/USER]']),
						'SYSTEM' => 'Y',
					]);
				}

				ToolsLock::getInstance()->delete($keyLock);

				if ($session)
				{
					$eventData = [
						'RUNTIME_SESSION' => $session,
						'USER_ID' => $userId,
					];
					$event = new Event('imopenlines', 'OnChatAnswer', $eventData);
					$event->send();
				}

				if (!$skipRead)
				{
					$CIMChat = new CIMChat($userId);
					$CIMChat->SetReadMessage($this->chat['ID']);
				}
			}
			else
			{
				ToolsLock::getInstance()->delete($keyLock);
			}
		}
		else
		{
			$result->addError(new Error(Loc::getMessage('IMOL_CHAT_ERROR_ANSWER_COMPETITIVE_REQUEST'), 'IMOL_CHAT_ERROR_ANSWER_COMPETITIVE_REQUEST', __METHOD__, ['$userId' => $userId]));
		}
	}

	return $result;
}