2009-05-10 10:50:39 +03:00
|
|
|
<?php
|
2014-10-08 08:20:29 +03:00
|
|
|
/*
|
|
|
|
* LiveStreet CMS
|
|
|
|
* Copyright © 2013 OOO "ЛС-СОФТ"
|
|
|
|
*
|
|
|
|
* ------------------------------------------------------
|
|
|
|
*
|
|
|
|
* Official site: www.livestreetcms.com
|
|
|
|
* Contact e-mail: office@livestreetcms.com
|
|
|
|
*
|
|
|
|
* GNU General Public License, version 2:
|
|
|
|
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|
|
|
*
|
|
|
|
* ------------------------------------------------------
|
|
|
|
*
|
|
|
|
* @link http://www.livestreetcms.com
|
|
|
|
* @copyright 2013 OOO "ЛС-СОФТ"
|
|
|
|
* @author Maxim Mzhelskiy <rus.engine@gmail.com>
|
|
|
|
*
|
|
|
|
*/
|
2008-09-21 09:36:57 +03:00
|
|
|
|
|
|
|
/**
|
2012-06-24 13:47:34 +03:00
|
|
|
* Модуль управления рейтингами и силой
|
2008-09-21 09:36:57 +03:00
|
|
|
*
|
2014-10-08 08:20:29 +03:00
|
|
|
* @package application.modules.rating
|
2012-06-24 13:47:34 +03:00
|
|
|
* @since 1.0
|
2008-09-21 09:36:57 +03:00
|
|
|
*/
|
2014-10-08 11:49:34 +03:00
|
|
|
class ModuleRating extends Module
|
|
|
|
{
|
2008-09-21 09:36:57 +03:00
|
|
|
|
2014-10-08 11:49:34 +03:00
|
|
|
/**
|
|
|
|
* Инициализация модуля
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
public function Init()
|
|
|
|
{
|
2012-06-24 13:47:34 +03:00
|
|
|
|
2014-10-08 11:49:34 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Расчет рейтинга при голосовании за комментарий
|
|
|
|
*
|
|
|
|
* @param ModuleUser_EntityUser $oUser Объект пользователя, который голосует
|
|
|
|
* @param ModuleComment_EntityComment $oComment Объект комментария
|
|
|
|
* @param int $iValue
|
|
|
|
* @return int
|
|
|
|
*/
|
|
|
|
public function VoteComment(ModuleUser_EntityUser $oUser, ModuleComment_EntityComment $oComment, $iValue)
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* Устанавливаем рейтинг комментария
|
|
|
|
*/
|
|
|
|
$oComment->setRating($oComment->getRating() + $iValue);
|
|
|
|
/**
|
|
|
|
* Начисляем силу автору коммента, используя логарифмическое распределение
|
|
|
|
*/
|
|
|
|
$skill = $oUser->getSkill();
|
|
|
|
$iMinSize = 0.004;
|
|
|
|
$iMaxSize = 0.5;
|
|
|
|
$iSizeRange = $iMaxSize - $iMinSize;
|
|
|
|
$iMinCount = log(0 + 1);
|
|
|
|
$iMaxCount = log(500 + 1);
|
|
|
|
$iCountRange = $iMaxCount - $iMinCount;
|
|
|
|
if ($iCountRange == 0) {
|
|
|
|
$iCountRange = 1;
|
|
|
|
}
|
|
|
|
if ($skill > 50 and $skill < 200) {
|
|
|
|
$skill_new = $skill / 70;
|
|
|
|
} elseif ($skill >= 200) {
|
|
|
|
$skill_new = $skill / 10;
|
|
|
|
} else {
|
|
|
|
$skill_new = $skill / 130;
|
|
|
|
}
|
|
|
|
$iDelta = $iMinSize + (log($skill_new + 1) - $iMinCount) * ($iSizeRange / $iCountRange);
|
|
|
|
/**
|
|
|
|
* Сохраняем силу
|
|
|
|
*/
|
|
|
|
$oUserComment = $this->User_GetUserById($oComment->getUserId());
|
|
|
|
$iSkillNew = $oUserComment->getSkill() + $iValue * $iDelta;
|
|
|
|
$iSkillNew = ($iSkillNew < 0) ? 0 : $iSkillNew;
|
|
|
|
$oUserComment->setSkill($iSkillNew);
|
|
|
|
$this->User_Update($oUserComment);
|
|
|
|
return $iValue;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Расчет рейтинга и силы при гоосовании за топик
|
|
|
|
*
|
|
|
|
* @param ModuleUser_EntityUser $oUser Объект пользователя, который голосует
|
|
|
|
* @param ModuleTopic_EntityTopic $oTopic Объект топика
|
|
|
|
* @param int $iValue
|
|
|
|
* @return int
|
|
|
|
*/
|
|
|
|
public function VoteTopic(ModuleUser_EntityUser $oUser, ModuleTopic_EntityTopic $oTopic, $iValue)
|
|
|
|
{
|
|
|
|
$skill = $oUser->getSkill();
|
|
|
|
/**
|
|
|
|
* Устанавливаем рейтинг топика
|
|
|
|
*/
|
|
|
|
$iDeltaRating = $iValue;
|
|
|
|
if ($skill >= 100 and $skill < 250) {
|
|
|
|
$iDeltaRating = $iValue * 2;
|
|
|
|
} elseif ($skill >= 250 and $skill < 400) {
|
|
|
|
$iDeltaRating = $iValue * 3;
|
|
|
|
} elseif ($skill >= 400) {
|
|
|
|
$iDeltaRating = $iValue * 4;
|
|
|
|
}
|
|
|
|
$oTopic->setRating($oTopic->getRating() + $iDeltaRating);
|
|
|
|
/**
|
|
|
|
* Начисляем силу и рейтинг автору топика, используя логарифмическое распределение
|
|
|
|
*/
|
|
|
|
$iMinSize = 0.1;
|
|
|
|
$iMaxSize = 8;
|
|
|
|
$iSizeRange = $iMaxSize - $iMinSize;
|
|
|
|
$iMinCount = log(0 + 1);
|
|
|
|
$iMaxCount = log(500 + 1);
|
|
|
|
$iCountRange = $iMaxCount - $iMinCount;
|
|
|
|
if ($iCountRange == 0) {
|
|
|
|
$iCountRange = 1;
|
|
|
|
}
|
|
|
|
if ($skill > 50 and $skill < 200) {
|
|
|
|
$skill_new = $skill / 70;
|
|
|
|
} elseif ($skill >= 200) {
|
|
|
|
$skill_new = $skill / 10;
|
|
|
|
} else {
|
|
|
|
$skill_new = $skill / 100;
|
|
|
|
}
|
|
|
|
$iDelta = $iMinSize + (log($skill_new + 1) - $iMinCount) * ($iSizeRange / $iCountRange);
|
|
|
|
/**
|
|
|
|
* Сохраняем силу и рейтинг
|
|
|
|
*/
|
|
|
|
$oUserTopic = $this->User_GetUserById($oTopic->getUserId());
|
|
|
|
$iSkillNew = $oUserTopic->getSkill() + $iValue * $iDelta;
|
|
|
|
$iSkillNew = ($iSkillNew < 0) ? 0 : $iSkillNew;
|
|
|
|
$oUserTopic->setSkill($iSkillNew);
|
|
|
|
$oUserTopic->setRating($oUserTopic->getRating() + $iValue * $iDelta / 2.73);
|
|
|
|
$this->User_Update($oUserTopic);
|
|
|
|
return $iDeltaRating;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Расчет рейтинга и силы при голосовании за пользователя
|
|
|
|
*
|
|
|
|
* @param ModuleUser_EntityUser $oUser
|
|
|
|
* @param ModuleUser_EntityUser $oUserTarget
|
|
|
|
* @param int $iValue
|
|
|
|
* @return float
|
|
|
|
*/
|
|
|
|
public function VoteUser(ModuleUser_EntityUser $oUser, ModuleUser_EntityUser $oUserTarget, $iValue)
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* Начисляем силу и рейтинг юзеру, используя логарифмическое распределение
|
|
|
|
*/
|
|
|
|
$skill = $oUser->getSkill();
|
|
|
|
$iMinSize = 0.42;
|
|
|
|
$iMaxSize = 3.2;
|
|
|
|
$iSizeRange = $iMaxSize - $iMinSize;
|
|
|
|
$iMinCount = log(0 + 1);
|
|
|
|
$iMaxCount = log(500 + 1);
|
|
|
|
$iCountRange = $iMaxCount - $iMinCount;
|
|
|
|
if ($iCountRange == 0) {
|
|
|
|
$iCountRange = 1;
|
|
|
|
}
|
|
|
|
if ($skill > 50 and $skill < 200) {
|
|
|
|
$skill_new = $skill / 40;
|
|
|
|
} elseif ($skill >= 200) {
|
|
|
|
$skill_new = $skill / 2;
|
|
|
|
} else {
|
|
|
|
$skill_new = $skill / 70;
|
|
|
|
}
|
|
|
|
$iDelta = $iMinSize + (log($skill_new + 1) - $iMinCount) * ($iSizeRange / $iCountRange);
|
|
|
|
/**
|
|
|
|
* Определяем новый рейтинг
|
|
|
|
*/
|
|
|
|
$iRatingNew = $oUserTarget->getRating() + $iValue * $iDelta;
|
|
|
|
$oUserTarget->setRating($iRatingNew);
|
|
|
|
return $iValue * $iDelta;
|
|
|
|
}
|
2014-05-28 08:37:30 +03:00
|
|
|
}
|