%PDF- %PDF-
Direktori : /proc/self/root/home/bitrix/www/bitrix/modules/im/classes/general/ |
Current File : //proc/self/root/home/bitrix/www/bitrix/modules/im/classes/general/im_status.php |
<? use Bitrix\Im as IM; class CIMStatus { public static $AVAILABLE_STATUSES = Array('online', 'dnd', 'away'); public static $CACHE_USERS = null; public static $CACHE_RECENT = null; const CACHE_TTL = 31536000; const CACHE_PATH = '/bx/im/status/'; const CACHE_ONLINE_TTL = 60; const CACHE_ONLINE_PATH = '/bx/im/online/'; public static function Set($userId, $params) { $userId = intval($userId); if ($userId <= 0) return false; if (isset($params['STATUS'])) $params['IDLE'] = null; $previousStatus = Array( 'USER_ID' => $userId, 'STATUS' => '', 'COLOR' => '', 'IDLE' => false, 'MOBILE_LAST_DATE' => false, 'DESKTOP_LAST_DATE' => false, ); $needToUpdate = false; $params = self::PrepareFields($params); $res = IM\Model\StatusTable::getById($userId); if ($status = $res->fetch()) { $previousStatus = Array( 'USER_ID' => $status['USER_ID'], 'STATUS' => (string)$status['STATUS'], 'COLOR' => (string)$status['COLOR'], 'IDLE' => $status['IDLE'] instanceof \Bitrix\Main\Type\DateTime? $status['IDLE']: false, 'MOBILE_LAST_DATE' => $status['MOBILE_LAST_DATE'] instanceof \Bitrix\Main\Type\DateTime? $status['MOBILE_LAST_DATE']: false, 'DESKTOP_LAST_DATE' => $status['DESKTOP_LAST_DATE'] instanceof \Bitrix\Main\Type\DateTime? $status['DESKTOP_LAST_DATE']: false, ); 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) { IM\Model\StatusTable::update($userId, $params); } } else { $params['USER_ID'] = $userId; IM\Model\StatusTable::add($params); $needToUpdate = true; $status = $params; } if ($needToUpdate && self::Enable()) { CPullStack::AddShared(Array( 'module_id' => 'online', 'command' => 'userStatus', 'expiry' => 1, 'params' => Array( 'users' => Array( $userId => Array( 'id' => $userId, 'status' => $status['STATUS'], 'color' => $status['COLOR']? \Bitrix\Im\Color::getColor($status['COLOR']): \Bitrix\Im\Color::getColorByNumber($userId), 'idle' => $status['IDLE'] instanceof \Bitrix\Main\Type\DateTime? date('c', $status['IDLE']->getTimestamp()): false, 'mobile_last_date' => $status['MOBILE_LAST_DATE'] instanceof \Bitrix\Main\Type\DateTime? date('c', $status['MOBILE_LAST_DATE']->getTimestamp()): false, 'desktop_last_date' => $status['DESKTOP_LAST_DATE'] instanceof \Bitrix\Main\Type\DateTime? date('c', $status['DESKTOP_LAST_DATE']->getTimestamp()): false, 'last_activity_date' => date('c', time()) ) ) ) )); } $cache = \Bitrix\Main\Data\Cache::createInstance(); $cache->cleanDir(self::CACHE_PATH.$userId.'/'); $cache->CleanDir(self::CACHE_ONLINE_PATH); $event = new \Bitrix\Main\Event("im", "onStatusSet", array( 'USER_ID' => $userId, 'STATUS' => $status['STATUS'], 'COLOR' => $status['COLOR']? $status['COLOR']: '', 'IDLE' => $status['IDLE'] instanceof \Bitrix\Main\Type\DateTime? $status['IDLE']: false, 'MOBILE_LAST_DATE' => $status['MOBILE_LAST_DATE'] instanceof \Bitrix\Main\Type\DateTime? $status['MOBILE_LAST_DATE']: false, 'DESKTOP_LAST_DATE' => $status['DESKTOP_LAST_DATE'] instanceof \Bitrix\Main\Type\DateTime? $status['DESKTOP_LAST_DATE']: false, 'PREVIOUS_VALUES' => $previousStatus )); $event->send(); return true; } public static function SetIdle($userId, $result = true, $ago = 10) { $date = null; $ago = intval($ago); if ($result && $ago > 0) { $date = new Bitrix\Main\Type\DateTime(); $date->add('-'.$ago.' MINUTE'); } CIMStatus::Set($userId, Array('IDLE' => $date)); } public static function SetMobile($userId, $result = true) { $date = null; if ($result) { $date = new Bitrix\Main\Type\DateTime(); } CIMStatus::Set($userId, Array('MOBILE_LAST_DATE' => $date)); } public static function SetColor($userId, $color) { CIMStatus::Set($userId, Array('COLOR' => $color)); if(defined("BX_COMP_MANAGED_CACHE")) { global $CACHE_MANAGER; $CACHE_MANAGER->ClearByTag('IM_CONTACT_LIST'); } } private static function PrepareToPush($params) { foreach($params as $key => $value) { if ($key == 'STATUS') { $params[$key] = in_array($value, self::$AVAILABLE_STATUSES)? $value: 'online'; } else if (in_array($key, Array('IDLE', 'DESKTOP_LAST_DATE', 'MOBILE_LAST_DATE', 'EVENT_UNTIL_DATE'))) { $params[$key] = is_object($value)? $value->getTimestamp(): 0; } else if ($key == 'COLOR') { $params[$key] = IM\Color::getColor($value); if (!$params[$key]) { unset($params[$key]); } } else { $params[$key] = $value; } } return $params; } private static function PrepareFields($params) { $arValues = Array(); $arFields = IM\Model\StatusTable::getMap(); foreach($params as $key => $value) { if (!isset($arFields[$key])) continue; if ($key == 'STATUS') { $arValues[$key] = in_array($value, self::$AVAILABLE_STATUSES)? $value: 'online'; } else if ($key == 'COLOR') { $colors = IM\Color::getSafeColors(); if (isset($colors[$value])) { $arValues[$key] = $value; } } else { $arValues[$key] = $value; } } return $arValues; } public static function GetList($params = Array()) { if (!is_array($params)) $params = Array(); $userIds = Array(); if (isset($params['ID']) && is_array($params['ID']) && !empty($params['ID'])) { foreach ($params['ID'] as $key => $value) { $userIds[] = intval($value); } } else if (isset($params['ID']) && intval($params['ID']) > 0) { $userIds[] = intval($params['ID']); } if (isset($params['CLEAR_CACHE']) && $params['CLEAR_CACHE'] == 'Y') { $obCache = new CPHPCache(); $obCache->CleanDir(self::CACHE_ONLINE_PATH); } global $USER; $userId = is_object($USER)? intval($USER->GetID()): 0; $users = Array(); $loadFromDb = true; $loadRecent = false; if (empty($userIds)) { $loadRecent = true; if (!is_null(self::$CACHE_RECENT)) { $loadFromDb = false; $users = self::$CACHE_RECENT; } } else if (!empty($userIds)) { foreach($userIds as $id => $uid) { if (isset(self::$CACHE_USERS[$uid])) { unset($userIds[$id]); $users[$uid] = self::$CACHE_USERS[$uid]; } } if (empty($userIds)) { $loadFromDb = false; } } if ($loadFromDb) { if ($loadRecent) { $orm = \Bitrix\Im\Model\RecentTable::getList(array( 'select' => Array( 'ID' => 'U.ID', 'EXTERNAL_AUTH_ID' => 'U.EXTERNAL_AUTH_ID', 'LAST_ACTIVITY_DATE' => 'U.LAST_ACTIVITY_DATE', 'PERSONAL_GENDER' => 'U.PERSONAL_GENDER', 'COLOR' => 'ST.COLOR', 'STATUS' => 'ST.STATUS', 'IDLE' => 'ST.IDLE', 'MOBILE_LAST_DATE' => 'ST.MOBILE_LAST_DATE', ), 'runtime' => Array( new \Bitrix\Main\Entity\ReferenceField( 'ST', '\Bitrix\Im\Model\StatusTable', array("=ref.USER_ID" => "this.ITEM_ID",), array("join_type"=>"LEFT") ), new \Bitrix\Main\Entity\ReferenceField( 'U', '\Bitrix\Main\UserTable', array("=ref.ID" => "this.ITEM_ID",), array("join_type"=>"LEFT") ) ), 'filter' => Array( '=USER_ID' => $userId, "=ITEM_TYPE" => IM_MESSAGE_PRIVATE, ) )); } else { $orm = \Bitrix\Main\UserTable::getList(array( 'select' => Array( 'ID', 'EXTERNAL_AUTH_ID', 'LAST_ACTIVITY_DATE', 'PERSONAL_GENDER', 'COLOR' => 'ST.COLOR', 'STATUS' => 'ST.STATUS', 'IDLE' => 'ST.IDLE', 'MOBILE_LAST_DATE' => 'ST.MOBILE_LAST_DATE', ), 'runtime' => Array( new \Bitrix\Main\Entity\ReferenceField( 'ST', '\Bitrix\Im\Model\StatusTable', array( "=ref.USER_ID" => "this.ID", ), array("join_type"=>"LEFT") ) ), 'filter' => Array( '=ID' => $userIds, ) )); } while ($user = $orm->fetch()) { $color = null; if (isset($user['COLOR']) && strlen($user['COLOR']) > 0) { $color = IM\Color::getColor($user['COLOR']); } if (!$color) { $color = \CIMContactList::GetUserColor($user["ID"], $user['PERSONAL_GENDER'] == 'M'? 'M': 'F'); } $user['IDLE'] = $user['IDLE'] instanceof \Bitrix\Main\Type\DateTime? $user['IDLE']: false; $user['MOBILE_LAST_DATE'] = $user['MOBILE_LAST_DATE'] instanceof \Bitrix\Main\Type\DateTime? $user['MOBILE_LAST_DATE']: false; $user['LAST_ACTIVITY_DATE'] = $user['LAST_ACTIVITY_DATE'] instanceof \Bitrix\Main\Type\DateTime? $user['LAST_ACTIVITY_DATE']: false; $users[$user["ID"]] = Array( 'id' => $user["ID"], 'status' => in_array($user['STATUS'], self::$AVAILABLE_STATUSES)? $user['STATUS']: 'online', 'color' => $color, 'idle' => $user['IDLE'], 'last_activity_date' => $user['LAST_ACTIVITY_DATE'], 'mobile_last_date' => $user['MOBILE_LAST_DATE'], ); self::$CACHE_USERS[$user["ID"]] = $users[$user["ID"]]; } if ($loadRecent) { self::$CACHE_RECENT = self::$CACHE_USERS; } } return Array('users' => $users); } public static function GetOnline() { global $USER; $userId = is_object($USER)? intval($USER->GetID()): 0; $obCLCache = new CPHPCache; $cache_id = 'im_user_online_v1'; $cache_dir = self::CACHE_ONLINE_PATH.$userId.'/'; if($obCLCache->InitCache(self::CACHE_ONLINE_TTL, $cache_id, $cache_dir)) { $arOnline = $obCLCache->GetVars(); } else { $arOnline = self::GetList(); if($obCLCache->StartDataCache()) { $obCLCache->EndDataCache($arOnline); } } return $arOnline; } public static function GetStatus($userId) { $userStatus = null; $userId = intval($userId); if (!$userId) return $userStatus; $cache = \Bitrix\Main\Data\Cache::createInstance(); if($cache->initCache(self::CACHE_TTL, 'list_v1', self::CACHE_PATH.$userId.'/')) { $userStatus = $cache->getVars(); } else { $res = IM\Model\StatusTable::getList(Array( 'select' => Array('STATUS', 'IDLE', 'MOBILE_LAST_DATE', 'EXTERNAL_AUTH_ID' => 'USER.EXTERNAL_AUTH_ID'), 'runtime' => Array( new \Bitrix\Main\Entity\ReferenceField( 'USER', '\Bitrix\Main\UserTable', array("=ref.ID" => "this.USER_ID",), array("join_type"=>"LEFT") ) ), 'filter' => Array('=USER_ID' => $userId), )); if ($status = $res->fetch()) { $userStatus = $status; $cache->startDataCache(); $cache->endDataCache($userStatus); } } return $userStatus; } public static function OnUserOnlineStatusGetCustomStatus($userId, $lastseen, $now, $mode) { $result = false; $status = self::GetStatus($userId); if (!$status) { return $result; } $externalUser = \Bitrix\Main\UserTable::getExternalUserTypes(); $externalUser[] = 'network'; if (in_array($status['EXTERNAL_AUTH_ID'], $externalUser)) { $result['STATUS'] = 'online'; $result['STATUS_TEXT'] = GetMessage('IM_STATUS_EAID_'.strtoupper($status['EXTERNAL_AUTH_ID'])); $result['LAST_SEEN_TEXT'] = ''; return $result; } /** @var \Bitrix\Main\Type\DateTime $mobileLastDate */ $mobileLastDate = $status['MOBILE_LAST_DATE']; if ($mobileLastDate) { if ( $now - $mobileLastDate->getTimestamp() < CUser::GetSecondsForLimitOnline() && $lastseen - $mobileLastDate->getTimestamp() < 300 ) { $result['STATUS'] = 'mobile'; $result['LAST_SEEN'] = $mobileLastDate->getTimestamp(); $result['LAST_SEEN_TEXT'] = CUser::FormatLastActivityDate($mobileLastDate->getTimestamp(), $now); } } if ($mode == CUser::STATUS_OFFLINE) { return $result; } if (in_array($status['STATUS'], Array('dnd', 'away', 'mobile'))) { $result['STATUS'] = $status['STATUS']; $result['STATUS_TEXT'] = GetMessage('IM_STATUS_'.strtoupper($status['STATUS'])); } /** @var \Bitrix\Main\Type\DateTime $idleDate */ $idleDate = $status['IDLE']; if ($idleDate) { $result['STATUS'] = 'idle'; $result['STATUS_TEXT'] = GetMessage('IM_STATUS_IDLE'); $result['LAST_SEEN'] = $idleDate->getTimestamp(); $result['LAST_SEEN_TEXT'] = CUser::FormatLastActivityDate($idleDate, $now); } return $result; } public static function Enable() { return CModule::IncludeModule('pull') && CPullOptions::GetNginxStatus()? true: false; } } ?>