Перейти к контенту

Счётчик сообщений пользователя


theIggs

Рекомендуемые сообщения

Все, надеюсь, знают, что в Invision Power Board'e, как и во многих других форумах, у каждого пользователя есть счётчик постов. :D Каждый раз, когда пользователь отправляет сообщение в форум, его счётчик увеличивается на единицу.

В IPB есть стандартная возможность отключить счётчик постов в отдельных форумах ( Админцентр -> Forum Control (Настройки форумов) -> Manage Forums (Управление форумами), Settings (Настройки), Posts in this forum increase member's cumulative post count? (Включить счётчик сообщений в этом форуме?) = Нет.

После удаления постов модераторами число сообщений у пользователя не изменяется. Таким образом, счётчик - один из самых главных показателей активности пользователя на форуме.

Ссылка на комментарий
Поделиться на других сайтах

Сейчас мы будем немного изменять работу счётчика. :D Согласитесь, иногда раздражает, что разного рода флудеры незаслуженно торчат в статистике среди первых. Сделаем так, что после удаления постов модераторами счётчик сообщений у пользователя будет уменьшаться.

 

1. Уменьшение счётчика постов после удаления отдельных постов.

Открыть sources/Moderate.php. Найти:

$DB->query("UPDATE ibf_stats SET TOTAL_REPLIES=TOTAL_REPLIES-1");

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

        if ($this->forum['inc_postcount'])
        {
            $DB->query("UPDATE ibf_members SET posts=posts-1 WHERE id='".$post['author_id']."'");
        }

Должно работать на всех версиях IPB.

Оригинальный мод тут: http://www.ibresource.ru/db/?mod=59

 

2. Уменьшение счётчика сообщений после удаления тем.

ВНИМАНИЕ! Не используйте этот вариант - используйте лучше вариант из сообщения: Счётчик сообщений пользователя

Открыть sources/lib/modfunctions.php. Найти:

 

       $DB->query("DELETE FROM ibf_topics WHERE tid".$tid);

 

Заменить на:

 

        $DB->query("SELECT t.tid FROM ibf_topics t, ibf_forums f WHERE t.forum_id = f.id AND f.inc_postcount != 1 AND t.tid".$tid);
        
        $exclude_topics = '';
        
        while ($row = $DB->fetch_row() )
        {
            $exclude_topics .= $row['tid'].',';
        }
        
        $exclude_topics = substr($exclude_topics, 0, strlen($exclude_topics)-1);
        
        if ($exclude_topics != '') $extra = "NOT (topic_id IN ($exclude_topics)) AND";
        
        $DB->query("DELETE FROM ibf_topics WHERE tid".$tid);
        
        $DB->query("SELECT author_id FROM ibf_posts WHERE $extra topic_id".$tid);
        
        $postz = array();
        
        while ($row = $DB->fetch_row() )
        {
            $postz[ $row['author_id'] ] ++;
        }
        
        foreach ($postz as $id => $count)
        {
            $DB->query("UPDATE ibf_members SET posts = posts - $count WHERE id='$id'");
        }

С версиями 1.1.х работать не будет, там система немного другая. Если вдруг кому-то понадобится, напишите здесь. Хотя прежде всего - обновляться надо, товарищи!

Связанная тема тут: Проблема с счетчиком сообщений.

Ссылка на комментарий
Поделиться на других сайтах

Теперь добавим механизм пересчёта постов тех пользователей, которые уже успели зафлудить форум, но остались безнаказанными. :D

В Админцентре -> Administration (Администрирование) -> Recount Statistics (Пересчёт статистики) есть настройка для пересчёта количества тем и сообщений, но она пересчитывает только общее число постов и тем на форуме.

Добавим туда же настройку, которая произведёт пересчёт постов всех пользователей в соответствии с реальной ситуацией.

 

Открыть sources/sources/Admin/ad_settings.php. Найти:

 	$ADMIN->html .= $SKIN->add_td_row( array( "Recount total topics and posts",
              $SKIN->form_dropdown( 'posts', array( 0 => array( 1, 'Yes'  ), 1 => array( 0, 'No' ) ) )
           )      );

Внимание! Если у вас установлен русифицированный Админцентр, ищите по тем строчкам, которые не содержат русских символов, и всё будет пучком. ;)

 

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

 	$ADMIN->html .= $SKIN->add_td_row( array( "Пересчитать посты всех пользователей?",
              $SKIN->form_dropdown( 'allposts', array( 0 => array( 0, 'Нет' ), 1 => array( 1, 'Да' ) ) )
           )      );

 

Найти:

$stats = array();

 

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

        if ($IN['allposts'])
        {
            $DB->query("SELECT id, posts FROM ibf_members WHERE 1");
            
            $oldpostz = array();
            
            while ($row = $DB->fetch_row()) $oldpostz[ $row['id'] ] = $row['posts'];
            
            $DB->query("SELECT author_id, COUNT(author_id) AS theposts FROM ibf_posts WHERE 1 GROUP BY author_id");
            
            $postz = array(); 
            
            while ($row = $DB->fetch_row()) $postz[ $row['author_id'] ] = $row['theposts'];
            
            $DB->query("SELECT p.author_id, COUNT(p.author_id) AS minusposts FROM ibf_posts p, ibf_forums f WHERE (p.forum_id = f.id AND f.inc_postcount = 0) GROUP BY p.author_id");
            
            while ($row = $DB->fetch_row()) $postz[ $row['author_id'] ] -= $row['minusposts'];
            
            foreach ($oldpostz as $id => $count)
            {
                if (!$postz[ $id ]) {$postz[ $id ]=0;}
                
                if ($postz[ $id ] != $oldpostz[ $id ]) $DB->query("UPDATE ibf_members SET posts = {$postz[ $id ]} WHERE id = '$id'");
            }
        }

 

В разделе Пересчёт статистики теперь наблюдаем новый пункт - Пересчитать посты всех пользователей.

 

Спасибо ZiLot за помощь в отладке.

Ссылка на комментарий
Поделиться на других сайтах

theIggs

Один манюсенький вопрос. Вернее два. ;)

 

1. Работает ли всё тобой описанное выше ПРАВИЛЬНО в тех форумах, где счётчик постов ОТКЛЮЧЁН ? Поясню : например юзер запостил на таком форуме. Счётчик не сработал, правильно ? Тут злой модер удаляет данный пост. А вот и сам вопрос : не обминусится ли в этом случае счётчик данного юзера ? ( если да, то что можно сделать )

Исправлено, теперь должно работать. :)

 

2. Если на форуме ПОЗВОЛЕНО самим пользователям удалять СВОИ СООБЩЕНИЯ и/или ТЕМЫ, в данном случае будет ли работать всё, описанное тобой выше ??? ( если нет, то что можно сделать )

Всё будет работать, ведь в любом случае удаление идёт через одни и те же функции.

 

Спасибо.

Пожалуйста. :) Тебе спасибо за замечания в тему! :D

Изменено пользователем theIggs
Ссылка на комментарий
Поделиться на других сайтах

На всякий случай добавим возможность пересчёта постов отдельных пользователей (вдруг общий сброс счётчиков не требуется?).

 

Открываем sources/Admin/ad_member.php.

Найдём:

	 $ADMIN->html .= $SKIN->add_td_row( array( "<b>Post Count</b>" ,
             $SKIN->form_input("posts", $mem['posts'])
             )      );

 

Ниже добавим:

	 $ADMIN->html .= $SKIN->add_td_row( array( "<b>Пересчитать посты этого пользователя?</b>" ,
             $SKIN->form_yes_no("posts_recount", 0)
             )      );

 

Найдём:

	 $restrict_post = 0;

 

ВЫШЕ добавим:

        if ($IN['posts_recount'])
        {
            $DB->query("SELECT COUNT(p.pid) AS postz FROM ibf_posts p, ibf_forums f WHERE (p.forum_id = f.id AND f.inc_postcount = 1) AND p.author_id = '".$IN['mid']."'");
            
            $row = $DB->fetch_row();
            
            $IN['posts'] = $row['postz'];
        }

 

Теперь в форме редактирования пользователя (Админцентр -> Users & Groups -> Find / Edit / Suspend User) сразу после текущего числа сообщений пользователя добавится настройка Пересчитать посты этого пользователя?

Ссылка на комментарий
Поделиться на других сайтах

  • 4 недели спустя...
  • 1 месяц спустя...
Уменьшение счётчика сообщений после удаления тем.

Чего-то ты здесь наворотил..

Вот так ИМХО оно более компактно и логично:

         $DB->query("DELETE FROM ibf_topics WHERE tid".$tid);
 	$DB->query("select author_id from ibf_posts,ibf_forums where topic_id".$tid.
                           " and forum_id=ibf_forums.id and ibf_forums.inc_postcount=1 and author_id<>0");

  if ( $DB->get_num_rows() )
   {
     $ids = array();
     while ($row = $DB->fetch_row() ) $ids[ $row['author_id'] ] ++;
     foreach ($ids as $mid => $count) $DB->query("UPDATE ibf_members SET posts=posts-$count WHERE id='".$mid."'");
   }

Ссылка на комментарий
Поделиться на других сайтах

  • 2 недели спустя...

Song

А вот эта строчка как правильно выглядит?

 

Так -

 

$DB->query("select author_id from ibf_posts,ibf_forums where topic_id".$tid.
                           " and forum_id=ibf_forums.id and ibf_forums.inc_postcount=1 and author_id<>0");

 

или так, в одну строку?

 

$DB->query("select author_id from ibf_posts,ibf_forums where topic_id".$tid. " and forum_id=ibf_forums.id and ibf_forums.inc_postcount=1 and author_id<>0");

Ссылка на комментарий
Поделиться на других сайтах

После установки всего вышеперечисленного, пересчёт прошёл отлично.

Только вот глючок вылез. Хотелось бы знать, сталкивался ли кто и как лечилось.

 

Модеры, супермодеры и админы удаляют и переносят (с удалением на старом месте) темы. Внешне всё как положено - подтверждение удаления, редирект с извещением об удалении, только тема остаётся на своём месте. Удаляются только сообщения внутри темы. А саму тему можно завалить только напрямую через БД, блин :D

Ссылка на комментарий
Поделиться на других сайтах

Блин! Я с ходу подумал, мне предлагают через mysql tools в АЦ удалять эти топики...

Верно, при замене кода данную строчку я убил. Теперь всё ОК! Спасибо за подсказку!

Ссылка на комментарий
Поделиться на других сайтах

Вопрос

Если есть форум в котором сообщения не засчитываются (условно Форум Х), то пересчитываемое количество сообщений не должно включать те сообщения которые в Форуме Х. Это учитывается?

Было бы хорошо, если бы при переносе темы в ФОрум Х у авторов сообщений отнималось кол-во сообщений, опубликованных в переносимой теме.

Ссылка на комментарий
Поделиться на других сайтах

Это учитывается?

Учитывается.

Было бы хорошо, если бы при переносе темы в ФОрум Х у авторов сообщений отнималось кол-во сообщений, опубликованных в переносимой теме.

Зачем?

Ссылка на комментарий
Поделиться на других сайтах

Учитывается.
Ok.
Зачем?
Ну, раз сообщения в форуме Х признаются "неполезными", то какая разница были они там изначально или были перенесены туда? Имхо, следовало бы отнимать.

 

Добавлено в [mergetime]1085170088[/mergetime]

ИМХО функция полезная, может народные умельцы подумают над этим?

Ссылка на комментарий
Поделиться на других сайтах

Это нельзя сделать т.к. сообщения в тему могли попасть как угодно: начиная от перемещения и заканчивая разделением. А у сообщений нет признака что ни перемещены и тем более того где они были раньше. Самое большее у топика. Можно конечно смотреть нет ли линка на перемещения от топика, к которому они принадлежат, но это получится довольно тормозно. А линки можно не ставить при перемещении. Так что в общем случае твоя проблема стандартными полями не решается, а в частном - можно, но довольно криво.
Ссылка на комментарий
Поделиться на других сайтах

  • 1 месяц спустя...

Вопрос :D

 

у меня на форуме: если например я только только зделал *форум* в админке и в настройках отменил счетчик сообшений то у пользователя почемуто

после добавления сообшения в даный форум не отображаетса в обшее количество его сообшений

тоесть до добавления у него было всего 0 сообшений после добавления

в выше написаный форум у него вместо 1 сообшения - осталось 0 ;)

 

ето так должно быть и исправляет хак ету функцию

Ссылка на комментарий
Поделиться на других сайтах

  • 3 недели спустя...

Помогите пожалуйса мне.

Мне нужно 2 счетчика сообщений, один который всегда есть, т.е считает все сообщения в любых темах, и 2-ой который считал бы только в определенных разделах? И чтобы потом втрой можно было обнулить. В адинку можно ограничить число разделов, но как зделать 2-ю строчку сообщений???? :D

 

Должно находиться под "датой регистрации"

Ссылка на комментарий
Поделиться на других сайтах

Тебе нужно создать новое поле в таблице ibf_forums чтобы отмечать там элитные форума и поле в таблице ibf_members и смотреть файлы sources/lib/post_******.php на предмет того в каких строчках увеличивается число сообщений. Делать выборку валидности форумов твоему новому полю и в зависимости от результата увеличивать число. А вывод в топик по аналогии с теми же постами Topics.php и skin_topic.php :D
Ссылка на комментарий
Поделиться на других сайтах

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.