Автобан если выдано 3Ж. Логика такая. После манипуляций с предупреждениями, запускается проверка. Если последняя карточка Ж, считает кол-во Ж если 3 и более, выдает К = последней Ж. Затем перебирает все К, находит максимальный срок и банит юзера на этот срок. В конце просто очищает баны, у которых нет активных предупреждений. Но есть особенности работы. Выдали 3Ж, получили 1К. Выдали следом еще 1Ж, выдаст еще 1К, в общем можно пинать лежачего Удалили последнюю К, проверит все Ж и выдаст опять если надо К Ах да, если сразу выдали К, то тоже бан, по максимальной К.
Только бессрочные пока игнорирует... Склоняюсь к запрету бессрочных Кого надо навечно в бан, есть админка, Ж бессрочные вообще бред.
/includes/mcp/mcp_warn.php
- Код: Выделить всё
function add_warning($user_row, $warning, $send_pm = true, $post_id = 0, $warning_days = '', $warning_type = 'warning') {
...
if (!is_numeric($warning_days))
{
$warning_days = $config['warnings_expire_days'];
}
// dr.death
// no endless
if($warning_days <= 0) {
$warning_days = 7;
}
...
}
function edit_warning($warning_row, $warning, $warning_days, $warning_type) {
...
if (!is_numeric($warning_days))
{
$warning_days = $config['warnings_expire_days'];
}
// dr.death
// no endless
if($warning_days <= 0) {
$warning_days = 7;
}
...
}
- Код: Выделить всё
function warn_autoban($user_id) {
global $db, $phpbb_root_path, $phpEx, $cache;
$cache->destroy('sql', WARNINGS_TABLE);
$sql = 'SELECT *
FROM ' . USERS_TABLE . '
WHERE user_id = ' . (int)$user_id . '
LIMIT 1';
$result = $db->sql_query($sql);
$user_row = $db->sql_fetchrow($result);
if(!$user_row) return false;
// add red if last yellow and yellows >= 3
$sql = 'SELECT *
FROM ' . WARNINGS_TABLE . '
WHERE user_id = ' . $user_row['user_id'] . '
AND warning_active = 1
AND warning_type IN ("ban", "warning")
AND warning_days > 0
ORDER BY warning_id DESC';
$result = $db->sql_query($sql);
$warnings = $db->sql_fetchrowset($result);
if(count($warnings)) {
$last_warning_row = $warnings[0];
if($last_warning_row['warning_type'] == 'warning') {
$yellow_total = 0;
foreach($warnings as $warning_row) {
if($warning_row['warning_type'] == 'warning') {
$yellow_total++;
if($yellow_total >= 3) {
require_once("{$phpbb_root_path}includes/mcp/mcp_warn.$phpEx");
add_warning($user_row, 'Автоматический бан за 3 и более предупреждения', false, $last_warning_row['post_id'], $last_warning_row['warning_days'], 'ban');
break;
}
}
}
}
}
// add user ban by max red
$sql = 'SELECT *
FROM ' . WARNINGS_TABLE . '
WHERE user_id = ' . $user_row['user_id'] . '
AND warning_active = 1
AND warning_type = "ban"
AND warning_days > 0
ORDER BY warning_id DESC';
$result = $db->sql_query($sql);
$warnings = $db->sql_fetchrowset($result);
if(count($warnings)) {
$red_max = array(
'warning_time' => 0,
'warning_days' => 0,
);
foreach($warnings as $warning_row) {
if($warning_row['warning_type'] == 'ban') {
if($red_max['warning_time'] + $red_max['warning_days'] * 86400 < $warning_row['warning_time'] + $warning_row['warning_days'] * 86400) {
$red_max = $warning_row;
}
}
}
if($red_max['warning_time'] + $red_max['warning_days'] * 86400 > time()) {
require_once("{$phpbb_root_path}includes/functions_user.$phpEx");
$ban_len = ceil(($red_max['warning_time'] + $red_max['warning_days'] * 86400 - time()) / 60);
if($ban_len > 0) user_ban('user', $user_row['username'], $ban_len, '', 0, $red_max['warning_text'], $red_max['warning_text'], $red_max['warning_id']);
}
}
// delete bans without warnings
$sql = 'DELETE FROM ' . BANLIST_TABLE . '
WHERE ban_userid = ' . $user_row['user_id'] . '
AND ban_warning_id != 0
AND ban_warning_id NOT IN (
SELECT warning_id
FROM ' . WARNINGS_TABLE . '
WHERE warning_type = "ban"
AND user_id = ' . $user_row['user_id'] . '
)';
$db->sql_query($sql);
}
/includes/acp/acp_users.php
- Код: Выделить всё
function main($id, $mode) {
...
$sql = 'UPDATE ' . USERS_TABLE . "
SET user_warnings = $deleted_warnings
WHERE user_id = $user_id";
$db->sql_query($sql);
// dr.death
// warning autoban
warn_autoban($user_id);
...
}
/includes/mcp/mcp_warn.php
- Код: Выделить всё
function add_warning($user_row, $warning, $send_pm = true, $post_id = 0, $warning_days = '', $warning_type = 'warning') {
...
// dr.death
// warning autoban
warn_autoban($user_row['user_id']);
}
function edit_warning($warning_row, $warning, $warning_days, $warning_type) {
...
// dr.death
// warning autoban
warn_autoban($warning_row['user_id']);
return true;
}
function delete_warning($warning_row) {
...
// dr.death
// warning autoban
warn_autoban($warning_row['user_id']);
return true;
}
/includes/functions_admin.php
- Код: Выделить всё
function tidy_warnings() {
...
foreach ($user_list as $user_id => $value)
{
$sql = 'UPDATE ' . USERS_TABLE . " SET user_warnings = user_warnings - $value
WHERE user_id = $user_id";
$db->sql_query($sql);
}
$db->sql_transaction('commit');
// dr.death
// warning autoban
foreach($user_list as $user_id => $value) {
warn_autoban($user_id);
}
}
...
}
/includes/functions_user.php
- Код: Выделить всё
// dr.death
// warning autoban
//function user_ban($mode, $ban, $ban_len, $ban_len_other, $ban_exclude, $ban_reason, $ban_give_reason = '') {
function user_ban($mode, $ban, $ban_len, $ban_len_other, $ban_exclude, $ban_reason, $ban_give_reason = '', $warning_id = 0) {
...
if (sizeof($banlist_ary_tmp))
{
// One or more entities are already banned/excluded, delete the existing bans, so they can be re-inserted with the given new length
/*
$sql = 'DELETE FROM ' . BANLIST_TABLE . '
WHERE ' . $db->sql_in_set($type, $banlist_ary_tmp) . '
AND ban_exclude = ' . (int) $ban_exclude;
*/
// dr.death
// warning autoban
$sql_where = '';
if($mode == 'user') $sql_where .= (int)$warning_id ? " AND ban_warning_id != 0 " : " AND ban_warning_id = 0 ";
$sql = 'DELETE FROM ' . BANLIST_TABLE . '
WHERE ' . $db->sql_in_set($type, $banlist_ary_tmp) . '
' . $sql_where . '
AND ban_exclude = ' . (int) $ban_exclude;
$db->sql_query($sql);
}
...
$sql_ary[] = array(
$type => $ban_entry,
'ban_start' => (int) $current_time,
'ban_end' => (int) $ban_end,
'ban_exclude' => (int) $ban_exclude,
'ban_reason' => (string) $ban_reason,
'ban_give_reason' => (string) $ban_give_reason,
// dr.death
// warning autoban
'ban_warning_id' => ($mode == 'user') ? (int) $warning_id : 0,
);
...
}
Добавить int поле ban_warning_id в таблицу phpbb_banlist
- Код: Выделить всё
ALTER TABLE `phpbb_banlist` ADD COLUMN `ban_warning_id` MEDIUMINT(8) UNSIGNED DEFAULT 0 NOT NULL AFTER `ban_give_reason`;