natali писал(а):а блокнотик всё пишет и пишет сцуко )))))
А вы раскоментировали блок, чтоб все ссылки обнаружавались?
natali писал(а):а блокнотик всё пишет и пишет сцуко )))))
$bot_link_count = 0;if ($userdata['user_id'] == ANONYMOUS ) $bot_max_link=0;Люди, подскажите, а в этот код можно ввести дополнительную проверку - зарегистрированный ли юзер постит или нет? Ведь тогда можно просто запретить незарегистрированным юзерам вообще размещать ссылки.
А? подскажите код человеку-непрограммисту
lex писал(а):Но только сообщение выведится как для рекламного бота.
Потом доработаю
edgar писал(а):А что делает эта строчка?
Код:
$bot_link_count = 1;
lex писал(а):А такой строчки нет
Stern писал(а):Надо для ЗАРЕГИСТРИРОВАННОГО пользователя. Чтобы после регистрации и только после оставления нескольких постов ему разрешалось закинуть ссылку. (гости вообще запрещено постить)
Жду с нетерпением доработки!
# OPEN
includes\functions_post.php
# FIND
# именно в функцию prepare_message(), а не submit_post() - иначе
# не будут обрабатываться прицепляемые мессаги, а только новые
if($bbcode_on && $bbcode_uid != '')
{
$message = bbencode_first_pass($message, $bbcode_uid);
}
# AFTER ADD
/* ---8<--------[Detector Bots]----------------------------------------- */
global $unhtml_specialchars_match, $unhtml_specialchars_replace,$client_ip,$user_ip,$db,$userdata,$phpbb_root_path,$phpEx;
$first_post_max_link = 1; // позволено линков Гостю и Юзеру в самом первом посте, все слепленные считаются одним постом
$newbie_max_link = 10; // позволено линков новичку, написавшему более 1 поста
$oldbie_minposts = 16; // старичком считаем юзера, написавшего хотя бы 16 постов
$oldbie_max_link = 15; // позволено линков старичку
$use_yellowcard = true; // штрафовать юзера. Если MOD YellowCard не установлен, поставить FALSE
$send_email_to_admin = true; // отправлять уведомление админу
$link_count = 0;
preg_match_all('/\[url(.*?)\[\/url\]/i',$message, $links);
if (isset($links[1])) {$link_count += count($links[1]); }
/* ---8<-----[ BEG раскомментируйте эту часть, если хотите находить ссылки любого вида]----------- */
preg_match_all("#(^|[\n ])([\w]+?://[^ "\n\r\t<]*)#is", $message, $links);
if (isset($links[1])) {$link_count += count($links[1]); }
preg_match_all("#(^|[\n ])((www|ftp)\.[^ "\t\n\r<]*)#is", $message, $links);
if (isset($links[1])) {$link_count += count($links[1]); }
/* ---8<-----[ END раскомментируйте эту часть, если хотите находить ссылки любого вида]----------- */
if ($userdata['user_level'] == ADMIN && $userdata['session_logged_in']) {$link_count=0;} // не надо банить админа
if ($userdata['user_level'] == ANONYMOUS)
{
if ($link_count > $first_post_max_link)
{
if ($send_email_to_admin)
{
include($phpbb_root_path . 'includes/emailer.'.$phpEx);
$emailer = new emailer($board_config['smtp_delivery']);
$emailer->from($board_config['board_email']);
$emailer->replyto($board_config['board_email']);
$emailer->use_template('detector_bot', $board_config['default_lang']);
$emailer->email_address($board_config['board_email']);
$emailer->set_subject('Попытка размещения рекламы');
$emailer->assign_vars(array(
'SITENAME' => $board_config['sitename'],
'EMAIL_SIG' => (!empty($board_config['board_email_sig'])) ? str_replace('<br />', "\n", "-- \n" . $board_config['board_email_sig']) : '',
'IP' => $client_ip,
'POSTS' => '',
'LINKS' => $link_count,
'RESULT' => 'Сообщение не отправлено.',
'USERNAME' => preg_replace($unhtml_specialchars_match, $unhtml_specialchars_replace, substr(str_replace("\'", "'", $userdata['username']), 0, 25)),
'MESSAGE' => preg_replace($unhtml_specialchars_match, $unhtml_specialchars_replace, substr(str_replace("\'", "'", $post_message), 0, 1000)),
'SUB' => preg_replace($unhtml_specialchars_match, $unhtml_specialchars_replace, substr(str_replace("\'", "'", $post_subject), 0, 100))));
$emailer->send();
$emailer->reset();
}
message_die(GENERAL_MESSAGE, 'Зафиксирована попытка размещения рекламного сообщения. Для того, чтобы иметь возможность размещать ссылки необходимо <a href="profile.php?mode=register">зарегистрироваться</a>.');
}
}
elseif ($userdata['user_posts'] < 2 && $link_count > $first_post_max_link) // Самый первый пост. А <2 потому что если склеиваем, пост будет все равно первый, но число постов уже 1
{
// киляем и пост и юзера! без предупреждения...
$sql = "DELETE FROM " . SESSIONS_TABLE . " WHERE session_ip ='$user_ip'";
if (!$db->sql_query($sql)) { message_die(GENERAL_ERROR, 'SQL Quering error', '', __LINE__, __FILE__, $sql); }
$sql = "SELECT group_id FROM " . USER_GROUP_TABLE . " WHERE user_id = ".$userdata['user_id'];
if ($row = $db->sql_fetchrow($db->sql_query($sql)))
{
$sql = "DELETE FROM " . GROUPS_TABLE . " WHERE group_id = ".$row['group_id'];
if (!$db->sql_query($sql)) { message_die(GENERAL_ERROR, 'SQL Quering error', '', __LINE__, __FILE__, $sql); }
}
$sql = "DELETE FROM " . USER_GROUP_TABLE . " WHERE user_id = ".$userdata['user_id'];
if (!$db->sql_query($sql)) { message_die(GENERAL_ERROR, 'SQL Quering error', '', __LINE__, __FILE__, $sql); }
$sql = "DELETE FROM " . USERS_TABLE . " WHERE user_id = ".$userdata['user_id'];
if (!$db->sql_query($sql)) { message_die(GENERAL_ERROR, 'SQL Quering error', '', __LINE__, __FILE__, $sql); }
// грамотно чистим форум (корректно обрабатываются склеенные сообщения)
if (isset($GLOBALS['topic_id'])) // продолжаем топик ? убить пост, оставить топик : прервать отправку
{
$sql = "SELECT Count(*) AS posts_in_topic, poster_id, topic_id FROM ".POSTS_TABLE." GROUP BY topic_id, poster_id HAVING topic_id = ".$GLOBALS['topic_id']." AND poster_id <> ".$userdata['user_id'];
if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'SQL Quering error', '', __LINE__, __FILE__, $sql); }
// $sql = "DELETE p.* FROM ".POSTS_TABLE." p LEFT JOIN ".USERS_TABLE." u ON p.poster_id = u.user_id WHERE (u.user_id Is Null)";
// if (!$db->sql_query($sql)) { message_die(GENERAL_ERROR, 'Cannot delete posts', '', __LINE__, __FILE__, $sql); }
$sql = "SELECT p.* FROM ".POSTS_TABLE." p LEFT JOIN ".USERS_TABLE." u ON p.poster_id = u.user_id WHERE (u.user_id Is Null)";
if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'Cannot select posts', '', __LINE__, __FILE__, $sql); }
while ($row = $db->sql_fetchrow($result)) {
$sql = "DELETE FROM ".POSTS_TABLE." WHERE post_id = ".$row['post_id'];
if (!$db->sql_query($sql)) { message_die(GENERAL_ERROR, 'Cannot delete posts', '', __LINE__, __FILE__, $sql); }
}
// $sql = "DELETE pt.* FROM ".POSTS_TEXT_TABLE." pt LEFT JOIN ".POSTS_TABLE." p ON p.post_id = pt.post_id WHERE (p.post_id Is Null)";
// if (!$db->sql_query($sql)) { message_die(GENERAL_ERROR, 'Cannot delete post texts', '', __LINE__, __FILE__, $sql); }
$sql = "SELECT pt.* FROM ".POSTS_TEXT_TABLE." pt LEFT JOIN ".POSTS_TABLE." p ON p.post_id = pt.post_id WHERE (p.post_id Is Null)";
if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'Cannot select post', '', __LINE__, __FILE__, $sql); }
while ($row = $db->sql_fetchrow($result)) {
$sql = "DELETE FROM ".POSTS_TEXT_TABLE." WHERE post_id = ".$row['post_id'];
if (!$db->sql_query($sql)) { message_die(GENERAL_ERROR, 'Cannot delete post text', '', __LINE__, __FILE__, $sql); }
}
// обновляем статистику по топику и форумам (иначе глюк: пропадает тема, хоть и не удаляется)
$sql = "SELECT MIN(post_id) AS first_post, MAX(post_id) AS last_post FROM ".POSTS_TABLE." WHERE topic_id = ".$GLOBALS['topic_id'];
if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'Could not get post ID', '', __LINE__, __FILE__, $sql); }
if ($row = $db->sql_fetchrow($result))
{
$first_post = ( $row['first_post'] ) ? $row['first_post'] : 0;
$last_post = ( $row['last_post'] ) ? $row['last_post'] : 0;
}
else
{
$first_post = $last_post = 0;
}
$sql = "UPDATE ".TOPICS_TABLE." SET topic_first_post_id = $first_post, topic_last_post_id = $last_post WHERE topic_id = ".$GLOBALS['topic_id'];
if (!$db->sql_query($sql)) { message_die(GENERAL_ERROR, 'Could not update forum', '', __LINE__, __FILE__, $sql); }
$sql = "SELECT MAX(post_id) AS last_post, COUNT(post_id) AS total FROM ".POSTS_TABLE." WHERE forum_id = ".$GLOBALS['forum_id'];
if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'Could not get post ID', '', __LINE__, __FILE__, $sql); }
if ($row = $db->sql_fetchrow($result))
{
$last_post = ( $row['last_post'] ) ? $row['last_post'] : 0;
$total_posts = ($row['total']) ? $row['total'] : 0;
}
else
{
$last_post = $total_posts = 0;
}
$sql = "SELECT COUNT(topic_id) AS total FROM ".TOPICS_TABLE." WHERE forum_id = ".$GLOBALS['forum_id'];
if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'Could not get topic count', '', __LINE__, __FILE__, $sql); }
$total_topics = ( $row = $db->sql_fetchrow($result) ) ? ( ( $row['total'] ) ? $row['total'] : 0 ) : 0;
$sql = "UPDATE ".FORUMS_TABLE." SET forum_last_post_id = $last_post, forum_posts = $total_posts, forum_topics = $total_topics WHERE forum_id = ".$GLOBALS['forum_id'];
if (!$db->sql_query($sql)) { message_die(GENERAL_ERROR, 'Could not update forum', '', __LINE__, __FILE__, $sql); }
}
if ($send_email_to_admin)
{
include($phpbb_root_path . 'includes/emailer.'.$phpEx);
$emailer = new emailer($board_config['smtp_delivery']);
$emailer->from($board_config['board_email']);
$emailer->replyto($board_config['board_email']);
$emailer->use_template('detector_bot', $board_config['default_lang']);
$emailer->email_address($board_config['board_email']);
$emailer->set_subject('Попытка размещения рекламы');
$emailer->assign_vars(array(
'SITENAME' => $board_config['sitename'],
'EMAIL_SIG' => (!empty($board_config['board_email_sig'])) ? str_replace('<br />', "\n", "-- \n" . $board_config['board_email_sig']) : '',
'IP' => $client_ip,
'POSTS' => $userdata['user_posts'],
'LINKS' => $link_count,
'RESULT' => 'Сообщение удалено, Пользователь удален.',
'USERNAME' => preg_replace($unhtml_specialchars_match, $unhtml_specialchars_replace, substr(str_replace("\'", "'", $userdata['username']), 0, 25)),
'MESSAGE' => preg_replace($unhtml_specialchars_match, $unhtml_specialchars_replace, substr(str_replace("\'", "'", $post_message), 0, 1000)),
'SUB' => preg_replace($unhtml_specialchars_match, $unhtml_specialchars_replace, substr(str_replace("\'", "'", $post_subject), 0, 100))));
$emailer->send();
$emailer->reset();
}
message_die(GENERAL_MESSAGE, 'Зафиксирована попытка размещения рекламного сообщения.<br>Пользователь <b>'.$userdata['username'].'</b> удален. Если Вы считаете, что это - ошибка, внимательно читайте условия регистрации.');
}
elseif (($userdata['user_posts'] < $oldbie_minposts && $link_count > $newbie_max_link) || ($link_count > $oldbie_max_link))
{
// пост оставляем, но юзера штрафуем
if ($use_yellowcard)
{
$sql = "SELECT user_warnings FROM " . USERS_TABLE . " WHERE user_id = ".$userdata['user_id'];
if ($row = $db->sql_fetchrow($db->sql_query($sql)))
{
$sql = "UPDATE " . USERS_TABLE . " SET user_warnings = ".(intval($row['user_warnings'])+1)." WHERE user_id = ".$userdata['user_id'];
if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'SQL Quering error', '', __LINE__, __FILE__, $sql); }
}
else
{
message_die(GENERAL_ERROR, 'SQL Quering error', '', __LINE__, __FILE__, $sql);
}
}
if ($send_email_to_admin)
{
include($phpbb_root_path . 'includes/emailer.'.$phpEx);
$emailer = new emailer($board_config['smtp_delivery']);
$emailer->from($board_config['board_email']);
$emailer->replyto($board_config['board_email']);
$emailer->use_template('detector_bot', $board_config['default_lang']);
$emailer->email_address($board_config['board_email']);
$emailer->set_subject('Попытка размещения рекламы');
$emailer->assign_vars(array(
'SITENAME' => $board_config['sitename'],
'EMAIL_SIG' => (!empty($board_config['board_email_sig'])) ? str_replace('<br />', "\n", "-- \n" . $board_config['board_email_sig']) : '',
'IP' => $client_ip,
'POSTS' => $userdata['user_posts'],
'LINKS' => $link_count,
'RESULT' => 'Сообщение не отправлено'.($use_yellowcard ? ', Пользователь оштрафован: сейчас '.(intval($row['user_warnings'])+1).' из '.$board_config['max_user_bancard']:''),
'USERNAME' => preg_replace($unhtml_specialchars_match, $unhtml_specialchars_replace, substr(str_replace("\'", "'", $userdata['username']), 0, 25)),
'MESSAGE' => preg_replace($unhtml_specialchars_match, $unhtml_specialchars_replace, substr(str_replace("\'", "'", $post_message), 0, 1000)),
'SUB' => preg_replace($unhtml_specialchars_match, $unhtml_specialchars_replace, substr(str_replace("\'", "'", $post_subject), 0, 100))));
$emailer->send();
$emailer->reset();
}
message_die(GENERAL_MESSAGE, 'Зафиксирована попытка размещения рекламного сообщения.<br>Сообщение не отправлено'.($use_yellowcard ? ', пользователь <b>'.$userdata['username'].'</b> оштрафован.':'.').' Если Вы считаете, что это - ошибка, внимательно читайте условия регистрации.');
}
/* ---8<--------[Detector Bots]----------------------------------------- */
# CREATE FILE
language\lang_russian\email\detector_bot.tpl
# WITH THIS TEXT
Subject: Попытка размещения рекламы на {SITENAME}
Charset: windows-1251
На {SITENAME} была зафиксирована попытка размещения рекламы со следующими регистрационными данными:
IP: {IP}
Username: {USERNAME}
Total posts before: {POSTS}
Тема: {SUB}
Total links: {LINKS}
Message:
- - -8<- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{MESSAGE}
- - -8<- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Result: {RESULT}
{EMAIL_SIG}
# SAVE / CLOSE ALL FILES
/* ---8<-----[ BEG раскомментируйте эту часть, если хотите находить ссылки любого вида]----------- */
preg_match_all("#(^|[\n ])([\w]+?://[^ \"\n\r\t<]*)#is", $message, $links);
if (isset($links[1])) {$link_count += count($links[1]); }
preg_match_all("#(^|[\n ])((www|ftp)\.[^ \"\t\n\r<]*)#is", $message, $links);
if (isset($links[1])) {$link_count += count($links[1]); }
/* ---8<-----[ END раскомментируйте эту часть, если хотите находить ссылки любого вида]----------- */
HAVING topic_id = AND poster_id <> 30 
Поручик писал(а):Кстати о птичках. Бродяга, а как бы этот мод оформить по правилам оформления модов и программирования phpBB.
Вернуться в Бета-версии модов для phpBB 2.0.x
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0