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">Постов  </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 |
|