• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/classes/general/im_status.php
  • Класс: CIMStatus
  • Вызов: CIMStatus::Set
static function Set($userId, $params)
{
	global $CACHE_MANAGER;

	$userId = intval($userId);
	if ($userId <= 0)
		return false;

	if (isset($params['STATUS']))
	{
		$params['IDLE'] = null;
	}

	if (isset($params['STATUS']) || isset($params['COLOR']))
	{
		$CACHE_MANAGER->ClearByTag("USER_NAME_".$userId);
	}

	$previousStatus = Array(
		'USER_ID' => $userId,
		'STATUS' => '',
		'COLOR' => '',
		'IDLE' => false,
		'MOBILE_LAST_DATE' => false,
		'DESKTOP_LAST_DATE' => false,
	);
	$needToUpdate = false;

	$params = self::PrepareFields($params);
	$res = IMModelStatusTable::getById($userId);
	if ($status = $res->fetch())
	{
		$status['IDLE'] ??= false;
		$status['MOBILE_LAST_DATE'] ??= false;
		$status['DESKTOP_LAST_DATE'] ??= false;
		//$status = CIMStatus::prepareLastDate($status);
		$previousStatus = Array(
			'USER_ID' => $status['USER_ID'],
			'STATUS' => (string)$status['STATUS'],
			'COLOR' => (string)$status['COLOR'],
			'IDLE' => $status['IDLE'],
			'MOBILE_LAST_DATE' => $status['MOBILE_LAST_DATE'],
			'DESKTOP_LAST_DATE' => $status['DESKTOP_LAST_DATE'],
		);

		foreach ($params as $key => $value)
		{
			$oldValue = is_object($status[$key])? $status[$key]->toString(): $status[$key];
			$newValue = is_object($value)? $value->toString(): $value;
			if ($oldValue != $newValue)
			{
				$status[$key] = $value;
				$needToUpdate = true;
			}
		}

		if ($needToUpdate)
		{
			IMModelStatusTable::update($userId, $params);
		}
	}
	else
	{
		$params['USER_ID'] = $userId;
		IMModelStatusTable::add($params);

		$needToUpdate = true;
		$status = $params;
	}

	$cache = BitrixMainDataCache::createInstance();
	$cache->cleanDir(self::CACHE_PATH.$userId.'/');

	if ($needToUpdate && self::Enable())
	{

		CPullStack::AddShared([
			'module_id' => 'online',
			'command' => 'userStatus',
			'expiry' => 1,
			'params' => [
				'users' => [
					$userId => [
						'id' => $userId,
						'status' => $status['STATUS'] ?? null,
						'color' => ($status['COLOR'] ?? null)
							? BitrixImColor::getColor($status['COLOR'])
							: BitrixImColor::getColorByNumber($userId)
						,
						'idle' => $status['IDLE'] instanceof BitrixMainTypeDateTime
							? date('c', $status['IDLE']->getTimestamp())
							: false
						,
						'mobile_last_date' => ($status['MOBILE_LAST_DATE'] ?? null) instanceof BitrixMainTypeDateTime
							? date('c', $status['MOBILE_LAST_DATE']->getTimestamp())
							: false
						,
						'desktop_last_date' => $status['DESKTOP_LAST_DATE'] instanceof BitrixMainTypeDateTime
							? date('c', $status['DESKTOP_LAST_DATE']->getTimestamp())
							: false
						,
						'last_activity_date' => date('c', time())
					]
				]
			]
		]);
	}

	$cache->CleanDir(self::CACHE_ONLINE_PATH);

	$event = new BitrixMainEvent("im", "onStatusSet", array(
		'USER_ID' => $userId,
		'STATUS' => $status['STATUS'],
		'COLOR' => $status['COLOR']? $status['COLOR']: '',
		'IDLE' => $status['IDLE'] instanceof BitrixMainTypeDateTime? $status['IDLE']: false,
		'MOBILE_LAST_DATE' => $status['MOBILE_LAST_DATE'] instanceof BitrixMainTypeDateTime? $status['MOBILE_LAST_DATE']: false,
		'DESKTOP_LAST_DATE' => $status['DESKTOP_LAST_DATE'] instanceof BitrixMainTypeDateTime? $status['DESKTOP_LAST_DATE']: false,
		'PREVIOUS_VALUES' => $previousStatus
	));
	$event->send();

	return true;
}