• Модуль: forum
  • Путь к файлу: ~/bitrix/modules/forum/classes/general/user.php
  • Класс: CAllForumUser
  • Вызов: CAllForumUser::SetStat
static function SetStat($USER_ID = 0, $arParams = array())
{
	$USER_ID = intval($USER_ID);
	if ($USER_ID <= 0)
		return 0;

	$bNeedCreateUser = false;
	$arUser = array();
	$arUserFields = Array();

	$arParams = (is_array($arParams) ? $arParams : array());

	$arMessage = (is_array($arParams["MESSAGE"]) ? $arParams["MESSAGE"] : array());
	$arMessage = ($arMessage["AUTHOR_ID"] != $USER_ID ? array() : $arMessage);

	if (!empty($arMessage))
	{
		$arParams["ACTION"] = isset($arParams["ACTION"]) && ($arParams["ACTION"] == "DECREMENT" || $arParams["ACTION"] == "UPDATE") ? $arParams["ACTION"] : "INCREMENT";
		if ($arParams["ACTION"] == "UPDATE"):
			$arParams["ACTION"] = ($arMessage["APPROVED"] == "Y" ? "INCREMENT" : "DECREMENT");
			$arMessage["APPROVED"] = "Y";
		endif;

		$arParams["POSTS"] = intval(isset($arParams["POSTS"]) && $arParams["POSTS"] > 0 ? $arParams["POSTS"] : 1);
		$arUser = CForumUser::GetByUSER_ID($USER_ID);
	}

	if (empty($arMessage)):
		// full recount;
	elseif ($arMessage["APPROVED"] != "Y"):
		return true;
	elseif (empty($arUser)):
		$bNeedCreateUser = true;
		// full recount;
	elseif ($arParams["ACTION"] == "DECREMENT" && $arMessage["ID"] >= $arUser["LAST_POST"]):
		// full recount;
	elseif ($arParams["ACTION"] == "DECREMENT"):
		$arUserFields = array(
			"=NUM_POSTS" => "NUM_POSTS-".$arParams["POSTS"],
			"POINTS" => intval(CForumUser::GetUserPoints($USER_ID, array("DECREMENT" => $arParams["POSTS"]))));
	elseif ($arParams["ACTION"] == "INCREMENT" && $arMessage["ID"] < $arUser["LAST_POST"]):
		$arUserFields = array(
			"=NUM_POSTS" => "NUM_POSTS+".$arParams["POSTS"],
			"POINTS" => intval(CForumUser::GetUserPoints($USER_ID, array("INCREMENT" => $arParams["POSTS"]))));
	elseif ($arParams["ACTION"] == "INCREMENT"):
		$arUserFields["IP_ADDRESS"] = $arMessage["AUTHOR_IP"];
		$arUserFields["REAL_IP_ADDRESS"] = $arMessage["AUTHOR_REAL_IP"];
		$arUserFields["LAST_POST"] = intval($arMessage["ID"]);
		$arUserFields["=NUM_POSTS"] = "NUM_POSTS+".$arParams["POSTS"];
		$arUserFields["POINTS"] = intval(CForumUser::GetUserPoints($USER_ID, array("INCREMENT" => $arParams["POSTS"])));
	endif;

	if (empty($arUserFields))
	{
		$arUserFields = Array(
			"LAST_POST" => false);
		if ($bNeedCreateUser == false)
			$arUser = CForumUser::GetByUSER_IDEx($USER_ID);
		if (empty($arUser) || $bNeedCreateUser == true):
			$bNeedCreateUser = true;
			$arUser = CForumMessage::GetList(array(), array("AUTHOR_ID" => $USER_ID, "APPROVED" => "Y"), "cnt_and_last_mid");
			$arUser = (is_array($arUser) ? $arUser : array());
		endif;
		$arMessage = CForumMessage::GetByID($arUser["LAST_MESSAGE_ID"], array("FILTER" => "N"));
		if ($arMessage):
			$arUserFields["IP_ADDRESS"] = $arMessage["AUTHOR_IP"];
			$arUserFields["REAL_IP_ADDRESS"] = $arMessage["AUTHOR_REAL_IP"];
			$arUserFields["LAST_POST"] = intval($arMessage["ID"]);
		endif;
		$arUserFields["NUM_POSTS"] = intval($arUser["CNT"]);
		$arUserFields["POINTS"] = intval(CForumUser::GetUserPoints($USER_ID, array("NUM_POSTS" => $arUserFields["NUM_POSTS"])));
	}

	if ($bNeedCreateUser):
		$arUserFields["USER_ID"] = $USER_ID;
		$arUser = CForumUser::Add($arUserFields);
	else:
		CForumUser::Update($USER_ID, $arUserFields, false, true);
	endif;

	return $USER_ID;
}