Плагин для голосования без регистрации

Добрый день.

Очень нужен плагин, позволяющий юзеру дёргать QuestionVote без регистрации. Комменты, топики без регистрации — не нужно. Только голосование.
Проверка — по ip или по сессии. Предпочтительнее по сессии, но готовы любые варианты обсуждать.

Есть подозрение, что это потребует значительного изменения кода, поэтому мы готовы платить много ;)

Если кто-то готов взяться — напишите свои контакты в комментах, договоримся о деньгах и сроках, уточним ТЗ.

livestreet 0.4

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

avatar
какие проверки? (ip, сессия?)
как планируется избегать накрутки?
  • xyz
  • 0
avatar
Оба варианта возможны — ip и сессия. Предпочтительнее по сессии.
avatar
А с накрутками тогда как бороться? (ну, можно считать это риторическим вопросом)
avatar
Проверять местоположение через api браузера, и считать отклонения при повторном голосовании(скажем метров 100)

Через этот api работает twitter, и он определяет не по ip, там какие то свои параметры

Конечно не предлагаю это считать основным способом защиты, но хотя бы как дополнение
avatar
В это трудно поверить, но мы не собираемся бороться с накрутками :)
Есть только один кейс: юзер зашёл, проголосовал где хотел, проголосовать второй раз там же нельзя (например, в течение суток).
Кейсы типа «у юзера динамический ip, и он поменял ip...» или «юзер зашёл в другом браузере» вообще никак не рассматриваются.
Не президента выбираем :)
avatar
1. заменить questionVote.php на этот
<?php
/*-------------------------------------------------------
*
*   LiveStreet Engine Social Networking
*   Copyright © 2008 Mzhelskiy Maxim
*
*--------------------------------------------------------
*
*   Official site: www.livestreet.ru
*   Contact e-mail: rus.engine@gmail.com
*
*   GNU General Public License, version 2:
*   http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
---------------------------------------------------------
*/

/**
 * Обрабатывает голосование за топик-вопрос
 */

set_include_path(get_include_path().PATH_SEPARATOR.dirname(dirname(dirname(__FILE__))));
$sDirRoot=dirname(dirname(dirname(__FILE__)));
require_once($sDirRoot."/config/config.ajax.php");

$idAnswer=getRequest('idAnswer',null,'post');
$idTopic=getRequest('idTopic',null,'post');
$bStateError=true;
$sTextResult='';
$sMsgTitle='';
$sMsg='';
if ($oEngine->User_IsAuthorization()) {
	if ($oTopic=$oEngine->Topic_GetTopicById($idTopic)) {
		if ($oTopic->getType()=='question') {
			//голосовал уже или нет
			$oUserCurrent=$oEngine->User_GetUserCurrent();
			if (!($oTopicQuestionVote=$oEngine->Topic_GetTopicQuestionVote($oTopic->getId(),$oUserCurrent->getId()))) {
				$aAnswer=$oTopic->getQuestionAnswers();							
				if (isset($aAnswer[$idAnswer]) or $idAnswer==-1) {						
					if ($idAnswer==-1) {
						$oTopic->setQuestionCountVoteAbstain($oTopic->getQuestionCountVoteAbstain()+1);
					} else {
						$oTopic->increaseQuestionAnswerVote($idAnswer);
					}
					$oTopic->setQuestionCountVote($oTopic->getQuestionCountVote()+1);
					
					$oTopicQuestionVote=Engine::GetEntity('Topic_TopicQuestionVote');
					$oTopicQuestionVote->setTopicId($oTopic->getId());
					$oTopicQuestionVote->setVoterId($oUserCurrent->getId());
					$oTopicQuestionVote->setAnswer($idAnswer);	
					
					if ($oEngine->Topic_AddTopicQuestionVote($oTopicQuestionVote) and $oEngine->Topic_updateTopic($oTopic)) {
						$bStateError=false;
						$sMsgTitle=$oEngine->Lang_Get('attention');
						$sMsg=$oEngine->Lang_Get('topic_question_vote_ok');						
						
						$oEngine->Viewer_Assign('oTopic',$oTopic);								
						$sTextResult=$oEngine->Viewer_Fetch("topic_question.tpl");	
					} else {
						$sMsgTitle=$oEngine->Lang_Get('error');
						$sMsg=$oEngine->Lang_Get('system_error');
					}
				} else {
					$sMsgTitle=$oEngine->Lang_Get('error');
					$sMsg=$oEngine->Lang_Get('system_error');
				}
			} else {
				$sMsgTitle=$oEngine->Lang_Get('error');
				$sMsg=$oEngine->Lang_Get('topic_question_vote_already');
			}
		} else {
			$sMsgTitle=$oEngine->Lang_Get('error');
			$sMsg=$oEngine->Lang_Get('system_error');
		}
	} else {
		$sMsgTitle=$oEngine->Lang_Get('error');
		$sMsg=$oEngine->Lang_Get('system_error');
	}
} else {
	if ($oTopic=$oEngine->Topic_GetTopicById($idTopic)) {
		if ($oTopic->getType()=='question') {
			//голосовал уже или нет
			//$oUserCurrent=$oEngine->User_GetUserCurrent();
			if (!isset($_SESSION['voted_'.$oTopic->getId()])) {
				$aAnswer=$oTopic->getQuestionAnswers();							
				if (isset($aAnswer[$idAnswer]) or $idAnswer==-1) {						
					if ($idAnswer==-1) {
						$oTopic->setQuestionCountVoteAbstain($oTopic->getQuestionCountVoteAbstain()+1);
					} else {
						$oTopic->increaseQuestionAnswerVote($idAnswer);
					}
					$oTopic->setQuestionCountVote($oTopic->getQuestionCountVote()+1);
					
					/*$oTopicQuestionVote=Engine::GetEntity('Topic_TopicQuestionVote');
					$oTopicQuestionVote->setTopicId($oTopic->getId());
					$oTopicQuestionVote->setVoterId($oUserCurrent->getId());
					$oTopicQuestionVote->setAnswer($idAnswer);	*/
					
					if (/*$oEngine->Topic_AddTopicQuestionVote($oTopicQuestionVote) and */$oEngine->Topic_updateTopic($oTopic)) {
						$bStateError=false;
						$sMsgTitle=$oEngine->Lang_Get('attention');
						$sMsg=$oEngine->Lang_Get('topic_question_vote_ok');						
						
						$oEngine->Viewer_Assign('oTopic',$oTopic);								
						$sTextResult=$oEngine->Viewer_Fetch("topic_question.tpl");	
						
						$_SESSION['voted_'.$oTopic->getId()] = true;
					} else {
						$sMsgTitle=$oEngine->Lang_Get('error');
						$sMsg=$oEngine->Lang_Get('system_error');
					}
				} else {
					$sMsgTitle=$oEngine->Lang_Get('error');
					$sMsg=$oEngine->Lang_Get('system_error');
				}
			} else {
				$sMsgTitle=$oEngine->Lang_Get('error');
				$sMsg=$oEngine->Lang_Get('topic_question_vote_already');
			}
		} else {
			$sMsgTitle=$oEngine->Lang_Get('error');
			$sMsg=$oEngine->Lang_Get('system_error');
		}
	} else {
		$sMsgTitle=$oEngine->Lang_Get('error');
		$sMsg=$oEngine->Lang_Get('system_error');
	}
}

$GLOBALS['_RESULT'] = array(
"bStateError"     => $bStateError,
"sText"   => $sTextResult,
"sMsgTitle" => $sMsgTitle,
"sMsg" => $sMsg,
);

?>


2. в шаблонах вывода топика (topic.tpl/topic_list.tpl) рядом с
<div id="topic_question_area_{$oTopic->getId()}">
заменить на
<div id="topic_question_area_{$oTopic->getId()}">
    		{assign var="iTopicId" value=$oTopic->getId()} 
    		{assign var="voted" value="voted_`$iTopicId`"}    		
    		{if ($oUserCurrent && !$oTopic->getUserQuestionIsVote()) || (!$oUserCurrent && (!$smarty.session.$voted))} 		
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.