Запреты и предупреждения

Запреты и предупреждения 1.3.1

Нет прав для скачивания
Совместимость
не проверялся на совместимость
Изменения в БД
требуются
Автор
_Xz_
Общественное достояние
да
Описание: добавляет систему наказаний пользователей на основе стандартной системы, встроенной в движок.
Инструкция по установке
PHP:
<?
-- functions.php
- в самый конец

function warning($type, $data = array())
{
    global $lang, $bb_cfg, $userdata;

    if(!isset($userdata['user_warnings'])) $userdata = $data;

    if(!empty($userdata['user_warnings']) && $bb_cfg['warning']['enabled'])
    {
        $warning = DB()->fetch_row("SELECT w.*, u.username, u.user_rank, u.user_level
            FROM ". BB_WARNINGS ." w, ". BB_USERS ." u
            WHERE w.user_id = ". $userdata['user_id'] ."
                AND u.user_id = w.poster_id
                AND w.warning = $type
                AND w.auth IN(1,3)
            ORDER BY w.id DESC");
        if ($warning)
        {
            if ($warning['time_end'] > TIMENOW || $warning['auth'] == 3)
            {
                if ($warning['user_level'] == ADMIN)
                {
                    $level = 'Администратор ';
                }
                elseif($warning['user_level'] == MOD)
                {
                    $level = 'Модератор ';
                }

                $time = ($warning['auth'] == 3) ? $bb_cfg['warning']['auth'][3] : delta_time($warning['time_end']);

                if (defined('IN_AJAX'))
                {
                    $warn_text = 'Вам запрещено '. $bb_cfg['warning']['type'][$warning['warning']];
                    $warn_text .= "\nДо окончания блокировки осталось - $time";
                }
                else
                {
                    $warn_text = $level . profile_url(array('username' => $warning['username'], 'user_id' => $warning['poster_id'], 'user_rank' => $warning['user_rank']));
                    $warn_text .= ' запретил вам '. $bb_cfg['warning']['type'][$warning['warning']].', подробнее <a class="gen" href="warnings.php?warnings&u='. $warning['user_id'] .'">тут</a><br />';
                    $warn_text .= '<b>по причине</b>: '. $warning['reason'] .'<br />';
                    $warn_text .= 'До окончания блокировки осталось - <b>'. $time .'</b>.';
                }

                return isset($userdata['bb_exit']) ? bb_exit($warn_text) : bb_die($warn_text);
            }
            else
            {
                DB()->query("UPDATE ". BB_WARNINGS ." SET auth = 0 WHERE id = ". $warning['id']);
                DB()->query("UPDATE ". BB_USERS ." u SET u.user_warnings = (SELECT COUNT(w.id) FROM ". BB_WARNINGS ." w WHERE w.user_id = ". $userdata['user_id'] ." AND w.auth IN(1,3) OR w.time_end > ". TIMENOW .") WHERE u.user_id = ". $userdata['user_id']);
                cache_rm_user_sessions ($userdata['user_id']);
            }
        }
    }
}

-- ajax.php
- найти
        'mod_action'        => array('mod'),
- после добавить
        'warning'           => array('mod'),
- найти
    function mod_action()
    {
        require(AJAX_DIR .'mod_action.php');
    }
- после добавить
    function warning()
    {
        require(AJAX_DIR .'warning.php');
    }

-- закинуть файл warning.php в папку ajax

-- сделать запросы
- SQL
CREATE TABLE IF NOT EXISTS `bb_warnings` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `type` varchar(100) NOT NULL,
  `type_id` int(11) NOT NULL default '0',
  `user_id` int(11) NOT NULL default '0',
  `poster_id` int(11) NOT NULL default '0',
  `warning` int(3) NOT NULL default '0',
  `time_start` int(11) NOT NULL default '0',
  `time_end` int(11) NOT NULL default '0',
  `term` int(11) default NULL,
  `reason` text,
  `auth` int(1) NOT NULL default '1',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;
ALTER TABLE `bb_users` ADD `user_warnings` TINYINT( 3 ) NOT NULL DEFAULT '0' ;

-- config.php
- в самый конец
$bb_cfg['warning'] = array(
    'enabled' => true,
    'time'   => array(
        60    => 'минут',
        3600   => 'часов',
        86400   => 'дней',
        2592000  => 'месяцев',
        -1        => 'бессрочный', //НЕ трогать!
    ),
    'time_select' => 86400,
    'type'   => array(
        0    => 'Выберите тип запрета:',
        1    => 'оставлять сообщения',
        2    => 'редактировать сообщения',
        3    => 'удалять сообщения',
        4    => 'создавать темы',
        5    => 'загружать изображения на хостинг',
        6    => 'доступ к репутации',
        7    => 'скачивать торренты',
        //id => описание,
        -1   => 'забанить', //НЕ трогать!
    ),
    'auth'   => array( //НЕ трогать!
        0    => 'истёк',
        1    => 'активен',
        2    => 'отменён',
        3    => 'бессрочный',
        -1   => 'удалить',
    ),
);


-- page_header.php
- найти
    'U_WATCHED_TOPICS'      => "profile.php?mode=watch",
));
- заменить на
    'U_WATCHED_TOPICS'      => "profile.php?mode=watch",
    'WARNINGS_ON'            => ($bb_cfg['warning']['enabled'] && IS_AM)
));

if($bb_cfg['warning']['enabled'] && IS_AM)
{
    $warning_type = array();
    foreach ($bb_cfg['warning']['type'] as $type => $key)
    {
        $warning_type[$key] = $type;
    }
    $warning_time = array();
    foreach ($bb_cfg['warning']['time'] as $time => $key)
    {
        $warning_time[$key] = $time;
    }

    $template->assign_vars(array(
        'WARNING_ID'   => $userdata['user_id'],
        'WARNING_TYPE' => build_select('warnings-type', $warning_type, 0, null, null),
        'WARNING_TIME' => build_select('warnings-time', $warning_time, $bb_cfg['warning']['time_select'], null, null),
    ));
}

-- viewtopic.tpl
- найти
                <!-- IF AUTH_MOD -->
                    <a class="menu-root menu-alt1 txtb" href="#mc_{postrow.POST_ID}">{MC_IMG}</a>{POST_BTN_SPACER}
                    <!-- IF not IN_MODERATION --><a class="txtb" href="{PAGE_URL}&amp;mod=1&amp;start={PAGE_START}#{postrow.POST_ID}">{MOD_POST_IMG}</a>{POST_BTN_SPACER}<!-- ENDIF -->
                <!-- ENDIF -->
            </p>
            <div class="clear"></div>
- заменить на
                <!-- IF AUTH_MOD -->
                    <a class="menu-root menu-alt1 txtb" href="#mc_{postrow.POST_ID}">{MC_IMG}</a>{POST_BTN_SPACER}
                    <!-- IF not IN_MODERATION --><a class="txtb" href="{PAGE_URL}&amp;mod=1&amp;start={PAGE_START}#{postrow.POST_ID}">{MOD_POST_IMG}</a>{POST_BTN_SPACER}<!-- ENDIF -->
                    <!-- IF WARNINGS_ON --><a class="menu-root menu-alt1" href="#warning-{postrow.POST_ID}"><img src="./styles/templates/default/images/img_alert.gif" title="Выдать предупреждение"></a><!-- ENDIF -->
                <!-- ENDIF -->
            </p>
            <div class="clear"></div>
            <!-- IF WARNINGS_ON -->
            <div class="menu-sub" id="warning-{postrow.POST_ID}">
            <table class="nowrap" cellspacing="1" cellpadding="4">
            <tr>
                <th>Выдать запрет</th>
            </tr>
            <tr>
                <td title="Тип блокировки" id="type-{postrow.POST_ID}">{WARNING_TYPE}</td>
            </tr>
            <tr>
                <td title="Причина блокировки" class="row2 tCenter genmed">
                    <textarea id="reason-{postrow.POST_ID}" name="reason-{postrow.POST_ID}" rows="5" cols="30"></textarea>
            </td>
            </tr>
            <tr>
                <td class="cat tCenter pad_4">
                    <input title="Время блокировки" id="term-{postrow.POST_ID}" type="text" maxlength="2" size="2" name="time"><span id="time-{postrow.POST_ID}">{WARNING_TIME}</span>
                    <input onclick="warning({postrow.POSTER_ID}, {postrow.POST_ID}); return false;" type="button" value="Выдать">
                </td>
            </tr>
            </table>
            </div>
            <!-- ENDIF -->
- найти
<!-- END postrow -->
- после добавить
<!-- IF AUTH_MOD && WARNINGS_ON -->
<script type="text/javascript">
function warning(user_id, post_id) {
    var type = $('#type-'+ post_id +' option:selected').val();
    var term = $('#term-'+ post_id).val();
    var time = $('#time-'+ post_id +' option:selected').val();
    var reason = $('#reason-'+ post_id).val();
    if(user_id == {WARNING_ID} && type && term && reason)
    {
        if(!confirm('Вы уверены, что хотите выдать себе запрет?')) return false;
    }
    ajax.warning(user_id, post_id, type, term, time, reason);
}
ajax.warning = function(user_id, post_id, type, term, time, reason) {
    ajax.exec({
        action  : 'warning',
        mode    : 'add',
        user_id : user_id,
        warning : type,
        type    : 'topic',
        type_id : post_id,
        term    : term,
        time    : time,
        reason  : reason
    });
};
ajax.callback.warning = function(data) {
    if(data.info) alert(data.info);
    if(data.url) document.location.href = data.url;
};
</script>
<!-- ENDIF -->

-- init_bb.php
- найти
define('BB_WORDS',                'bb_words');
- после добавить
define('BB_WARNINGS',             'bb_warnings');

-- крон задача
if($bb_cfg['warning']['enabled'])
{
    DB()->query("UPDATE ". BB_WARNINGS ." SET auth = 0 WHERE auth != 3 AND time_end < ". TIMENOW);

    DB()->query("UPDATE ". BB_USERS ." u SET u.user_warnings = (SELECT COUNT(w.id) FROM ". BB_WARNINGS ." w WHERE u.user_id = w.user_id AND w.auth IN(1,3))");
}

-- session.php
- найти
            if (DB()->fetch_row($sql))
            {
                header('Location: https://torrentpier.com/banned/');
            }

- заменить на
            if (DB()->fetch_row($sql))
            {
                $this->set_session_cookies(GUEST_UID);
                bb_exit('Вы забанены');
            }
            $this->data['bb_exit'] = true;
            warning(DELETED, $this->data);
            if(!empty($this->data['user_warnings']))
            {
                if($this->data['user_warnings'] >= 3) bb_exit('Вы забанены'); //Общее число активных запретов
            }

-- usercp_viewprofile.tpl
- найти
                        <fieldset class="mrg_6">
                            <legend>{L_BAN_USER}</legend>
                            <div class="tLeft" style="padding: 2px 6px 6px; display: block;" id="user-opt">
                                <label><input type="checkbox" name="dis_avatar"/>{L_HIDE_AVATARS}</label>
                                <label><input type="checkbox" name="dis_sig"/>{L_SHOW_CAPTION}</label>
                                <label><input type="checkbox" name="dis_passkey"/>{L_DOWNLOAD_TORRENT}</label>
                                <label><input type="checkbox" name="dis_pm"/>{L_SEND_PM}</label>
                                <label><input type="checkbox" name="dis_post"/>{L_SEND_MESSAGE}</label>
                                <label><input type="checkbox" name="dis_post_edit"/>{L_EDIT_POST}</label>
                                <label><input type="checkbox" name="dis_topic"/>{L_NEW_THREADS}</label>
                            </div>
                        </fieldset>
- ниже добавить
                        <!-- IF WARNINGS_ON -->
                        <script type="text/javascript">
                        ajax.warning = function(user_id, type, term, time, reason) {
                            ajax.exec({
                                action  : 'warning',
                                mode    : 'add',
                                user_id : user_id,
                                warning : type,
                                term    : term,
                                time    : time,
                                reason  : reason
                            });
                        };
                        ajax.callback.warning = function(data) {
                            if(data.info) alert(data.info);
                            if(data.url) document.location.href = data.url;
                        };
                        </script>

                        <fieldset class="mrg_6 tCenter"><legend>Выдать запрет</legend>
                        <div title="Тип блокировки" id="type">{WARNING_TYPE}</div>
                        <div title="Причина блокировки" class="pad_4 genmed">
                                <textarea id="reason" name="reason" rows="5" cols="30"></textarea>
                        </div>
                        <div class="cat tCenter pad_4">
                                <input title="Время блокировки" id="term" type="text" maxlength="2" size="2" name="time"><span id="time">{WARNING_TIME}</span>
                                <input onclick="ajax.warning({PROFILE_USER_ID}, $('#type option:selected').val(), $('#term').val(), $('#time option:selected').val(), $('#reason').val(), $('#auth option:selected').val() ); return false;" type="button" value="Выдать">
                        </div>
                        </fieldset>
                        <!-- ENDIF -->

!!! если уже были использованы стадартные ограничения то сделать запрос UPDATE bb_users SET user_opt = 0;

заперты работают так:
1. Выбираем тип запрета, к примеру:
    тип     описание
    5    => 'загружать изображения на хостинг',
    дальше будем использовать только номер, в данном примере 5

2. Добавляем данную функцию warning(5); где 5 - тип указанный выше (:
    раз тип - запрет на загрузку изображений то добавялем её в тот файл где он нужен, то-есть в gallery.php
    пример добавляени:
        // Start session management
        $user->session_start(array('req_login' => true));
        warning(5);
    ОБЯЗАТЕЛЬНО!!! код нужно добавлять после создания сессия юзера, то-есть $user->session_start();

3. Добавление новых запертов, тут всё просто
    'type'   => array(
        7    => 'скачивать торренты',
    новый ид => описание
        ИД типа не должен повторяться!
        также для новых временных мерок, (число у времени - в секундах!)
    ВНИМАНИЕ если написано //НЕ трогать! то лучше ничего не менять xD


Для примера куски кода исправленного posting.php

// What auth type do we need to check?
$is_auth = array();
switch ($mode)
{
    case 'newtopic':
        if(bf($userdata['user_opt'], 'user_opt', 'dis_topic'))
        {
            bb_die($lang['RULES_POST_CANNOT']);
        }
        warning(4);
        if ($topic_type == POST_ANNOUNCE)
        {
            $is_auth_type = 'auth_announce';
        }
        else if ($topic_type == POST_STICKY)
        {
            $is_auth_type = 'auth_sticky';
        }
        else
        {
            $is_auth_type = 'auth_post';
        }
        break;
    case 'reply':
    case 'quote':
        if(bf($userdata['user_opt'], 'user_opt', 'dis_post'))
        {
            bb_die($lang['RULES_REPLY_CANNOT']);
        }
        warning(1);
        $is_auth_type = 'auth_reply';
        break;
    case 'editpost':
        if(bf($userdata['user_opt'], 'user_opt', 'dis_post_edit'))
        {
            bb_die($lang['RULES_EDIT_CANNOT']);
        }
        warning(2);
        $is_auth_type = 'auth_edit';
        break;
    case 'delete':
    case 'poll_delete':
        warning(3);
        $is_auth_type = 'auth_delete';
        break;
    case 'vote':
        $is_auth_type = 'auth_vote';
        break;
    default:
        bb_simple_die($lang['NO_POST_MODE']);
        break;
}

заменить в functions_torrent.php

function send_torrent_with_passkey ($filename)
{
    global $attachment, $auth_pages, $userdata, $bb_cfg, $lang;

    warning(7);
Автор
Exile
Скачивания
102
Первый выпуск
Обновление
Оценка
4.33 звёзд 3 оценок

Другие ресурсы пользователя Exile

Последние обновления

  1. Обновление 1.3.1

    Исправление ошибок файла установки
  2. Обновление 1.3.0

    Адаптированная версия, спасибо @Virtuoz
  3. Обновление 1.2.0

    Версия с адаптацией, спасибо @Virtuoz
  4. Обновление 1.1.0

    Обновлено описание ресурса Версии с промежуточными адаптациями ищите в обсуждении