1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-05-19 17:28:23 +03:00

Упрощение рейтинга пользователя и удаление силы

This commit is contained in:
Mzhelskiy Maxim 2014-11-20 15:53:56 +07:00
parent 53f00cfe1e
commit 6bb2166ce0
9 changed files with 11 additions and 240 deletions

View file

@ -57,7 +57,6 @@ class ActionAjax extends Action
{
$this->AddEventPreg('/^vote$/i', '/^comment$/', 'EventVoteComment');
$this->AddEventPreg('/^vote$/i', '/^topic$/', 'EventVoteTopic');
$this->AddEventPreg('/^vote$/i', '/^user$/', 'EventVoteUser');
$this->AddEventPreg('/^vote$/i', '/^get$/', '/^info$/', '/^topic$/', 'EventVoteGetInfoTopic');
$this->AddEventPreg('/^favourite$/i', '/^save-tags/', 'EventFavouriteSaveTags');
@ -1239,73 +1238,6 @@ class ActionAjax extends Action
}
}
/**
* Голосование за пользователя
*
*/
protected function EventVoteUser()
{
/**
* Пользователь авторизован?
*/
if (!$this->oUserCurrent) {
$this->Message_AddErrorSingle($this->Lang_Get('need_authorization'), $this->Lang_Get('error'));
return;
}
/**
* Пользователь существует?
*/
if (!($oUser = $this->User_GetUserById(getRequestStr('iTargetId', null, 'post')))) {
return $this->EventErrorDebug();
}
/**
* Имеет право на голосование?
*/
if (!$this->ACL_CanVoteUser($this->oUserCurrent, $oUser)) {
$this->Message_AddErrorSingle($this->Rbac_GetMsgLast());
return;
}
/**
* Как проголосовал
*/
$iValue = getRequestStr('value', null, 'post');
if (!in_array($iValue, array('1', '-1'))) {
return $this->EventErrorDebug();
}
/**
* Голосуем
*/
$oUserVote = Engine::GetEntity('Vote');
$oUserVote->setTargetId($oUser->getId());
$oUserVote->setTargetType('user');
$oUserVote->setVoterId($this->oUserCurrent->getId());
$oUserVote->setDirection($iValue);
$oUserVote->setDate(date("Y-m-d H:i:s"));
$iVal = (float)$this->Rating_VoteUser($this->oUserCurrent, $oUser, $iValue);
$oUserVote->setValue($iVal);
//$oUser->setRating($oUser->getRating()+$iValue);
$oUser->setCountVote($oUser->getCountVote() + 1);
$this->Hook_Run("vote_{$oUserVote->getTargetType()}_before",
array('oTarget' => $oUser, 'oVote' => $oUserVote, 'iValue' => $iValue));
if ($this->Vote_AddVote($oUserVote) and $this->User_Update($oUser)) {
$this->Hook_Run("vote_{$oUserVote->getTargetType()}_after",
array('oTarget' => $oUser, 'oVote' => $oUserVote, 'iValue' => $iValue));
$this->Message_AddNoticeSingle($this->Lang_Get('vote.notices.success'), $this->Lang_Get('attention'));
$this->Viewer_AssignAjax('iRating', $oUser->getRating());
$this->Viewer_AssignAjax('iSkill', $oUser->getSkill());
$this->Viewer_AssignAjax('iCountVote', $oUser->getCountVote());
/**
* Добавляем событие в ленту
*/
$this->Stream_write($oUserVote->getVoterId(), 'vote_user', $oUser->getId());
} else {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'), $this->Lang_Get('error'));
return;
}
}
/**
* Сохраняет теги для избранного
*

View file

@ -91,7 +91,6 @@ class ActionPeople extends Action
'user_rating',
'user_date_register',
'user_login',
'user_skill',
'user_profile_name'
)) ? getRequestStr('sort_by') : 'user_rating';
if (is_numeric(getRequestStr('pageNext')) and getRequestStr('pageNext') > 0) {

View file

@ -354,44 +354,6 @@ class ModuleACL extends Module
));
}
/**
* Проверяет может ли пользователь голосовать за конкретного пользователя
*
* @param ModuleUser_EntityUser $oUser Пользователь
* @param ModuleUser_EntityUser $oUserTarget Пользователь за которого голосуем
* @return bool
*/
public function CanVoteUser($oUser, $oUserTarget)
{
$that = $this; // fix for PHP < 5.4
return $this->Rbac_IsAllowUser($oUser, 'vote_user', array(
'callback' => function ($oUser, $aParams) use ($that, $oUserTarget) {
if (!$oUser) {
return false;
}
/**
* Голосует за себя?
*/
if ($oUserTarget->getId() == $oUser->getId()) {
return $that->Lang_Get('vote.notices.error_self');
}
/**
* Уже голосовал?
*/
if ($oUserVote = $that->Vote_GetVote($oUserTarget->getId(), 'user', $oUser->getId())) {
return $that->Lang_Get('vote.notices.error_already_voted');
}
/**
* Ограничение по рейтингу
*/
if ($oUser->getRating() < Config::Get('acl.vote.user.rating')) {
return $that->Lang_Get('vote.notices.error_acl');
}
return true;
}
));
}
/**
* Проверяет можно ли юзеру слать инвайты
*

View file

@ -52,33 +52,12 @@ class ModuleRating extends Module
*/
$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);
/**
* Сохраняем силу
* Меняем рейтинг автора коммента
*/
$fDeltaUser = 0.1;
$fDeltaUser = ($iValue < 0 ? -1 : 1) * $fDeltaUser;
$oUserComment = $this->User_GetUserById($oComment->getUserId());
$iSkillNew = $oUserComment->getSkill() + $iValue * $iDelta;
$iSkillNew = ($iSkillNew < 0) ? 0 : $iSkillNew;
$oUserComment->setSkill($iSkillNew);
$oUserComment->setRating($oUserComment->getRating() + $fDeltaUser);
$this->User_Update($oUserComment);
return $iValue;
}
@ -93,87 +72,18 @@ class ModuleRating extends Module
*/
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);
$oTopic->setRating($oTopic->getRating() + $iValue);
/**
* Начисляем силу и рейтинг автору топика, используя логарифмическое распределение
*/
$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);
/**
* Сохраняем силу и рейтинг
* Меняем рейтинг автора топика
*/
$fDeltaUser = 1;
$fDeltaUser = ($iValue < 0 ? -1 : 1) * $fDeltaUser;
$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);
$oUserTopic->setRating($oUserTopic->getRating() + $fDeltaUser);
$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;
return $iValue;
}
}

View file

@ -58,8 +58,6 @@ class ModuleStream extends Module
'add_blog' => array('related' => 'blog', 'unique' => true),
'vote_topic' => array('related' => 'topic'),
'vote_comment_topic' => array('related' => 'comment'),
'vote_blog' => array('related' => 'blog'),
'vote_user' => array('related' => 'user'),
'add_friend' => array('related' => 'user', 'unique_user' => true),
'join_blog' => array('related' => 'blog', 'unique_user' => true)
);

View file

@ -1118,7 +1118,7 @@ class ModuleUser extends Module
$sDay = 7;
$iCountUsed = $this->GetCountInviteUsedByDate($oUserFrom->getId(),
date("Y-m-d 00:00:00", mktime(0, 0, 0, date("m"), date("d") - $sDay, date("Y"))));
$iCountAllAvailable = round($oUserFrom->getRating() + $oUserFrom->getSkill());
$iCountAllAvailable = round($oUserFrom->getRating());
$iCountAllAvailable = $iCountAllAvailable < 0 ? 0 : $iCountAllAvailable;
$iCountAvailable = $iCountAllAvailable - $iCountUsed;
$iCountAvailable = $iCountAvailable < 0 ? 0 : $iCountAvailable;

View file

@ -149,16 +149,6 @@ class ModuleUser_EntityUser extends Entity
return $this->_getDataOne('user_mail');
}
/**
* Возвращает силу
*
* @return string
*/
public function getSkill()
{
return number_format(round($this->_getDataOne('user_skill'), 2), 2, '.', '');
}
/**
* Возвращает дату регистрации
*
@ -641,16 +631,6 @@ class ModuleUser_EntityUser extends Entity
$this->_aData['user_mail'] = $data;
}
/**
* Устанавливает силу
*
* @param float $data
*/
public function setSkill($data)
{
$this->_aData['user_skill'] = $data;
}
/**
* Устанавливает дату регистрации
*

View file

@ -66,7 +66,6 @@ class ModuleUser_MapperUser extends Mapper
SET
user_password = ? ,
user_mail = ? ,
user_skill = ? ,
user_date_activate = ? ,
user_date_comment_last = ? ,
user_rating = ? ,
@ -93,7 +92,6 @@ class ModuleUser_MapperUser extends Mapper
";
$res = $this->oDb->query($sql, $oUser->getPassword(),
$oUser->getMail(),
$oUser->getSkill(),
$oUser->getDateActivate(),
$oUser->getDateCommentLast(),
$oUser->getRating(),
@ -1342,7 +1340,6 @@ class ModuleUser_MapperUser extends Mapper
'user_login',
'user_date_register',
'user_rating',
'user_skill',
'user_profile_name'
);
$sOrder = '';

View file

@ -219,13 +219,6 @@ jQuery(document).ready(function($){
*/
ls.user.init();
// Голосование за пользователя
$('.js-vote-user').vote({
urls: {
vote: aRouter['ajax'] + 'vote/user/'
}
});
// Поиск
$( '.js-search-ajax-users' ).lsSearchAjax({
urls: {