Jump to content

Повышение репутации через определённый промежуток времени


Trotor
 Share

Recommended Posts

Не подскажите как реализовать функционал, что бы репутацию могли повышать/понижать через определённый промежуток времени?

 

Помниться на старенькой и древненькой IPB 1.3 был большой функционал к моду репутации - на тройке на жаль очень скуден это функционал.

Link to comment
Share on other sites

Забыл важный момент уточнить:

Юзер А может повысить/понизить репутацию юзеру Б только скажем через час

Link to comment
Share on other sites

Повторный запрет на изменения репутации сводится к проверке в /admin/sources/classes/class_reputation_cache.php, метод addRate

 

IPB 3.4.6

 

	/* Check for existing rating */
	$currentRating = $this->getCurrentMemberRating( array( 'app' => $app, 'type' => $type, 'id' => $type_id, 'memberId' => $this->memberData['member_id'] ) );

	/* Check the point types */
	if ( $rating == -1 && IPSMember::canRepDown( $currentRating, $this->memberData ) === false )
	{
		$this->error_message = $this->lang->words['reputation_invalid'];
		return false;
	}

	if ( $rating == 1 && IPSMember::canRepUp( $currentRating, $this->memberData ) === false )
	{
		$this->error_message = $this->lang->words['reputation_invalid'];
		return false;
	}

 

getCurrentMemberRating - возвращает запись рейтинга к сообщению для этого пользователя.

canRepDown и canRepUp - осуществляют проверку если ли пользователь может проголосовать за этот пост.

Link to comment
Share on other sites

А в 3.1.4 все еще проще

 

	/* Insert */
	if( $current_rating )
	{
		//ipsRegistry::DB()->update( 'reputation_index', $db_insert, "app='{$app}' AND type='{$type}' AND type_id={$type_id} AND member_id=".ipsRegistry::member()->getProperty( 'member_id' ) );
		return true;
	}
	else
	{
		ipsRegistry::DB()->insert( 'reputation_index', $db_insert );
	}

Нужно только проверить время когда пользователь проголосовал за этот пост и обновить рейтинг.

Вот только проблемы могут быть с обновлением кеша.

Link to comment
Share on other sites

Нужно только проверить время, когда пользователь проголосовал за этот пост и обновить рейтинг.

Немного не понял. А где указать время через которое юзер опять сможет проголосовать?

Link to comment
Share on other sites

У меня мод улучшенной репутации стоит, поэтому это идёт через хук:

		/* Insert */
	if( $current_rating )
	{
		ipsRegistry::DB()->update( 'reputation_index', $db_insert, "app='{$app}' AND type='{$type}' AND type_id={$type_id} AND member_id=".ipsRegistry::member()->getProperty( 'member_id' ) );
	}
	else
	{
		ipsRegistry::DB()->insert( 'reputation_index', $db_insert );
	}

Link to comment
Share on other sites

Вообще, логика завязана на том, что запись рейтинга для поста от пользователя может быть только одна. Если он повторно и может проголосовать то только обновлением текущей записи, т.е. по статистике голос будет проходить один общий. Можно попробовать добавить новую запись, но за подводные камни которые при этом могут всплыть я не ручаюсь.

Link to comment
Share on other sites

ipsRegistry::DB()->update( 'reputation_index', $db_insert, "app='{$app}' AND type='{$type}' AND type_id={$type_id} AND member_id=".ipsRegistry::member()->getProperty( 'member_id' ) );

Ну вот тут репутация и обновляется. Только не нужно обновлять на текущую, а суммировать к уже имеющиеся.

Link to comment
Share on other sites

Можно попробовать добавить новую запись, но за подводные камни которые при этом могут всплыть я не ручаюсь.

Вы добавьте, я протестирую. Тем более как показала практика, все ваши новые записи всегда хорошо работают, подводных камней практически не наблюдалось :)

Link to comment
Share on other sites

		ipsRegistry::DB()->update( 'reputation_index', $db_insert, "app='{$app}' AND type='{$type}' AND type_id={$type_id} AND member_id=".ipsRegistry::member()->getProperty( 'member_id' ) );

Заменить на

 

		$time_offset = 3600;
		$offset      = time() - $time_offset;

		if( $current_rating['rep_date'] > $offset )
		{
			$time_again = $current_rating['rep_date'] - $offset;

			$this->error_message = 'You have already voted for this post. Be able to vote again after '.IPSTime::time_ago( $time_again );
			return false;
		}

		ipsRegistry::DB()->insert( 'reputation_index', $db_insert );
		$current_rating = array();

Чуть выше в sql запросе найти

 

																		'where'  => "app='{$app}' AND type='{$type}' AND type_id={$type_id} AND member_id=".ipsRegistry::member()->getProperty( 'member_id' ),

Ниже добавить

 

																		'order'  => 'id DESC',
																		'limit'  => array(0, 1),

 

3600 - время в секундах через которое юзер сможет повторно изменять рейтинг. Для удобство можете вывести в настройку АЦ.

  • Upvote 1
Link to comment
Share on other sites

Потестил. Не срабатывает, свободно повышаю определённому пользователю репутацию как и прежде без временного интервала :(

Link to comment
Share on other sites

Может не тот файл отредактировали? Добавьте для теста перед if( $current_rating ) код

$this->error_message = 'test reputation';

return false;

Добавил. При попытке изменения репутации выдаёт:

Rating failed: test reputation

 

Я так понял это проверка файла и она прошла.

Link to comment
Share on other sites

Проверил на локалхосте. Там все отрабатывает нормально. При повторном изменение выдает ошибку что нужно подождать. SQL запрос отредактировали?

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...