%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/main/classes/general/ |
Current File : /home/bitrix/www/bitrix/modules/main/classes/general/user_counter.php |
<? class CAllUserCounter { const ALL_SITES = '**'; const LIVEFEED_CODE = '**'; const SYSTEM_USER_ID = 0; protected static $counters = false; public static function GetValue($user_id, $code, $site_id = SITE_ID) { $user_id = intval($user_id); if ($user_id < 0) return false; $arCodes = self::GetValues($user_id, $site_id); if (isset($arCodes[$code])) return intval($arCodes[$code]); else return 0; } public static function GetValues($user_id, $site_id = SITE_ID, &$arLastDate = array()) { global $DB, $CACHE_MANAGER; static $diff; $user_id = intval($user_id); if ($user_id < 0) { return array(); } if (!is_array($arLastDate)) { $arLastDate = array(); } if ($diff === false) { $diff = CTimeZone::GetOffset(); } if(!isset(self::$counters[$user_id][$site_id])) { if ( CACHED_b_user_counter !== false && $CACHE_MANAGER->Read(CACHED_b_user_counter, "user_counter".$user_id, "user_counter") ) { $arAll = $CACHE_MANAGER->Get("user_counter".$user_id); } else { $strSQL = " SELECT CODE, SITE_ID, CNT, ".$DB->DatetimeToTimestampFunction("LAST_DATE")." LAST_DATE_TS FROM b_user_counter WHERE USER_ID = ".$user_id; $dbRes = $DB->Query($strSQL, false, "File: ".__FILE__."<br>Line: ".__LINE__); $arAll = array(); while ($arRes = $dbRes->Fetch()) { $arRes["CODE"] = self::getGroupedCode($arRes["CODE"]); $arAll[] = $arRes; } if (CACHED_b_user_counter !== false) { $CACHE_MANAGER->Set("user_counter".$user_id, $arAll); } } if(is_array($arAll)) { foreach($arAll as $arItem) { if ( $arItem["SITE_ID"] == $site_id || $arItem["SITE_ID"] == self::ALL_SITES ) { if (!isset(self::$counters[$user_id][$site_id][$arItem["CODE"]])) { self::$counters[$user_id][$site_id][$arItem["CODE"]] = 0; } self::$counters[$user_id][$site_id][$arItem["CODE"]] += $arItem["CNT"]; if (!isset($arLastDate[$user_id])) { $arLastDate[$user_id] = array(); } if (!isset($arLastDate[$user_id][$site_id])) { $arLastDate[$user_id][$site_id] = array(); } if (isset($arItem["LAST_DATE_TS"])) { $arLastDate[$user_id][$site_id][$arItem["CODE"]] = $arItem["LAST_DATE_TS"] - $diff; } } } } } return self::$counters[$user_id][$site_id]; } public static function GetAllValues($user_id) { global $DB, $CACHE_MANAGER; $arCounters = Array(); $user_id = intval($user_id); if ($user_id < 0) return $arCounters; $arSites = Array(); $res = CSite::GetList(($b = ""), ($o = ""), Array("ACTIVE" => "Y")); while ($row = $res->Fetch()) $arSites[] = $row['ID']; if (CACHED_b_user_counter !== false && $CACHE_MANAGER->Read(CACHED_b_user_counter, "user_counter".$user_id, "user_counter")) { $arAll = $CACHE_MANAGER->Get("user_counter".$user_id); } else { $strSQL = " SELECT CODE, SITE_ID, CNT FROM b_user_counter WHERE USER_ID = ".$user_id; $dbRes = $DB->Query($strSQL, false, "File: ".__FILE__."<br>Line: ".__LINE__); $arAll = array(); while ($arRes = $dbRes->Fetch()) { $arRes["CODE"] = self::getGroupedCode($arRes["CODE"]); $arAll[] = $arRes; } if (CACHED_b_user_counter !== false) { $CACHE_MANAGER->Set("user_counter".$user_id, $arAll); } } foreach($arAll as $arItem) { if ($arItem['SITE_ID'] == self::ALL_SITES) { foreach ($arSites as $siteId) { if (isset($arCounters[$siteId][$arItem['CODE']])) $arCounters[$siteId][$arItem['CODE']] += intval($arItem['CNT']); else $arCounters[$siteId][$arItem['CODE']] = intval($arItem['CNT']); } } else { if (isset($arCounters[$arItem['SITE_ID']][$arItem['CODE']])) $arCounters[$arItem['SITE_ID']][$arItem['CODE']] += intval($arItem['CNT']); else $arCounters[$arItem['SITE_ID']][$arItem['CODE']] = intval($arItem['CNT']); } } return $arCounters; } public static function GetLastDate($user_id, $code, $site_id = SITE_ID) { global $DB; $user_id = intval($user_id); if ($user_id < 0 || strlen($code) <= 0) return 0; $strSQL = " SELECT ".$DB->DateToCharFunction("LAST_DATE", "FULL")." LAST_DATE FROM b_user_counter WHERE USER_ID = ".$user_id." AND (SITE_ID = '".$site_id."' OR SITE_ID = '".self::ALL_SITES."') AND CODE = '".$DB->ForSql($code)."' "; $result = 0; $dbRes = $DB->Query($strSQL, false, "File: ".__FILE__."<br>Line: ".__LINE__); if ($arRes = $dbRes->Fetch()) $result = MakeTimeStamp($arRes["LAST_DATE"]); return $result; } public static function ClearAll($user_id, $site_id = SITE_ID, $sendPull = true) { global $DB, $CACHE_MANAGER; $user_id = intval($user_id); if ($user_id < 0) return false; $strSQL = " UPDATE b_user_counter SET CNT = 0 WHERE USER_ID = ".$user_id." AND (SITE_ID = '".$site_id."' OR SITE_ID = '".self::ALL_SITES."')"; $DB->Query($strSQL, false, "File: ".__FILE__."<br>Line: ".__LINE__); if ($site_id == self::ALL_SITES) { if (self::$counters) unset(self::$counters[$user_id]); } else { if (self::$counters) unset(self::$counters[$user_id][$site_id]); } $CACHE_MANAGER->Clean("user_counter".$user_id, "user_counter"); if ($sendPull) self::SendPullEvent($user_id); return true; } public static function ClearByTag($tag, $code, $site_id = SITE_ID, $sendPull = true) { global $DB, $CACHE_MANAGER; if (strlen($tag) <= 0 || strlen($code) <= 0) return false; $strSQL = " UPDATE b_user_counter SET CNT = 0 WHERE TAG = '".$DB->ForSQL($tag)."' AND CODE = '".$DB->ForSQL($code)."' AND (SITE_ID = '".$site_id."' OR SITE_ID = '".self::ALL_SITES."')"; $DB->Query($strSQL, false, "File: ".__FILE__."<br>Line: ".__LINE__); self::$counters = false; $CACHE_MANAGER->CleanDir("user_counter"); if ($sendPull && self::CheckLiveMode()) { global $DB; $arSites = Array(); $res = CSite::GetList(($b = ""), ($o = ""), Array("ACTIVE" => "Y")); while ($row = $res->Fetch()) $arSites[] = $row['ID']; $helper = \Bitrix\Main\Application::getConnection()->getSqlHelper(); $strSQL = " SELECT pc.CHANNEL_ID, pc.CHANNEL_TYPE, uc.USER_ID, uc.SITE_ID, uc.CODE, uc.CNT FROM b_user_counter uc INNER JOIN b_pull_channel pc ON pc.USER_ID = uc.USER_ID INNER JOIN b_user u ON u.ID = uc.USER_ID AND (CASE WHEN u.EXTERNAL_AUTH_ID IN ('".join("', '", \Bitrix\Main\UserTable::getExternalUserTypes())."') THEN 'Y' ELSE 'N' END) = 'N' AND u.LAST_ACTIVITY_DATE > ".$helper->addSecondsToDateTime('(-3600)')." WHERE TAG = '".$DB->ForSQL($tag)."' AND CODE = '".$DB->ForSQL($code)."' AND (SITE_ID = '".$site_id."' OR SITE_ID = '".self::ALL_SITES."')"; $res = $DB->Query($strSQL, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__); $pullMessage = Array(); while ($row = $res->Fetch()) { if (!($row['CHANNEL_TYPE'] == 'private' || $row['CHANNEL_TYPE'] == 'shared' && $row['USER_ID'] == 0)) { continue; } if ($row['SITE_ID'] == self::ALL_SITES) { foreach ($arSites as $siteId) { if (isset($pullMessage[$row['CHANNEL_ID']][$siteId][$row['CODE']])) $pullMessage[$row['CHANNEL_ID']][$siteId][$row['CODE']] += intval($row['CNT']); else $pullMessage[$row['CHANNEL_ID']][$siteId][$row['CODE']] = intval($row['CNT']); } } else { if (isset($pullMessage[$row['CHANNEL_ID']][$row['SITE_ID']][$row['CODE']])) $pullMessage[$row['CHANNEL_ID']][$row['SITE_ID']][$row['CODE']] += intval($row['CNT']); else $pullMessage[$row['CHANNEL_ID']][$row['SITE_ID']][$row['CODE']] = intval($row['CNT']); } } foreach ($pullMessage as $channelId => $arMessage) { \Bitrix\Pull\Event::add($channelId, Array( 'module_id' => 'main', 'command' => 'user_counter', 'expiry' => 3600, 'params' => $arMessage, )); } } return true; } public static function CheckLiveMode() { return ( CModule::IncludeModule('pull') && CPullOptions::GetNginxStatus() ); } protected static function SendPullEvent($user_id, $code = "", $bMultiple = false) { $user_id = intval($user_id); if ($user_id < 0) return false; if (self::CheckLiveMode()) { global $DB; $arSites = Array(); $res = CSite::GetList(($b = ""), ($o = ""), Array("ACTIVE" => "Y")); while ($row = $res->Fetch()) $arSites[] = $row['ID']; $helper = \Bitrix\Main\Application::getConnection()->getSqlHelper(); $strSQL = " SELECT pc.CHANNEL_ID, pc.CHANNEL_TYPE, uc.USER_ID, uc.SITE_ID, uc.CODE, uc.CNT FROM b_user_counter uc INNER JOIN b_pull_channel pc ON pc.USER_ID = uc.USER_ID INNER JOIN b_user u ON u.ID = uc.USER_ID AND (CASE WHEN u.EXTERNAL_AUTH_ID IN ('".join("', '", \Bitrix\Main\UserTable::getExternalUserTypes())."') THEN 'Y' ELSE 'N' END) = 'N' AND u.LAST_ACTIVITY_DATE > ".$helper->addSecondsToDateTime('(-3600)')." WHERE uc.USER_ID = ".intval($user_id).( strlen($code) > 0 ? ( $bMultiple ? " AND uc.CODE LIKE '".$DB->ForSQL($code)."%'" : " AND uc.CODE = '".$DB->ForSQL($code)."'" ) : "" )." "; $res = $DB->Query($strSQL, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__); $pullMessage = Array(); while ($row = $res->Fetch()) { $key = (strlen($code) > 0 ? $code : $row['CODE']); if (!($row['CHANNEL_TYPE'] == 'private' || $row['CHANNEL_TYPE'] == 'shared' && $row['USER_ID'] == 0)) { continue; } if ($row['SITE_ID'] == self::ALL_SITES) { foreach ($arSites as $siteId) { if (isset($pullMessage[$row['CHANNEL_ID']][$siteId][$key])) $pullMessage[$row['CHANNEL_ID']][$siteId][$key] += intval($row['CNT']); else $pullMessage[$row['CHANNEL_ID']][$siteId][$key] = intval($row['CNT']); } } else { if (isset($pullMessage[$row['CHANNEL_ID']][$row['SITE_ID']][$key])) $pullMessage[$row['CHANNEL_ID']][$row['SITE_ID']][$key] += intval($row['CNT']); else $pullMessage[$row['CHANNEL_ID']][$row['SITE_ID']][$key] = intval($row['CNT']); } } foreach ($pullMessage as $channelId => $arMessage) { \Bitrix\Pull\Event::add($channelId, Array( 'module_id' => 'main', 'command' => 'user_counter', 'expiry' => 3600, 'params' => $arMessage, )); } } } public static function addValueToPullMessage($row, $arSites = array(), &$pullMessage = array()) { $code = self::getGroupedCode($row["CODE"]); if ($row['SITE_ID'] == self::ALL_SITES) { foreach($arSites as $siteId) { if (isset($pullMessage[$row['CHANNEL_ID']][$siteId][$code])) { $pullMessage[$row['CHANNEL_ID']][$siteId][$code] += intval($row['CNT']); } else { $pullMessage[$row['CHANNEL_ID']][$siteId][$code] = intval($row['CNT']); } } } else { if (isset($pullMessage[$row['CHANNEL_ID']][$row['SITE_ID']][$code])) { $pullMessage[$row['CHANNEL_ID']][$row['SITE_ID']][$code] += intval($row['CNT']); } else { $pullMessage[$row['CHANNEL_ID']][$row['SITE_ID']][$code] = intval($row['CNT']); } } } public static function getGroupedCounters($counters) { $result = array(); foreach ($counters as $siteId => $data) { $result[$siteId] = self::getGroupedCounterRecords($data); } return $result; } public static function getGroupedCounterRecords($records) { $result = array(); foreach ($records as $code => $value) { $code = self::getGroupedCode($code); if (isset($result[$code])) { $result[$code] += $value; } else { $result[$code] = $value; } } return $result; } private static function getGroupedCode($code) { $result = $code; if (strpos($code, self::LIVEFEED_CODE) === 0) { $result = self::LIVEFEED_CODE; } return $result; } public static function OnSocNetLogCommentDelete($commentId) { CUserCounter::DeleteByCode(self::LIVEFEED_CODE."LC".intval($commentId)); } public static function OnSocNetLogDelete($logId) { CUserCounter::DeleteByCode(self::LIVEFEED_CODE."L".intval($logId)); } // legacy function public static function GetValueByUserID($user_id, $site_id = SITE_ID, $code = self::ALL_SITES) { return self::GetValue($user_id, $code, $site_id); } public static function GetCodeValuesByUserID($user_id, $site_id = SITE_ID) { return self::GetValues($user_id, $site_id); } public static function GetLastDateByUserAndCode($user_id, $site_id = SITE_ID, $code = self::ALL_SITES) { return self::GetLastDate($user_id, $code, $site_id); } public static function DeleteOld() { global $DB; $days = intval(\Bitrix\Main\Config\Option::get('main', 'user_counter_days', 20)); $time = $DB->CharToDateFunction(GetTime(time()- $days*60*60*24, "FULL")); $DB->Query("DELETE FROM b_user_counter WHERE TIMESTAMP_X <= ".$time); return "CUserCounter::DeleteOld();"; } } class CAllUserCounterPage { protected static function setUserIdOption($value = false) { // \Bitrix\Main\Config\Option::set('main', 'user_counter_pull_page_start', $value); } protected static function getUserIdOption() { // return \Bitrix\Main\Config\Option::get('main', 'user_counter_pull_page_start', false); } public static function getPageSizeOption($defaultValue = 100) { $value = intval(\Bitrix\Main\Config\Option::get('main', 'user_counter_pull_page_size', $defaultValue)); if ($value <= 0) { $value = $defaultValue; } return $value; } public static function setNewEvent() { self::setUserIdOption(0); } protected static function getMinMax($prevMax = 0) { global $DB; $pageSize = self::getPageSizeOption(100); $strSQL = " SELECT USER_ID FROM b_user_counter uc WHERE SENT = '0' AND USER_ID > ".intval($prevMax)." GROUP BY USER_ID ORDER BY USER_ID ASC LIMIT ".$pageSize." "; $res = $DB->query($strSQL, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__); $i = 0; while($row = $res->fetch()) { if (!$i) { $minValue = $row["USER_ID"]; } else { $maxValue = $row["USER_ID"]; } $i++; } if ($i) { return array( "MIN" => intval($minValue), "MAX" => intval($maxValue) ); } else { return false; } } } ?>