Модуль мотивации пользователей

Привет, вот тут, была высказана здравая мысль о необходимости подобного модуля, я немного добавил функционала и предоставляю на суд общественности (да, и вероятность наличия багов не нулевая, совсем досконально не тестил)
Шаг 1
создаем папку конфига модуля в /config/modules/motivation/ и пишем в config.php следующее

/**
 * конфиг модуля motivation 
 * @Author Bnet http://bnet.su
 * 
*/
define("MOTIVATION_ENABLE",'true'); //Включен ли модуль
define("MOTIVATION_ENABLE_DAY_LOGIN",100500); //Сколько плюсовать если сегодня пришел
define("MOTIVATION_DISABLE_DAY_LOGIN",-100500); //Сколько минусовать если день не был на сайте
define("MOTIVATION_PERSONAL_BLOG_TOPIC",100500); //Сколько плюсовать на пост в персональном блого
define("MOTIVATION_BLOG_TOPIC",100500); //Сколько плюсовать за пост в коллективном блоге
define("MOTIVATION_COMMENT",123); //Сколько плюсовать за комментарий (только в чужом посте)
define("MOTIVATION_TIME_POSTING",60*60*24*1); //Время, в течении которого штрафовать пользователя за отсутвие постов
define("MOTIVATION_DISABLE_POSTING",-10); //Сколько минусовать если пользователь не постил в течении вышеописанного времени

Шаг 2
идем в classes/modules/Topic/Topic.class.php и в методе AddTopic после
if ($sId = $this->oMapperTopic->AddTopic($oTopic)) {
добавлем
/**
             * Motivation
             */
            if (MOTIVATION_ENABLE) {
                $oUser = $this->User_GetUserById($oTopic->getUserId());
                $oUser->setRating($oUser->getRating()+(($oTopic->getBlogId() == $oUser->getId())?MOTIVATION_PERSONAL_BLOG_TOPIC:MOTIVATION_BLOG_TOPIC));
                if ($this->GetCountTopicsPersonalByUser($oUser->getId(), 1) > 1) {
                    $sDate = date("Y-m-d H:i:s", time()-MOTIVATION_TIME_POSTING);
                    $aFilter = array (
                    'blog_type'=> array (
                    'personal',
                    'open',
                    ),
                    'topic_publish'=>1,
                    'topic_new'=>$sDate,
                    );
                    if ($this->GetCountTopicsByFilter($aFilter)==1) {
                    	$oUser->setRating($oUser->getRating()+MOTIVATION_DISABLE_POSTING);
					}
                    $this->User_Update($oUser);
                }
            }

Шаг 3
идем в classes/modules/User/User.class.php и в методе AutoUpdateUser после
if (!$this->oUserCurrent) {
			return;
		}
вставляем код товарища Truth4oll
/**
		 * Motivation module
		 */
		if (MOTIVATION_ENABLE) { 
			$todaydate  = mktime(0, 0, 0, date("m")  , date("d"), date("Y"));               
			$datelast = strtotime($this->oUserCurrent->getDateLast());
			if ($datelast<$todaydate and $datelast<>0){ 
				$this->oUserCurrent->setRating($this->oUserCurrent->getRating()+MOTIVATION_ENABLE_DAY_LOGIN); //увеличение рейтинга
				$count_bad_days = floor(($todaydate-$datelast )/86400) ; //число незалогененных дней
				if ($count_bad_days>0)
				$this->oUserCurrent->setRating($this->oUserCurrent->getRating()+(MOTIVATION_DISABLE_DAY_LOGIN*$count_bad_days)); 
			}
		}

Шфг 4
идем в include/ajax/addComment.php и после
/**
         * Добавляем коммент
         */
        if ($bOK and $oEngine->Comment_AddComment($oCommentNew)) {
            $sCommentId = $oCommentNew->getId();

            if ($oTopic->getPublish()) {
                /**
                 * Добавляем коммент в прямой эфир если топик не в черновиках
                 */
                $oTopicCommentOnline = new CommentEntity_TopicCommentOnline();
                $oTopicCommentOnline->setTopicId($oCommentNew->getTopicId());
                $oTopicCommentOnline->setCommentId($oCommentNew->getId());
                $oEngine->Comment_AddTopicCommentOnline($oTopicCommentOnline);
            }

добавляем
/**
             * Motivation
             */
            if (MOTIVATION_ENABLE) {
                $oUserCurrent->setRating($oUserCurrent->getRating()+(($oEngine->Topic_GetTopicById($oCommentNew->getTopicId())->getUserId() == $oUserCurrent->getId())?0:MOTIVATION_COMMENT));
            }

Вроде все)

54 комментария

avatar
если вещь окажется нужной — отправлю в «модули», буду дорабатывать по просьбам.
avatar
однозначно — имеет право на жизнь.
avatar
Вещь более чем нужная, было бы здорово ещё сделать мотивацию «плавающей», т.е. например за 1 комментарий в чужом блоге +1, за второй комментарий +0.3, за третий +0.05, как в яндекс.блогах примерно.
avatar
Спасибо! обязательно потестим!
avatar
Слишком жирно ставить на комментарии.
avatar
ну эта, все в конфиге, а так малоли, кому пригодится и такое «подбадривание»
avatar
Только это не модуль, а хак. Лучше все в нормальный модуль завернуть. Это не так сложно.
avatar
под заворачивание в модуль ты имеешь виду навешивание на хуки или где?
avatar
В данном случае да, без хуков не обойтись. А вообще я имею ввиду, что варианта «в файле после… дописываем ...» лучше избегать всегда, когда это возможно. Первый же апгрейд обернется геморроем.
avatar
Согласен, просто тут с точки зрения пользователя модуль выключается в конфиге, ну а так да — вынесу в хуки
avatar
мм как на счет привернуть баллы за заполненные доп.поля в анкете?
avatar
будет в следующей версии.
avatar
а так же за загрузку фото… аватара… а если это не сделано, например в течении недели — снимать баллы…
avatar
все отлично работает!
avatar
В плане мотивации не хорошо, когда пользователь долго ничего не писал, а потом решил написать и сразу получил минус. Таким образом поощряется писать еще меньше :-))
  • Carw
  • 0
avatar
у меня вначале была мысль вынести это в админ панель и там сделать кнопку для проверки — кто давно не писал, или сделать задачу в кроне, т.к. если проверять как то еще это довольно ресурсоемкая операция на активно развивающемся сайте. Поэтому решил проверять во время постинга
avatar
Можно еще на авторизацию повесить… Хотя я вообще в целом против системы минусов. Уедет человек в отпуск или погрузится в работу, а тут ему еще и подарочек…

Я бы еще добавил настройку на ограничение по карме, когда это все действует. Новичкам допустим это хороший плюс, а тем у кого рейтинг 20, тому уже поровну.
avatar
думаю уже пора в кучу собирать мотивационные штуки всякие.
1. у нас есть мотивация юзера гуглоадсенсом (бесплатный вариант хоть и написан криво. и забыли там например при редактировании топика ставить наместо айди адсенса в базу, но кому надо может и платный взять)

2. мотивация кармой балами и тд. (мне интересна мотивация за заполненость анкеты, за доп анкетирование (делал ктонить? интересно кто как заставлял юзеров дозаполнять анкету если в ней добавились пункты), за посты, каменты, и тд. имею желание вести это отдельным рейтингом, или возможность отделять от общего рейтинга)

3. Можно мотивировать баблом например (ежемесяцный конкурс) отдельный рейтинг. трех лучших по рейтингу (посты, качество постов) премируем вебманями (добавляем доп поле вебмани в анкету), суммы высчитываем из доходов сайта (можно по какойнить формуле высчитывать прибыль принесённую постами пользователя)

4. Сюдаже сотворил бы партнерку по привлечению «писателей», привел %юзернейм% друга, друг написал 50 годных постов, %юзернейм% получил балы

Вобщем готов создать блок мотивации тут. будем там думать как ещё держать юзеров, чем премировать, собирать там готовые решения.
кто за прошу откаментить.
avatar
4. Сюдаже сотворил бы партнерку по привлечению «писателей», привел %юзернейм% друга, друг написал 50 годных постов, %юзернейм% получил балы

получите аналог :)
livestreet.ru/blog/2385.html
avatar
оо невидал =) спасибо =)
avatar
Двумя руками за, только судя по дате что-то затихло всё…
avatar
Хотя я вообще в целом против системы минусов. Уедет человек в отпуск или погрузится в работу, а тут ему еще и подарочек…

В точку. Я тоже категорически против какой-бы то ни было системы «кары» юзеров. Поощрять — да, наказывать — никогда. Минусами вы убьете проект. Я еще нигде и никогда не встречал подобную систему.
avatar
Я еще нигде и никогда не встречал подобную систему.

хабр?
avatar
А там точно есть минусы? Я как-то не замечал. Обсуждения конечно были на эту тему.
avatar
Есть, если долго не пишешь в тематических блогах то сила начинает приближатся с карме, я точно не считал как именно, но факт в том что иногда тебя радуют что твоя сила стала раз так в 5 меньше (один раз было такое утро)
avatar
А… честно говоря я вообще не смотрел на силу никогда. За кармой-то следил, чтобы писать можно было только. А так мне от этих показателей ни тепло, ни холодно.
avatar
Возможно. Меня там нет, поэтому и не встречал)

ЗЫ: Товарищи, быть может у кого-нибудь есть лишние инвайты на хабр и лепру? Буду очень благодарен, если поделитесь. Заранее спасибо)
avatar
Шфг 4
идем в include/ajax/addComment.php
читать как сommentAdd.php
avatar
У меня вопрос.
а вот у вас в примере конфига цифра «100500». В каких единицах? Или это тестовые цифры и если мне, например нужно, чтобы добавилось при создании топика «0,04» к рейтингу так и писать?
avatar
писать
0.04
avatar
спасибо!
avatar
Ошибка после инсталляции модуля. CentOS5.3+nginx0.8.10+php-fpm5.3.0

2009/08/29 07:59:04 [error] 18308#0: *282 FastCGI sent in stderr: «PHP Fatal error: Call to a member function getDateLast() on a non-object in /home/websrv/domains/razvit.net/classes/modules/user/User.class.php on line 191» while reading response header from upstream, client: 79.165.95.171, server: razvit.net, request: «GET /blog/razvitnet/4.html HTTP/1.1», upstream: «fastcgi://127.0.0.1:9000», host: «razvit.net»
  • Daaa
  • 0
avatar
Привет применения коридор
  • Angel
  • -1
avatar
тьфу, пример смысле
avatar
define("MOTIVATION_TIME_POSTING",60*60*24*1)


Будьте любезны — расшифруйте формулу… Мне необходимо поставить 5 дней.
avatar
define("MOTIVATION_TIME_POSTING",60*60*24*5)
avatar
Отказывается работать =(

Содержимое конфига выводит в макушку сайта…

И вот такая вот надпись ниже:
Warning: Cannot modify header information — headers already sent by (output started at /home/site/domains/site.ru/public_html/classes/modules/sys_session/session.class.php) in /home/site/domains/site.ru/public_html/include/function.php


От… =(
avatar
Извините. Разобрался.
avatar
В виде модуля не будет?
avatar
Есть маленькое «но». Создал топик — получил бонус в карму.
Отредактирова уже существующий топик — дает бонус в карму, как будто создал новый топик. Это не есть хорошо =) Можно накручивать рейтинг себе…
avatar
хочется видеть поправку на этот нюанс!
avatar
возникла проблема с повышением рейтинга за комментарии, не работает.
  • Repa
  • 0
avatar
голая система отсюда
поставил «атодополнение к блогам», «админку» и один шаблон

поставил выше описанное

ничего не происходит((
ни сила, ни рейтинг не изменяются при написании новых постов
куда копать? подскажите пжта
avatar
Прочитал все комментарии.
Предложения по улучшения конечно интересные, но «не менее интересная» и возня с кодом :)
Ребят, разве никто не может собраться и сделать все в одном модуле, так сказать «по заявкам» и оформить в ПЛАТНЫЕ модули?
С удовольствием бы приобрел за 200-300р. уверен и другие бы не отказались!
P.S. полчаса прокрутки комментов как то напрягает :)
avatar
Вы про какие предложения по улучшению, за которые хотите отдать 200-300р? :)
avatar
Поясните, по параметрам

define("MOTIVATION_DISABLE_DAY_LOGIN",-1); //Сколько минусовать если день не был на сайте

например, не был 3 дня, вычтется 1 или 3?

define("MOTIVATION_PERSONAL_BLOG_TOPIC",1); //Сколько плюсовать на пост в персональном блого
define("MOTIVATION_BLOG_TOPIC",5); //Сколько плюсовать за пост в коллективном блоге

что произойдет при переносе из персонального в коллективный автором, а если не автором, админом?

define("MOTIVATION_TIME_POSTING",60*60*24*1); //Время, в течении которого штрафовать пользователя за отсутвие постов
define("MOTIVATION_DISABLE_POSTING",-10); //Сколько минусовать если пользователь не постил в течении вышеописанного времени

опять же если не писал 3 дня заминусуется -10 или -30?
и что подразумевается под «постить» только посты или комментарии тоже считаются публикацией?
avatar
Реализации под LS 0.4.2 не будет?
avatar
Дааа было бы хорошо увидеть под 0.4.2… Можт есть умельцы?
avatar
Поддерживаю! Плагин необходим!
avatar
Страшно делать всё, что написано в августе 2009 для 0.4.2… Мэй би Angel откликнется если несколько человек попросят…
avatar
просим для 0.4.2
avatar
ктобы организовал в плагин за бабосики…
avatar
хелп. нужен плагин
avatar
Вознаграждение за ежедневные заходы для ЛС1.0.1 здесь: livestreet.ru/blog/12441.html
  • NPC
  • 0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.