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;
}