- Модуль: 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;
}