Skip to content

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

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

 

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

Featured Replies

  • Author

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

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

Повторный запрет на изменения репутации сводится к проверке в /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 - осуществляют проверку если ли пользователь может проголосовать за этот пост.

А в 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 );
	}

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

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

  • Author

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

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

  • Author

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

		/* 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 );
	}

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

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' ) );

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

  • Author

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

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

		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 - время в секундах через которое юзер сможет повторно изменять рейтинг. Для удобство можете вывести в настройку АЦ.

  • Author

@siv1987,

Сейчас потестим :)

  • Author

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

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

$this->error_message = 'test reputation';

return false;

  • Author

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

$this->error_message = 'test reputation';

return false;

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

Rating failed: test reputation

 

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

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

  • Author

SQL запрос отредактировали?

Да.

 

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

Create an account or sign in to comment

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.