Закладки Новая версия CS-BANS ( фикс бага ) Версия 1.3.3

Спасибо:
  • 0
Автор:
Просмотров:
273
Обсуждений:
0
Добалено:
15.11.2021

                           

                               

Вышела новая версия системы банов CS-Bans с фиксом бага при просмотре банов

Нужно замений файл /protected/controllers/BansController.php


<?php
/**
 * Контррллер банов
 */

/**
 * @author Craft-Soft Team
 * @package CS:Bans
 * @version 1.0 beta
 * @copyright (C)2013 Craft-Soft.ru.  Все права защищены.
 * @link http://craft-soft.ru/
 * @license http://creativecommons.org/licenses/by-nc-sa/4.0/deed.ru  «Attribution-NonCommercial-ShareAlike»
 */
class BansController extends Controller
{
    public $layout='//layouts/column1';

    public function filters()
    {
        return array(
            'accessControl',
            'postOnly + delete',
            'ajaxOnly + bandetail, unban'
        );
    }

    public function actions(){
        return array(
            'captcha'=>array(
                'class'=>'CCaptchaAction',
            ),
        );
    }

    public function actionUnban($id)
    {
        $model = $this->loadModel($id);

        // Проверка прав
        if (!Webadmins::checkAccess('bans_unban', $model->admin_nick)) {
            throw new CHttpException(403, "У Вас недостаточно прав");
        }

        $model->ban_length = '-1';
        $model->expired = 1;

        if ($model->save(FALSE)) {
            Yii::app()->end('Игрок разбанен');
        }

        Yii::app ()->end(CHtml::errorSummary($model));
    }

    /**
     * Вывод инфы о бане
     * @param integer $id ID бана
     */
    public function actionView($id)
    {
        // Подгружаем комментарии и файлы
        $files = new Files;
        //$this->performAjaxValidation($files);
        $files->unsetAttributes();
        $comments = new Comments;
        $comments->unsetAttributes();

        // Подгружаем баны
        $model=Bans::model()->with('admin')->findByPk($id);
        if ($model === null) {
            throw new CHttpException(404, 'The requested page does not exist.');
        }
        $geo = false;
        // Проверка прав на просмотр IP
        $ipaccess = Webadmins::checkAccess('ip_view');
        if($ipaccess) {
            $cacheKey = "PLAYER_IP_{$model->player_ip}_";
            $geo = Yii::app()->cache->get($cacheKey);
            if (!$geo) {
                $geo = array(
                    'city' => 'Н/А',
                    'region' => 'Не определен',
                    'country' => 'Не определен',
                    'lat' => 0,
                    'lng' => 0,
                );

                // Контекст с таймаутом на 3 секунды, чтобы страница не зависала наглухо
                $context = stream_context_create(array(
                    'http' =>
                        array(
                            'timeout' => 3,
                        )
                ));

                $get = @file_get_contents("http://ip-api.com/json/$model->player_ip?lang=ru&fields=status,message,country,regionName,city,district,lat,lon,query",
                    false, $context);
                if($get) {
                    $json = json_decode($get, true);
                    if (json_last_error() === JSON_ERROR_NONE) {
                        $geo = array(
                            'city' => $json['city'],
                            'region' => $json['regionName'],
                            'country' => $json['country'],
                            'lat' => $json['lat'],
                            'lng' => $json['lon'],
                        );
                    }
                }
                Yii::app()->cache->set($cacheKey, $geo, 86400);
            }
        }

        // Добавление файла
        if(isset($_POST['Files']) && !empty($_POST['Files']['name'])) {
            // Задаем аттрибуты
            $files->attributes = $_POST['Files'];
            $files->bid = intval($id);
            $files->save();
            $this->refresh();
        }

        // Добавление комментария
        if(isset($_POST['Comments'])) {
            //exit(print_r($_POST['Comments']));
            $comments->attributes = $_POST['Comments'];
            $comments->bid = $id;
            if ($comments->save()) {
                $this->refresh();
            }
        }

        // Выборка комментариев
        $c = new CActiveDataProvider($comments, array(
            'criteria' => array(
                'condition' => 'bid = :bid',
                'params' => array(
                    ':bid' => $id
                ),
            ),
        ));

        // Выборка файлов
        $f = new CActiveDataProvider(Files::model(), array(
            'criteria' => array(
                'condition' => 'bid = :bid',
                'params' => array(
                    ':bid' => $id
                ),
            ),
        ));

        // История банов
        $history = new CActiveDataProvider('Bans', array(
            'criteria' => array(
                'condition' => '`bid` <> :hbid AND (`player_ip` = :hip OR `player_id` = :hid)',
                'params' => array(
                    ':hbid' => $id,
                    ':hip' => $model->player_ip,
                    ':hid' => $model->player_id
                ),
            ),
            'pagination' => array(
                'pageSize' => 5
            )
        ));

        // Вывод всего на вьюху
        $this->render('view',array(
            'geo' => $geo,
            'ipaccess' => $ipaccess,
            'model'=>$model,
            'files' => $files,
            'comments'=> $comments,
            'f' => $f,
            'c' => $c,
            'history' => $history
        ));
    }

    /**
     * Добавить бан
     */
    public function actionCreate()
    {
        // Проверка прав
        if (!Webadmins::checkAccess('bans_add')) {
            throw new CHttpException(403, "У Вас недостаточно прав");
        }

        $model=new Bans;

        // Аякс проверка формы
        $this->performAjaxValidation($model);

        if(isset($_POST['Bans'])) {
            $model->attributes=$_POST['Bans'];
            $model->admin_nick = 'Web';
            $model->server_name = 'Забанен с сайта';
            if ($model->save()) {
                $this->redirect(array('view', 'id' => $model->bid));
            }
        }

        $this->render('create',array(
            'model'=>$model,
        ));
    }

    /**
     * Редактировать бан
     * @param integer $id ID бана
     */
    public function actionUpdate($id)
    {
        $model=$this->loadModel($id);

        // Проверка прав
        if (!Webadmins::checkAccess('bans_edit', $model->admin_nick)) {
            throw new CHttpException(403, "У Вас недостаточно прав");
        }

        // Аякс проверка формы
        // $this->performAjaxValidation($model);

        // Сохраняем форму
        if(isset($_POST['Bans'])) {
            $model->attributes=$_POST['Bans'];
            if(isset($_POST['selfreasoncheckbox']) && isset($_POST['self_ban_reason'])) {
                $model->ban_reason = $_POST['self_ban_reason'];
            }
            if ($model->save()) {
                $this->redirect(array('view', 'id' => $model->bid));
            }
        }

        $this->render('update',array(
            'model'=>$model,
        ));
    }

    /**
     * Удаление бана
     * @param integer $id ID бана
     */
    public function actionDelete($id)
    {
        $model = $this->loadModel($id);

        // Проверка прав
        if (!Webadmins::checkAccess('bans_delete', $model->admin_nick)) {
            throw new CHttpException(403, "У Вас недостаточно прав");
        }

        $model->delete();
        // Если не аякс запрос, то редиректим
        if (!isset($_GET['ajax'])) {
            $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
        }
    }

    /**
     * Вывод всех банов
     */
    public function actionIndex()
    {
        if(Yii::app()->request->isAjaxRequest && isset($_POST['server'])) {
            if($_POST['server'] == 0) {
                Yii::app()->end('$("#Bans_admin_nick").html("<option value=\"0\">Не выбрано</option>");');
            }
            $amxadmins = Amxadmins::model()->with('servers')->findAll('`address` = :addr', array(':addr' => $_POST['server']));

            $js = "<option>Любой админ</option>";
            foreach($amxadmins as $admin) {
                $js .= "<option value=\"{$admin->steamid}\">{$admin->nickname}</option>";
            }

            Yii::app()->end("$('#Bans_admin_nick').html('{$js}')");
        }

        $model=new Bans('search');
        $model->unsetAttributes();
        if (isset($_GET['Bans'])) {
            $model->attributes = $_GET['Bans'];
        }

        $select = "((ban_created+(ban_length*60)) > UNIX_TIMESTAMP() OR ban_length = 0) AND `expired` = 0";

        $dataProvider=new CActiveDataProvider('Bans', array(
            'criteria'=>array(
                'condition' => Yii::app()->config->auto_prune
                    ?
                $select
                    :
                null,
                'order' => '`ban_created` DESC',
            ),
            'pagination' => array(
                'pageSize' =>  Yii::app()->config->bans_per_page,

            ),)
         );

        // Проверяем IP посетителя, есть ли он в активных банах
        $check = Bans::model()->count(
            "`player_ip` = :ip AND " . $select,
            array(
                ':ip'=> Prefs::getRealIp(),
            )
        );
        $this->render('index',array(
            'dataProvider'=>$dataProvider,
            'model'=>$model,
            'check' => $check > 0 ? true : false,
        ));

    }

    /**
     * Управление банами (Хз, буду ли использовать)
     */
    public function actionAdmin()
    {
        if (Yii::app()->user->isGuest) {
            throw new CHttpException(403, "У Вас недостаточно прав");
        }

        $model=new Bans('search');
        $model->unsetAttributes();
        if (isset($_GET['Bans'])) {
            $model->attributes = $_GET['Bans'];
        }

        $this->render('admin',array(
            'model'=>$model,
        ));
    }

    /**
     * Вывод данных о бане в модальке
     */
    public function actionBandetail()
    {
        if(is_numeric($_POST['bid']))
        {
            $model = Bans::model()->with('admin')->findByPk($_POST['bid']);
            if($model === null)
            {
                Yii::app()->end('alert("Ошибка!")');
            }
            $js = "$('#bandetail-nick').html('" .  CHtml::encode($model->player_nick) . "');";
            $js .= "$('#bandetail-steam').html('" . $model->player_id . "');";
            $js .= "$('#bandetail-steamcommynity').html('" . Prefs::steam_convert($model->player_id, true) . "');";
            $js .= "$('#bandetail-ip').html('" . (Webadmins::checkAccess('ip_view') ? $model->player_ip : 'Cкрыт') . "');";
            $js .= "$('#bandetail-type').html('" . Prefs::getBanType($model->ban_type) . "');";
            $js .= "$('#bandetail-reason').html('" . $model->ban_reason . "');";
            $js .= "$('#bandetail-datetime').html('" . date('d.m.y - H:i:s',$model->ban_created) . "');";
            $js .= "$('#bandetail-expired').html('" . ($model->ban_length == '-1'
                    ?
                'Разбанен'
                    :
                Prefs::date2word($model->ban_length) .
                ($model->expired == 1 ? ' (истек)' : '')) . "');";
            $js .= "$('#bandetail-admin').html('" . $model->adminName . "');";
            $js .= "$('#bandetail-server').html('" . CHtml::encode($model->server_name) . "');";
            $js .= "$('#bandetail-kicks').html('" . $model->ban_kicks . "');";
            $js .= "$('#loading').hide();";
            $js .= "$('#viewban').attr({'href': '".Yii::app()->urlManager->createUrl('/bans/view', array('id' => $_POST['bid']))."'});";
            $js .= "$('#BanDetail').modal('show');";
            echo $js;
        }
        Yii::app()->end();
    }

    public function actionMotd($sid, $adm = 0, $lang = 'ru')
    {
        $this->layout = FALSE;

        $sid = (int)substr( $sid, 1 );

        $model = Bans::model()->findByPk($sid);
        if ($model === null) {
            Yii::app()->end('Error!');
        }

        $this->render('motd', array(
            'model'=>$model,
            'show_admin' => $adm == 1 ? TRUE : FALSE
        ));
    }

    /**
     * Загрузка модели по ID
     * @param integer ID бана
     */
    public function loadModel($id)
    {
        $model=Bans::model()->findByPk($id);
        if ($model === null) {
            throw new CHttpException(404, 'The requested page does not exist.');
        }
        return $model;
    }

    /**
     * Аякс проверка формы
     */
    protected function performAjaxValidation($model)
    {
        if(isset($_POST['ajax']) && $_POST['ajax']==='bans-form') {
            echo CActiveForm::validate($model);
            Yii::app()->end();
        }
    }
}

Скачать файл: cs-bans-1_3_3.zip [12.58 Mb] (cкачиваний: 10)