Вход Регистрация
Файл: library/XenForo/ControllerPublic/Report.php
Строк: 531
<?php

/**
 * Controller for managing reported content.
 *
 * @package XenForo_Report
 */
class XenForo_ControllerPublic_Report extends XenForo_ControllerPublic_Abstract
{
    
/**
     * Pre-dispatch, ensure visitor is a moderator.
     */
    
protected function _preDispatch($action)
    {
        
$visitor XenForo_Visitor::getInstance();
        if (!
$visitor['is_moderator'])
        {
            throw 
$this->getNoPermissionResponseException();
        }
    }

    
/**
     * Displays a list of active reports for the visiting user.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionIndex()
    {
        
$reportId $this->_input->filterSingle('report_id'XenForo_Input::UINT);
        if (
$reportId)
        {
            return 
$this->responseReroute(__CLASS__'view');
        }

        
$reportModel $this->_getReportModel();

        
$activeReports $reportModel->getActiveReports();

        if (
XenForo_Application::isRegistered('reportCounts'))
        {
            
$reportCounts XenForo_Application::get('reportCounts');
            if (
count($activeReports) != $reportCounts['activeCount'])
            {
                
$reportModel->rebuildReportCountCache(count($activeReports));
            }
        }

        
XenForo_Application::getSession()->set('reportLastRead'XenForo_Application::$time);

        
$reports $reportModel->getVisibleReportsForUser($activeReports);

        
$session XenForo_Application::get('session');
        
$sessionReportCounts $session->get('reportCounts');

        if (!
is_array($sessionReportCounts) || $sessionReportCounts['total'] != count($reports))
        {
            
$sessionReportCounts $reportModel->getSessionCountsForReports($reportsXenForo_Visitor::getUserId());
            
$sessionReportCounts['lastBuildDate'] = XenForo_Application::$time;
            
$session->set('reportCounts'$sessionReportCounts);
        }

        
$closedReportsRaw $reportModel->getClosedReportsInTimeFrame(XenForo_Application::$time 86400XenForo_Application::$time);

        
$viewParams = array(
            
'reports' => $reports,
            
'recentlyClosed' => $reportModel->getVisibleReportsForUser($closedReportsRaw),
        );

        return 
$this->responseView('XenForo_ViewPublic_Report_List''report_list'$viewParams);
    }

    public function 
actionSearch()
    {
        
/** @var $userModel XenForo_Model_User */
        
$userModel $this->getModelFromCache('XenForo_Model_User');

        
$username $this->_input->filterSingle('username'XenForo_Input::STRING);
        if (
$username)
        {
            
$user $userModel->getUserByName($username);
        }
        else
        {
            
$user $userModel->getUserById($this->_input->filterSingle('user_id'XenForo_Input::UINT));
        }

        if (!
$user)
        {
            return 
$this->responseError(new XenForo_Phrase('requested_member_not_found'), 404);
        }

        
$page $this->_input->filterSingle('page'XenForo_Input::UINT);
        
$perPage 50;

        
$reportModel $this->_getReportModel();

        
$totalReports $reportModel->countReportsByContentUserId($user['user_id']);
        if (!
$totalReports)
        {
            return 
$this->responseError(new XenForo_Phrase('no_reports_were_found_for_this_users_content'));
        }

        
$this->canonicalizePageNumber($page$perPage$totalReports'reports/search', array('user_id' => $user['user_id']));

        
$reports $reportModel->getReportsByContentUserId($user['user_id'], array(
            
'page' => $page,
            
'perPage' => $perPage
        
));

        
$viewParams = array(
            
'reports' => $reportModel->flagVisibleReportsForUser($reports),
            
'user' => $user,
            
'page' => $page,
            
'perPage' => $perPage,
            
'totalReports' => $totalReports
        
);

        return 
$this->responseView('XenForo_ViewPublic_Report_Search''report_search'$viewParams);
    }

    
/**
     * Displays a list of closed reports in a given time frame.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionClosed()
    {
        
$page $this->_input->filterSingle('page'XenForo_Input::UINT);
        if (
$page 1)
        {
            
$page 1;
        }

        
$daysInRange 7;
        
$date = new DateTime();
        if (
$page 1)
        {
            
$max floor(XenForo_Application::$time / ($daysInRange 86400));

            if (
$page $max)
            {
                
$params $_GET;
                
$params['page'] = $max;

                
$redirectUrl $this->_buildLink('reports/closed'null$params);

                throw 
$this->responseException($this->responseRedirect(
                    
XenForo_ControllerResponse_Redirect::RESOURCE_CANONICAL,
                    
$redirectUrl
                
));
            }

            
$date->modify('-' . ($daysInRange * ($page 1)) . ' days');
        }
        
$maximumTimestamp $date->format('U');

        
$date->modify("-$daysInRange days");
        
$minimumTimestamp $date->format('U');

        
$reportModel $this->_getReportModel();
        
$reportsRaw $reportModel->getClosedReportsInTimeFrame($minimumTimestamp$maximumTimestamp);

        
$viewParams = array(
            
'reports' => $reportModel->getVisibleReportsForUser($reportsRaw),
            
'page' => $page,
            
'minimumTimestamp' => $minimumTimestamp,
            
'maximumTimestamp' => $maximumTimestamp
        
);

        return 
$this->responseView('XenForo_ViewPublic_Report_ListClosed''report_list_closed'$viewParams);
    }

    
/**
     * Displays the details of a report.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionView()
    {
        
$reportId $this->_input->filterSingle('report_id'XenForo_Input::UINT);
        
$report $this->_getVisibleReportOrError($reportId);

        if (!
$report['report_count'])
        {
            
$dw XenForo_DataWriter::create('XenForo_DataWriter_Report'XenForo_DataWriter::ERROR_SILENT);
            
$dw->setExistingData($report);
            
$dw->updateReportCount();
            
$dw->save();

            
$report['report_count'] = $dw->get('report_count');
            
$report['comment_count'] = $dw->get('comment_count');
        }

        
/** @var $userModel XenForo_Model_User */
        
$userModel $this->getModelFromCache('XenForo_Model_User');

        
$visitor XenForo_Visitor::getInstance();

        
$reportModel $this->_getReportModel();

        
$viewParams = array(
            
'report' => $report,
            
'comments' => $reportModel->prepareReportComments($reportModel->getReportComments($reportId)),
            
'canUpdateReport' => $reportModel->canUpdateReport($report),
            
'canAssignReport' => $reportModel->canAssignReport($report),

            
'canCleanSpam' => (XenForo_Permission::hasPermission($visitor['permissions'], 'general''cleanSpam') && $userModel->couldBeSpammer($report)),
            
'canBanUsers' => ($visitor['is_admin'] && $visitor->hasAdminPermission('ban') && $report['user_id'] != $visitor->getUserId() && !$report['is_admin'] && !$report['is_moderator']),
            
'canEditUsers' => ($visitor['is_admin'] && $visitor->hasAdminPermission('user')),
            
'canWarn' => $userModel->canWarnUser($report),
        );

        return 
$this->responseView('XenForo_ViewPublic_Report_View''report_view'$viewParams);
    }

    
/**
     * Assigns a report to visiting user.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionAssign()
    {
        
$this->_assertPostOnly();

        
$reportId $this->_input->filterSingle('report_id'XenForo_Input::UINT);
        
$report $this->_getVisibleReportOrError($reportId);

        if (!
$this->_getReportModel()->canAssignReport($report))
        {
            return 
$this->responseError(new XenForo_Phrase('you_can_no_longer_be_assigned_to_this_report'));
        }

        
$viewedAssignedUserId $this->_input->filterSingle('viewed_assigned_user_id'XenForo_Input::UINT);

        if (
$report['assigned_user_id'] != $viewedAssignedUserId)
        {
            return 
$this->responseError(new XenForo_Phrase('this_report_has_been_assigned_to_another_moderator'));
        }

        
$dw XenForo_DataWriter::create('XenForo_DataWriter_Report');
        
$dw->setExistingData($reporttrue);
        
$dw->set('report_state''assigned');
        
$dw->set('assigned_user_id'XenForo_Visitor::getUserId());
        
$dw->save();

        
$visitor XenForo_Visitor::getInstance();

        
$dw XenForo_DataWriter::create('XenForo_DataWriter_ReportComment');
        
$dw->bulkSet(array(
            
'report_id' => $reportId,
            
'user_id' => $visitor['user_id'],
            
'username' => $visitor['username'],
            
'state_change' => 'assigned'
        
));
        
$dw->save();

        return 
$this->responseRedirect(
            
XenForo_ControllerResponse_Redirect::SUCCESS,
            
XenForo_Link::buildPublicLink('reports'$report)
        );
    }

    public function 
actionComment()
    {
        
$this->_assertPostOnly();

        
$reportId $this->_input->filterSingle('report_id'XenForo_Input::UINT);
        
$report $this->_getVisibleReportOrError($reportId);

        
$visitor XenForo_Visitor::getInstance();

        
$comment $this->_input->filterSingle('comment'XenForo_Input::STRING);
        if (
$comment)
        {
            
$reopen $this->_input->filterSingle('reopen'XenForo_Input::UINT);

            if (
$reopen && ($report['report_state'] == 'resolved' || $report['report_state'] == 'rejected'))
            {
                
// comment on a closed report reopens it
                
$reportDw XenForo_DataWriter::create('XenForo_DataWriter_Report');
                
$reportDw->setExistingData($reporttrue);
                
$reportDw->set('report_state''open');
                
$reportDw->save();

                
$newReportState 'open';
            }
            else
            {
                
$newReportState '';
            }

            
$dw XenForo_DataWriter::create('XenForo_DataWriter_ReportComment');
            
$dw->bulkSet(array(
                
'report_id' => $reportId,
                
'user_id' => $visitor['user_id'],
                
'username' => $visitor['username'],
                
'message' => $comment,
                
'state_change' => $newReportState
            
));
            
$dw->save();

            
XenForo_Application::getSession()->set('reportLastRead'XenForo_Application::$time);
        }

        return 
$this->responseRedirect(
            
XenForo_ControllerResponse_Redirect::SUCCESS,
            
XenForo_Link::buildPublicLink('reports'$report)
        );
    }

    
/**
     * Updates the status of a report.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionUpdate()
    {
        
$this->_assertPostOnly();

        
$reportId $this->_input->filterSingle('report_id'XenForo_Input::UINT);
        
$report $this->_getVisibleReportOrError($reportId);

        
$input $this->_input->filter(array(
            
'report_state' => XenForo_Input::STRING,
            
'comment' => XenForo_Input::STRING
        
));

        if (!
$this->_getReportModel()->canUpdateReport($report))
        {
            return 
$this->responseError(new XenForo_Phrase('you_can_no_longer_update_this_report'));
        }

        
$visitor XenForo_Visitor::getInstance();

        
$dw XenForo_DataWriter::create('XenForo_DataWriter_ReportComment');
        
$dw->bulkSet(array(
            
'report_id' => $reportId,
            
'user_id' => $visitor['user_id'],
            
'username' => $visitor['username'],
            
'message' => $input['comment'],
            
'state_change' => $input['report_state']
        ));
        
$dw->save();

        
XenForo_Application::getSession()->set('reportLastRead'XenForo_Application::$time);

        if (
$input['report_state'])
        {
            
$dw XenForo_DataWriter::create('XenForo_DataWriter_Report');
            
$dw->setExistingData($reporttrue);
            
$dw->set('report_state'$input['report_state']);
            switch (
$input['report_state'])
            {
                case 
'assigned':
                    
$dw->set('assigned_user_id'XenForo_Visitor::getUserId());
                    break;

                case 
'open':
                    
$dw->set('assigned_user_id'0);
                    break;
            }
            
$dw->setOption(
                
XenForo_DataWriter_Report::OPTION_ALERT_REPORTERS,
                
$this->_input->filterSingle('send_alert'XenForo_Input::UINT)
            );
            
$dw->setOption(
                
XenForo_DataWriter_Report::OPTION_ALERT_COMMENT,
                
$this->_input->filterSingle('alert_comment'XenForo_Input::STRING)
            );
            
$dw->save();

            return 
$this->responseRedirect(
                
XenForo_ControllerResponse_Redirect::SUCCESS,
                
XenForo_Link::buildPublicLink('reports'$input['report_state'] == 'assigned' $report null)
            );
        }
        else
        {
            return 
$this->responseRedirect(
                
XenForo_ControllerResponse_Redirect::SUCCESS,
                
XenForo_Link::buildPublicLink('reports'$report)
            );
        }
    }

    public function 
actionReassign()
    {
        
$reportId $this->_input->filterSingle('report_id'XenForo_Input::UINT);
        
$report $this->_getVisibleReportOrError($reportId);

        if (!
$this->_getReportModel()->canUpdateReport($report))
        {
            return 
$this->responseError(new XenForo_Phrase('you_can_no_longer_update_this_report'));
        }

        
$users $this->_getReportModel()->getUsersWhoCanViewReport($report);

        if (
$this->isConfirmedPost())
        {
            
$userId $this->_input->filterSingle('user_id'XenForo_Input::UINT);
            
$visitor XenForo_Visitor::getInstance();

            if (!
$userId || isset($users[$userId]))
            {
                
$dw XenForo_DataWriter::create('XenForo_DataWriter_ReportComment');
                
$dw->bulkSet(array(
                    
'report_id' => $reportId,
                    
'user_id' => $visitor['user_id'],
                    
'username' => $visitor['username'],
                    
'state_change' => $userId 'assigned' 'open'
                
));
                
$dw->save();

                
$dw XenForo_DataWriter::create('XenForo_DataWriter_Report');
                
$dw->setExistingData($reporttrue);
                if (
$userId)
                {
                    
$dw->set('report_state''assigned');
                    
$dw->set('assigned_user_id'$userId);
                }
                else
                {
                    
$dw->set('report_state''open');
                    
$dw->set('assigned_user_id'0);
                }
                
$dw->save();

                return 
$this->responseRedirect(
                    
XenForo_ControllerResponse_Redirect::SUCCESS,
                    
XenForo_Link::buildPublicLink('reports')
                );
            }
        }

        
$viewParams = array(
            
'report' => $report,
            
'users' => $users
        
);

        return 
$this->responseView('XenForo_ViewPublic_Report_Reassign''report_reassign'$viewParams);
    }

    
/**
     * Gets the specified report if visible to the visiting user or throws an error.
     *
     * @param integer $reportId
     *
     * @return array
     */
    
protected function _getVisibleReportOrError($reportId)
    {
        
$reportModel $this->_getReportModel();

        
$report $reportModel->getVisibleReportById($reportId);
        if (!
$report)
        {
            throw 
$this->responseException($this->responseError(new XenForo_Phrase('requested_report_not_found'), 404));
        }

        return 
$report;
    }

    
/**
     * Session activity details.
     * @see XenForo_Controller::getSessionActivityDetailsForList()
     */
    
public static function getSessionActivityDetailsForList(array $activities)
    {
        return new 
XenForo_Phrase('performing_moderation_duties');
    }

    
/**
     * @return XenForo_Model_Report
     */
    
protected function _getReportModel()
    {
        return 
$this->getModelFromCache('XenForo_Model_Report');
    }
}
Онлайн: 0
Реклама