/** * Расчет рейтинга и силы при гоосовании за пост на форуме * * @param ModuleUser_EntityUser $oUser Объект пользователя, который голосует * @param PluginForum_ModuleForum_EntityPost $oPost Объект поста * @param int $iValue * @return int */ public function VoteForumPost(ModuleUser_EntityUser $oUser, PluginForum_ModuleForum_EntityPost $oPost, $iValue) { /** * Устанавливаем рейтинг поста */ $iDeltaRating = $iValue; $oPost->setRating($oPost->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; } $skill = $oUser->getSkill(); 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); /** * Сохраняем силу и рейтинг */ $oUser = $this->User_GetUserById($oPost->getUserId()); $iSkillNew = $oUser->getSkill() + $iValue * $iDelta; $iSkillNew = $iSkillNew < 0 ? 0 : $iSkillNew; $oUser->setSkill($iSkillNew); $oUser->setRating($oUser->getRating() + $iValue * $iDelta / 2.73); $this->User_Update($oUser); return $iDeltaRating; }
/** * Отправка уведомления на отвеченные посты * * @param PluginForum_ModuleForum_EntityPost $oReply * @param array $aExcludeMail */ public function SendNotifyReply(PluginForum_ModuleForum_EntityPost $oReply, $aExcludeMail = array()) { if ($oReply) { if (preg_match_all("@(<blockquote reply=(?:\"|')(.*)(?:\"|').*>)@Ui", $oReply->getTextSource(), $aMatch)) { $aIds = array_values($aMatch[2]); /** * Получаем список постов */ $aPosts = $this->GetPostItemsByArrayPostId((array) $aIds); /** * Отправка */ $sTemplate = 'notify.reply.tpl'; $sSendTitle = $this->Lang_Get('plugin.forum.notify_subject_reply'); $aSendContent = array('oUser' => $oReply->getUser(), 'oTopic' => $oReply->getTopic(), 'oPost' => $oReply); foreach ($aPosts as $oPost) { if ($oUser = $oPost->getUser()) { $sMail = $oUser->getMail(); if (!$sMail || in_array($sMail, (array) $aExcludeMail)) { continue; } $this->Notify_Send($sMail, $sTemplate, $sSendTitle, $aSendContent, __CLASS__); } } } } }