Начисление силы и рейтинга за посты

Предыстория.

Есть молодой блог по инвайтам, в который запустили 10 человек.
Эти люди переносят свое творчество.

Ожидается через неделю-другую открыть регистрацию для всех.
И что же увидит молодняк?
Кучу юзеров и тем с 0 рейтингом (мы друг друга знаем и все труды тоже. основное время тратим на перенос, а не на чтение)

Что бы это избежать, было решенно ввести премирование за написание постов.
Начисляется:
+0,01 к рейтингу юзера, опубликовавшего топик
+0,2 к силе юзера, опубликовавшего топик

+ от 0.13 до 1.5 к блогу, в который написал юзер (зависит от его силы)

так же было установлен базовый рейтинг топика — в 1 (хотя его тоже можно менять в зависимости от силы юзера)

ls\classes\actions\ActionTopic.class.php
находим 374 строку и заменяем:
/**
		 * Теперь можно смело добавлять топик к блогу
		 */
		$oTopic=new TopicEntity_Topic();


на:

/**
		 * Теперь можно смело добавлять топик к блогу
		 */
		
		/**
		 * Добавляем силы за пост + чуть рейтинга
		 */
		
		$oUser=$this->oUserCurrent;
		$iSkillNew=$oUser->getSkill()+0.2;
		$iRatingNew=$oUser->getRating()+0.01;
		
		$oUser->setSkill($iSkillNew);
		$oUser->setRating($iRatingNew);
		$this->User_Update($oUser);

		/**
		 * Добавляем рейтинга в блог
		 */		
		$skill=$iSkillNew;	
		$iMinSize=0.13;
		$iMaxSize=1.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/20;
		} elseif ($skill>=200) {
			$skill_new=$skill/10;
		} else {
			$skill_new=$skill/50;
		}
		$iDelta=$iMinSize+(log($skill_new+1)-$iMinCount)*($iSizeRange/$iCountRange);
		$oBlog->setRating($oBlog->getRating()+$iDelta);
		
		$oTopic=new TopicEntity_Topic();
		$oTopic->setRating(1);	// начальный рейтинг топика = 1.


ls\classes\modules\topic\mapper\Topic.mapper.class.php
25 строка:
public function AddTopic(TopicEntity_Topic $oTopic) {
		$sql = "INSERT INTO ".DB_TABLE_TOPIC." 
			(blog_id,
			user_id,
			topic_type,
			topic_title,			
			topic_tags,
			topic_date_add,
			topic_user_ip,
			topic_publish,
			topic_publish_draft,
			topic_publish_index,
			topic_cut_text,
			topic_forbid_comment,			
			topic_text_hash			
			)
			VALUES(?d,  ?d,	?,	?,	?,  ?, ?, ?d, ?d, ?d, ?, ?, ?)
		";			
		if ($iId=$this->oDb->query($sql,$oTopic->getBlogId(),$oTopic->getUserId(),$oTopic->getType(),$oTopic->getTitle(),
			$oTopic->getTags(),$oTopic->getDateAdd(),$oTopic->getUserIp(),$oTopic->getPublish(),$oTopic->getPublishDraft(),$oTopic->getPublishIndex(),$oTopic->getCutText(),$oTopic->getForbidComment(),$oTopic->getTextHash())) 
		{
			$oTopic->setId($iId);
			$this->AddTopicContent($oTopic);
			return $iId;
		}		
		return false;
	}

заменяем на:

public function AddTopic(TopicEntity_Topic $oTopic) {
		$sql = "INSERT INTO ".DB_TABLE_TOPIC." 
			(blog_id,
			user_id,
			topic_type,
			topic_title,			
			topic_tags,
			topic_date_add,
			topic_user_ip,
			topic_publish,
			topic_publish_draft,
			topic_publish_index,
			topic_cut_text,
			topic_forbid_comment,
			topic_text_hash,
			topic_rating
			)
			VALUES(?d,  ?d,	?,	?,	?,  ?, ?, ?d, ?d, ?d, ?, ?, ?, ?f)
		";			
		if ($iId=$this->oDb->query($sql,$oTopic->getBlogId(),$oTopic->getUserId(),$oTopic->getType(),$oTopic->getTitle(),
			$oTopic->getTags(),$oTopic->getDateAdd(),$oTopic->getUserIp(),$oTopic->getPublish(),$oTopic->getPublishDraft(),$oTopic->getPublishIndex(),$oTopic->getCutText(),$oTopic->getForbidComment(),$oTopic->getTextHash(),$oTopic->getRating())) 
		{
			$oTopic->setId($iId);
			$this->AddTopicContent($oTopic);
			return $iId;
		}		
		return false;
	}


ps. Аналогичного успеха с стартовым рейтингом топика можно добится установив default 1 в таблице prefix_topic для поля topic_rating . Здесь же представлена заготовка для более гидкого и динамечиского примеирования нового топика
pss. Аналогично можно реализовать убавление рейтинга при удаление топика (в целях предотвращения накрутки)

5 комментариев

avatar
х.м. >>>>
avatar
Раз несколько человек пришли к одному и тому же примерно в одно время — значит это актуально.

Я поделился своим способом.
Если убрать часть, которая делает новые топики сразу с рейтингом 1 — то нужна всего 1 правка в 1 файле.
И если убрать динамеческое увеличение рейтинга блога, в зависимости от силы пользователя, то правка вобще укладывается в 5 строчек:

                $oTopic=new TopicEntity_Topic();

на

                $oUser=$this->oUserCurrent;
                $oUser->setSkill($oUser->getSkill()+0.2);
                $oUser->setRating($oUser->getRating()+0.01);
                $this->User_Update($oUser);

                $oBlog->setRating($oBlog->getRating()+0,5); // рейтинг за блог


ИМХО это попроще.
Да и для тех кто начинает изучать движок — хорошая отправная точка.
avatar
Не работает начисление рейтинга блогу, последняя версия LS.
avatar
pss. Аналогично можно реализовать убавление рейтинга при удаление топика (в целях предотвращения накрутки)
Можете показать как? И от кого убавляется рейтинг? От удалившего (думаю в основном Админ будет удалять не подходящие топики)? Или от создавшего топик?
avatar
Лучше в плагин вынести, а то при обновлении все слетит у вас.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.