Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » IkonBoard и другие форумы » Ikonboard v.2 » Хак удаления участников

Модерирует : Antuan

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

lynx



Advanced lynx
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Открываю новую тему, потому что в старых много лишнего мусора в виде флейма и очень мало толковых ответов.
 
Речь идет о хаке удаления участников, имеющие определенное число постов и не постивших определенное число дней.
То есть с его помощью можно удалить юзеров, имеющих 0 постов и не постивших 365 дней или более. Это означает, что мембер зарегистрировался год или более назад и с тех пор не написал ничего. Зачем держать на конфе мертвого мембера, тем более, что его ник может быть хотелось бы иметь кому-то новому при регистрации, ан ник то занят мертвым пользователем.
 
Хак описан в статье Аусвайса: Немного новых и исправленных хаков к IB2
 

Цитата:
Этот хак позволит Вам удалять участников, имеющих N постов. Вводите в окошко количество постов, после чего производится поиск... и список жертв перед Вами. Повторное нажатие на кнопку "Продолжить" решит все их проблемы.  
Также есть UPDATE хака: Удаление участников, имеющих N постов и не писавших M дней.  
Одна неприятность: если удалить участника хотя бы с одним постом, то в сообщении вместо его имени будет красоваться надпись Deleted Member.  

 
В том виде, как хак лежит в файловом архиве он представляет собой два файла. Сначала надо выполнить инстукции из первого - delnumofposts.txt, а затем из второго: deldatup.txt
Если кто-то заинтересуется, то я могу сделать из этих двух файлов один, чтобы сразу ставилось и удаление по числу постов и удаление по числу дней.
 
 
Какие проблемы у этого хака?
 
Первое - очень некрасивый и непонятный вывод списка участников, подлежащих удалению. И не выводится число (цифра) участников, сколько всего собственно их будет удалено, приходится считать по строчкам руками.
 
Второе - не предусмотрена возможность отката при ошибки (а также не ведется лог удаленных участников), например, какой-то пользователь, имеющий ноль постов, может после удаления взмолиться и сказать, что все то время, в течение которого он не постил, он являлся самым активным читателем форума. Такое нередко, по примеру на ру-борда.
 
Третье - если на вашей конференции есть форумы, в которых отключен счетчик постов, например, если юзер постит только во Флейме, а там посты не считаются, то скрипт удаления этого не определит и удалит бедного активного флеймера.
 
Четвертое (хотя, спорно, проблема это или нет) - идет ребилд общего числа участников на конференции. А если не хотите потерять кровно заработанное число прошедших регистрацию, то вам эта функция совершенно не нужна.
 
 
Я попыталась устранить эти недостатки.
 
Все извращения производятся на файле setmembers.cgi
 
Собственно весь хак - это две подпрограммы: deldatofpos и suredeldatpos, которые я немного поправила. Первая подготовливает список участников для удаления в зависимости от заданных условий, вторая - удаляет и ребилдит ибщую информации о числе участников на конференции.  
Ниже приведу код подпрограмм и комментарии.
 
Я заменила вывод списка тех, кого планируется удалить. По умолчанию каждое поле разрисовано разными цветами, что просто рябит в глазах, кроме того, каждая строка  мембера, которого планируется удалить, выводится с новой строки, а вовсе не табличкой, что ужасно перекореживает все и просто невозможно читать.
 

Код:
 
sub deldatofpos {
 
$numofdays = $query -> param('daytodel');
$numofpos = $query -> param('numberofposts');
 
    $dirtoopen = "$ikondir" . "members";
 
    opendir (DIR, "$dirtoopen");  
    @filedata = readdir(DIR);
    closedir (DIR);
 
    @sortedfile = sort(@filedata);
    @sortedfile = grep(/cgi/,@sortedfile);
    @sortedfile = sort alphabetically(@sortedfile);
 
$days = $numofdays * 24 * 60 * 60;
$now = time;
$deldate = $now - $days;
$notposteddate=&shortdate("$deldate");    
   
        $tempoutput = "";
###Вот тут пошел вывод таблицей

##У вас наверняка не посажен форум на css,  
##поэтому просто уберите из кода ниже код  <div class="bleft"> и </div>,  
##хотя не будет ошибки, если вы его оставите.

 
##Выводим таблицей start
$tempoutput .= qq~
<center>
<table width="100%">
<tr>
<td><div class="bleft">Имя</div></td>
<td><div class="bleft">lastpost</div></td>
<td><div class="bleft">Постов &#160;</div></td>
<td><div class="bleft">Дата регистрации</div></td>
</tr>
 
~;
## выводим таблицей end  
 
        foreach (@sortedfile) {
                unless ($_ eq "$ltr") {
                        $member = $_;
                        open (FILE, "$ikondir" . "members/" . "$_");
                        $todeldata = <FILE>;
                        close (FILE);
                        @totrash = split(/\|/,$todeldata);
                        $lastpostdate = @totrash[14];
                        $registerdate = @totrash[13];
                        $numofmsgs = @totrash[4];
                        ($userinfo_POSTDATE, $userinfo_POSTURL, $userinfo_POSTTOPIC) = split(/\%%%/,$lastpostdate);
 
 
#####проверка на наличие хоть одного поста
                 
###Далее мы удаляем только тех участников,  
###кто действительно ни разу не постил, определяя,  
###есть ли вообще у человека ластпост, не важно, в каком форуме,  
###пускай и в том, где посты не считаются

 
                 
if (($userinfo_POSTDATE <= $deldate)&&($registerdate<$deldate)&&($lastpostdate =~m/писал/))
 
{
                                if ($numofmsgs <= $numofpos) {
                                        push(@todelete,$_);
                                        $memnam = $_;
                                        $memnam =~ s/.cgi//ig;
                                        $hisdate = &longdate($userinfo_POSTDATE);
                                        $regdate = &longdate($registerdate);
####Продолжаем выводить таблицей
### В столбцах: имя, дата последнего поста, число постов по счетчику постов, дата регистрации
                                         
                                        $tempoutput .= qq~
                                        <tr>
                                        <td><div class="membername">$memnam</div></td>
                                        <td><div class="table">$hisdate</div></td>
                                        <td><div class="table">$numofmsgs</div> </td>
                                        <td><div class="table">$regdate</div></td>
                                        ~;
                                }        
                        }
                        $ltr = "$_";
                }
        }
         
$todelwithcomma = qq~<input type=hidden name=suredeldat value="~;
$num=0;
$numder_of_del_users=@todelete;  
 
        foreach $del (@todelete) {
                if ($num eq 0) { $todelwithcomma .= qq~$del~; }
                else {
                $todelwithcomma .= qq~,$del~;
                }
                $num++;
        }
         
        $todelwithcomma .= qq~">
 
###Заканчиваем табличку
</tr>
</table></center>
~;
 
 
 
        if ($tempoutput) { $continuehtml = "<input type=submit value=\"Продолжить\">"; }
        else { $tempoutput = "Nobody fits this conditions"; $continuehtml = "<input type=button value=\"Back\" onClick=\"javascript:history.go(-1)\">"; }
         
    print qq~
        <form action="$thisprog" method="post">
        <input type="hidden" name="action" value="suredeldatpos">
<!-- Тут мы предупреждаем сами себя, сколько участников мы удаляем и с какого времени они не постили. Я удаляю только тех, у кого ноль постов, поэтому число постов не вывожу.    //-->
   
    <tr>
    <td bgcolor=#EEEEEE valign=middle align=center colspan=2>
<font face=verdana color=#990000 size=2>Эти <b>$numder_of_del_users</b> участников не постили с <b>$notposteddate</b> и будут удалены<p>
        </td>
        </tr>
       

        <tr>
    <td bgcolor=#FFFFFF valign=middle colspan=2>
    $tempoutput
     
        $todelwithcomma
    </td>
        </tr>
        <tr>
        <td bgcolor=#FFFFFF valign=middle align=center colspan=2>
        $continuehtml
        </form>
    </td>
    </tr>
    ~;
 
} # end route
 
 

 
 
 
С первой подпрограммой все. Она красиво выведет табличку мемберов, подлежащих удалению и скажет, с какого числа они не постили и сколько их всего.
 
 
 

Код:
 
 
sub suredeldatpos {
 
$todel = $query -> param('suredeldat');
@suredeldat = split(/\,/,$todel);
$numder_of_del_users=@suredeldat;
 
$deleted=0;
foreach $del (@suredeldat) {
$dele = $del;
$dele =~ s/.cgi//ig;
$tempoutput .= qq~$dele<br>~;
$filetounlink = "$ikondir" . "members/$del";
##Тут будьте внимательны!
$filetomove = "$ikondir" . "membersdelete/$del";


##Мы не будем удалять файлы мемберов, а переместим их в другой каталог
##Там же, где у вас каталог members/, создайте каталог membersdelete/
##и поставьте ему права 755.


#unlink $filetounlink;   - эту строчку надо закомментировать!!!
rename ("$filetounlink","$filetomove") or die "По какой-то причине не могу переместить файлы $!";

 
$deleted++;
}

###Далее, мы уберем обновление статистики участников на конференции.  
###То есть на вашей главной странице по прежнему будет то число участников,  
###как и до удаления.  
###Если захотите все-таки на главной выводить  
###истинное число файлов в папке members/,  
###то просто в админцентре нажимите "Обновить информацию о посещениях пользователей".
###Мы не будем удалять этот код, мы его закомментируем.

 
 
=begin

#Не ребилдим чисто участников после удаления    
Обратите внимание на то, что знак равенства перед словом begin должен находиться в самом начале строки! Это синтаксис многострочного комментария в Perl.
 

        require "$ikondir" . "data/boardstats.cgi";
$newtotalmembers = $totalmembers - $deleted;
        $filetomake = "$ikondir" . "data/boardstats.cgi";
        open(FILE, ">$filetomake");
        flock(FILE, 2);
        print FILE "\$lastregisteredmember = \"$lastregisteredmember\"\;\n";
        print FILE "\$totalmembers = \"$newtotalmembers\"\;\n";
        print FILE "\$totalthreads = \"$totalthreads\"\;\n";
        print FILE "\$totalposts = \"$totalposts\"\;\n";
        print FILE "\n1\;";
        close (FILE);
=cut
##Конец многострочного комментария.  
##Правила для него те же - знак равенства в самом начале строки.

 
###Выводим информацию об общем числе удаленных мемберов.
print qq~

<tr>
<td bgcolor=#EEEEEE valign=middle align=center colspan=2>
<font face=verdana color=#990000 size=2>Удалено <b>$numder_of_del_users</b> участников, а именно:<p>
</td>
</tr>

<!-- ##Выводим в столбик список удаленных //-->
<tr>
<td bgcolor=#FFFFFF valign=middle align=left colspan=2>
<div class="bodybig">
$tempoutput
</div>
</td>
</tr>
~;
 
} # end route
 
 

 
 
Как вы заметили по коду, мы не удаляем участников, а перемещаем их файлы в другой каталог. Для этого такой каталог должен быть создан и разрешена запись в него Перлу.  Создайте рядом с каталогом members/ каталог membersdelete/  и поставьте ему права 755.  
 
В случае, если участник напишет вам, как админу, слезное письмо на мыло с просьбой восстановления его аккаунта, вы легко восстановите информацию о нем, просто переместив его файл обратно. Кроме того, можно в дальнейшем заняться написанием скрипта, анализирующего список удаленных мемберов Ну, это уже кому как хочется.
 
Конечно, лог удаленных мемберов в этом случае не ведется, но меня такой вариант пока вполне устроил.
 
 
 
 
 
Если вам понравилось такое решение, то можно его оформить отдельным файлом, полностью содержащим весб код хака, и положить в архив.
 
Тут у Хнома были замечания про пм-ки удаленного мембера, но он сейчас это сам скажет. Мне никогда не приходило в голову ползти в каталог с пм-ками, поэтому я упустила сей момент  из виду

Всего записей: 11712 | Зарегистр. 08-05-2001 | Отправлено: 00:16 12-09-2003 | Исправлено: lynx, 05:23 14-09-2003
Xnom



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Тут у Хнома были замечания про пм-ки удаленного мембера, но он сейчас это сам скажет.

угу %)
 
итак, если стоит хак приветствия нового участника, то удаляя неактивных, их ПМки остаются. решается всё очень просто.
 
после

Код:
$deleted=0;  
foreach $del (@suredeldat) {  
$dele = $del;  
$dele =~ s/.cgi//ig;  
$tempoutput .= qq~$dele<br>~;  

 
дописываем

Код:
$filetounlink2 = "$ikondir" . "messages/$dele"."_msg.cgi";
$filetounlink3 = "$ikondir" . "messages/$dele"."_out.cgi";
unlink $filetounlink2;
unlink $filetounlink3;

 
учитывая добавление lynx,

Цитата:
##Мы не будем удалять файлы мемберов, а переместим их в другой каталог  
##Там же, где у вас каталог members/, создайте каталог membersdelete/  
##и поставьте ему права 755.

можно ПМки не удалять, а перемещать их в другую папку, чтоб не мешались %)

Всего записей: 778 | Зарегистр. 09-10-2002 | Отправлено: 12:16 12-09-2003
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » IkonBoard и другие форумы » Ikonboard v.2 » Хак удаления участников


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru