3 желтые = 1 красная + бан

Список разделов phpBBex 1.x (поддерживается) Мастерская 1.x

Описание: Только готовые решения! Статьи, заметки, моды и другие полезности для phpBBex 1.x и phpBB 3.0.x.
Модератор: Поддержка

Сообщение #1 Dr.Death » 10.11.2014, 09:49

Перенесу в эту тему, чтоб можно было обсудить.

Автобан если выдано 3Ж. Логика такая. После манипуляций с предупреждениями, запускается проверка. Если последняя карточка Ж, считает кол-во Ж если 3 и более, выдает К = последней Ж. Затем перебирает все К, находит максимальный срок и банит юзера на этот срок. В конце просто очищает баны, у которых нет активных предупреждений. Но есть особенности работы. Выдали 3Ж, получили 1К. Выдали следом еще 1Ж, выдаст еще 1К, в общем можно пинать лежачего :smile: Удалили последнюю К, проверит все Ж и выдаст опять если надо К :smile: Ах да, если сразу выдали К, то тоже бан, по максимальной К.

Только бессрочные пока игнорирует... Склоняюсь к запрету бессрочных :smile: Кого надо навечно в бан, есть админка, Ж бессрочные вообще бред.

/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`;
Dr.Death M
Автор темы
Аватара
Репутация: 69
С нами: 10 лет 5 месяцев

Сообщение #2 vbnm » 11.11.2014, 08:15

Dr.Death:Автобан если выдано 3Ж
да, это требо
vbnm
Репутация: 108
С нами: 11 лет 8 месяцев

Сообщение #3 rbooze » 11.11.2014, 09:58

Вам надо как-то с суманаем скооперироваться, чтобы в новый бибиекс прошить. А логику банов было бы хорошо настраивать из админки. Чтобы админ мог не меняя код выставить сколько жёлтых меняется на красную, и на сколько по длительности. Также хотелось бы видеть прогрессивную систему банов. Первый раз на неделю, второй на месяц, третий на год, например :razz: Чтобы это тоже из админки настраивалось. Слишком много хочу наверное? :biggrin: Но даже на небольшом форуме это очень востребованная функция :cyclop:
rbooze
Аватара
Репутация: 95
С нами: 11 лет 3 месяца

Сообщение #4 Dr.Death » 11.11.2014, 10:08

rbooze:Вам надо как-то с суманаем скооперироваться, чтобы в новый бибиекс прошить.
Новый будут прошивать, после переноса 1.8.1.

Все остальное меня и в таком виде пока устраивает, остальным повод подумать :toothless:
Dr.Death M
Автор темы
Аватара
Репутация: 69
С нами: 10 лет 5 месяцев

Сообщение #5 myoptions » 11.11.2014, 13:15

rbooze, за предложение - только +...
myoptions M
Аватара
Откуда: Гродно
Репутация: 18
С нами: 10 лет 3 месяца

Сообщение #6 Lukash » 10.12.2014, 23:43

Как по мне, то существующая система вполне себя оправдывает.
Имхо лучше бы разнообразие карточек было введено, не 2 вида - а до 5, что бы можно было нарушения по степени вины градуировать.
Lukash
Аватара
Репутация: 3
С нами: 9 лет 11 месяцев

Сообщение #7 dipol » 03.09.2015, 20:13

Так какая система банов в phpbbex 1.9.1 ? считаю 3ж=1к в принципе неплохо.

и еще что заметил - если админ/модер выдал юзеру Ж, а потом этот пост был удален, то ссылка (на пиктограмме карточки) ведет в никуда и выскакивает страничка "запрошенной темы не существует". Вопрос - можно как то очищать время от времени такие пустышки? sql запрос к бд или замутить в виде опции в админке?
dipol M
Аватара
Репутация: 21
С нами: 10 лет

Сообщение #8 Sumanai » 03.09.2015, 20:15

dipol:Так какая система банов в phpbbex 1.9.1 ?
Автоматических банов нет.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 10 месяцев

Сообщение #9 dipol » 04.09.2015, 10:23

Чот я почита про систему прав. Создал группу "забаненные". Завел пользователя добавил его в эту группу.

Локальные права группы ЗАБАНЕНЫЕ для раделов установил - "только для чтения".
Самому пользователю назначил данную группу ЗАБАНЕНЫЕ по умолчанию. НО...

Пользователь по прежнему может например писать посты.

Получается пользователь состоит в 2х группах - Зарегистрированные и Забаненные с разными правами. Забаненные - по дефолту, но видимо все это игнорируется и приоритет у Зарегистрированных выше (тк это предустановленная группа).

Т.о. когда я пользователя именно УДАЛЯБЮ из группы Зарегистрированные и он остается только в группе Забаненные - вот тогда он действительно ограничен заданными правами для группы Забаненные (например только чтение).

Это так и должно быть или я с правами не разобрался? А то просто не хотелось бы лишних телодвижений по включению/исключению пользователя в/из группы ЗАРЕГИСТРИРОВАННЫЕ каждый раз при назначении/снятии бана. Просто например назначать группу используемую по умолчанию.

Заранее спасибо.
dipol M
Аватара
Репутация: 21
С нами: 10 лет

Сообщение #10 Sumanai » 04.09.2015, 15:29

dipol:или я с правами не разобрался?
Конечно. Для ограничений есть опция "Никогда". Сбросьте права группы "Заблокированные" в нет и установите в "Никогда" опции, относящиеся к написанию сообщений.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 10 месяцев

Сообщение #11 dipol » 06.09.2015, 13:28

Sumanai,

Т.е. если я вас правильно понял, например мне необходимо что бы пользователи в ЗАБАНЕНЫХ не могли отвечать ы темах вы говорите что надо опцию
"Может отвечать в темах" установить из НЕТ в положение НИКОГДА и тогда все должно будет быть как бы чики-поки.

Изображение

У меня для этой группы ЗАБАНЕНЫЕ доступ к разделам установлена роль "Доступ только для чтения".
Я правильно вас понял?

Спасибо.

Добавлено спустя 13 минут 17 секунд:
А.. вот... вроде норм стало:

Админка:

ПРАВА ДОСТУПА-РОЛИ: Локальные роли - Доступ только для чтения там в настройках переключил "Может отвечать в темах" с НЕТ -> НИКОГДА.


Изображение

Я в парвильном направлении пришел? :smoke:

Установил примерно так:
Изображение
и на остальных вкладках установил в НИКОГДА опции которые хотел запретить для роли "Доступ только для чтения"

Если я правильно понял то переключатель в положении НЕТ означает что для данной опции действие ее не определено или надо смотреть на ее значение по умолчанию (или где то в каком то месте которое имее более высокий приоритет - ну там искать где в глобальных правах или типа того). - Я правильно мыслю ? Или снова запутался? )))
dipol M
Аватара
Репутация: 21
С нами: 10 лет

Сообщение #12 Sumanai » 06.09.2015, 16:03

dipol:Т.е. если я вас правильно понял, например мне необходимо что бы пользователи в ЗАБАНЕНЫХ не могли отвечать ы темах вы говорите что надо опцию
"Может отвечать в темах" установить из НЕТ в положение НИКОГДА и тогда все должно будет быть как бы чики-поки.
Да.
dipol:У меня для этой группы ЗАБАНЕНЫЕ доступ к разделам установлена роль "Доступ только для чтения".
Я правильно вас понял?
Можете создать роль "Заблокированные", для упрощения установки прав.
dipol:Если я правильно понял то переключатель в положении НЕТ означает что для данной опции действие ее не определено или надо смотреть на ее значение по умолчанию (или где то в каком то месте которое имее более высокий приоритет - ну там искать где в глобальных правах или типа того). - Я правильно мыслю ? Или снова запутался? )))
Да, всё верно. По умолчанию стоит"Нет", и если нигде не определяются другие, то в итоге доступа не будет. Если везде "Нет", кроме одного или нескольких "Да", то в итоге будет "Да". Если хоть где- то есть "Никогда", то в итоге будет "Никогда".

Добавлено спустя 57 секунд:
Поэтому "Никогда" нужно использовать только для ограничения доступа, и чем меньше, тем лучше, так как действие "Никогда" ничем не перебить.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 10 месяцев

Сообщение #13 dipol » 10.09.2015, 01:20

Sumanai,
Все таки я чот еще туплю. Буду посмотреь... /это офтопом по забаненым/

По теме. Эта система предупреждений на ручном управлении или как? Ради проверки поставил себе 1Ж на 3 суток. вот они прошли, а у меня все светится 1Ж к. Это я так должен сам список наказанных вести кто что и на сколько а потом ручками снимать?

4е сутки пошли, а воз и ныне там:

Изображение
dipol M
Аватара
Репутация: 21
С нами: 10 лет

Сообщение #14 dipol » 10.09.2015, 10:24

Странно. Теперь все норм. Автоматом снялась желтая карта....Ничего не делал.
dipol M
Аватара
Репутация: 21
С нами: 10 лет


Вернуться в Мастерская 1.x