• Модуль: imopenlines
  • Путь к файлу: ~/bitrix/modules/imopenlines/lib/session.php
  • Класс: BitrixImOpenLinesSession
  • Вызов: Session::voteAsUser
static function voteAsUser($sessionId, $action, $userId = null): bool
{
	$result = false;

	$finishSession = false;

	$sessionData = ModelSessionTable::getByIdPerformance($sessionId)->fetch();
	if ($sessionData)
	{
		$userId = (int)$userId;
		if (
			$userId <= 0
			|| $sessionData['USER_ID'] == $userId
		)
		{
			$voteValue = $action === 'dislike'? 1: 5;

			$session = new Session();

			$resultLoadSession = $session->load([
				'USER_CODE' => $sessionData['USER_CODE'],
				'SKIP_CREATE' => 'Y',
				'DEFERRED_JOIN' => 'Y',
				'VOTE_SESSION' => 'Y'
			]);

			if (!$resultLoadSession)
			{
				if ($session->isCloseVote())
				{
					Im::addCloseVoteMessage(
						$session->getData('CHAT_ID'),
						$session->getConfig('VOTE_TIME_LIMIT')
					);
				}
			}
			else
			{

				Debug::addSession($session,  __METHOD__, ['sessionId' => $sessionId, 'action' => $action, 'userId' => $userId]);

				if ($session->getData('ID') == $sessionId)
				{
					if (
						$session->getData('CLOSED') !== 'Y'
						|| $session->getData('VOTE') !== ''
					)
					{
						$updateSession['VOTE'] = $voteValue;
						$updateSession['WAIT_VOTE'] = 'N';

						if (
							$session->getData('WAIT_VOTE') === 'Y'
							&& $session->getConfig('VOTE_CLOSING_DELAY') === 'Y'
						)
						{
							$finishSession = true;
						}
						else
						{
							//TODO: hack!
							$updateSession['STATUS'] = self::STATUS_WAIT_CLIENT;
							$updateSession['DATE_MODIFY'] = new DateTime;
							$updateSession['USER_ID'] = $userId;
						}

						$session->update($updateSession);

						$voteEventParams = [
							'SESSION_DATA' => $sessionData,
							'VOTE' => $voteValue,
						];
						$event = new MainEvent('imopenlines', 'OnSessionVote', $voteEventParams);
						$event->send();

						if ($sessionData['END_ID'] > 0)
						{
							CIMMessageParam::Set($sessionData['END_ID'], ['IMOL_VOTE_SID' => $sessionId, 'IMOL_VOTE_USER' => $voteValue]);
							CIMMessageParam::SendPull($sessionData['END_ID'], ['IMOL_VOTE_SID', 'IMOL_VOTE_USER']);
						}

						Chat::sendRatingNotify(
							Chat::RATING_TYPE_CLIENT,
							$sessionData['ID'],
							$voteValue,
							$sessionData['OPERATOR_ID'],
							$sessionData['USER_ID']
						);

						if ($finishSession === true)
						{
							$session->finish(true);
						}

						$result =  true;
					}
				}
			}
		}
	}

	return $result;
}