mirror of
https://github.com/Oreolek/ifhub.club.git
synced 2024-05-19 17:28:23 +03:00
Упрощение рейтинга пользователя и удаление силы
This commit is contained in:
parent
53f00cfe1e
commit
6bb2166ce0
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Сохраняет теги для избранного
|
||||
*
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* Проверяет можно ли юзеру слать инвайты
|
||||
*
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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)
|
||||
);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
* Устанавливает дату регистрации
|
||||
*
|
||||
|
|
|
@ -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 = '';
|
||||
|
|
|
@ -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: {
|
||||
|
|
Loading…
Reference in a new issue