Making WordPress.org

Ticket #1956: 1956.patch

File 1956.patch, 9.1 KB (added by Clorith, 4 years ago)
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/support-forums/inc/class-plugin.php

     
    3737         * Instantiate a new Plugin object.
    3838         */
    3939        private function __construct() {
    40                 $this->users       = new Users;
    41                 $this->user_notes  = new User_Notes;
    42                 $this->moderators  = new Moderators;
    43                 $this->hooks       = new Hooks;
     40                $this->users        = new Users;
     41                $this->user_notes   = new User_Notes;
     42                $this->moderators   = new Moderators;
     43                $this->hooks        = new Hooks;
     44                $this->report_topic = new Report_Topic;
    4445
    4546                // These modifications are specific to https://wordpress.org/support/
    4647                $blog_id = get_current_blog_id();
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/support-forums/inc/class-report-topic.php

     
     1<?php
     2
     3namespace WordPressdotorg\Forums;
     4
     5class Report_Topic {
     6
     7        public function __construct() {
     8                add_action( 'wporg_support_after_topic_info', array( $this, 'add_sidebar_link' ) );
     9
     10                add_action( 'init', array( $this, 'capture_topic_report' ) );
     11        }
     12
     13        public function capture_topic_report() {
     14                // Do not process anything if the user is not logged in.
     15                if ( ! is_user_logged_in() ) {
     16                        return;
     17                }
     18
     19                if ( isset( $_GET['wporg-support-report-topic'] ) ) {
     20                        $action = sprintf(
     21                                'report-topic-%d',
     22                                $_GET['wporg-support-report-topic']
     23                        );
     24
     25                        // Verify that the nonce is valid.
     26                        if ( ! wp_verify_nonce( $_GET['_wpnonce'], $action ) ) {
     27                                return;
     28                        }
     29
     30                        wp_add_object_terms( $_GET['wporg-support-report-topic'], 'modlook', 'topic-tag' );
     31
     32                        $reporter = $this->get_previous_reports( $_GET['wporg-support-report-topic'] );
     33                        if ( empty( $reporter ) ) {
     34                                $reporter = array();
     35                        }
     36
     37                        $current_user = get_current_user_id();
     38
     39                        // In those odd cases where the same user reports a topic multiple times, let's increment them, so we can track each report time.
     40                        $report_id = $current_user;
     41                        if ( isset( $reporter[ $report_id ] ) ) {
     42                                $increment = 1;
     43
     44                                $report_id = sprintf(
     45                                        '%d-%d',
     46                                        $current_user,
     47                                        $increment
     48                                );
     49
     50                                while ( isset( $reporter[ $report_id ] ) ) {
     51                                        $increment++;
     52
     53                                        /*
     54                                         * If someone reports the same topic repeatedly, let's just stop logging it to avoid
     55                                         * a never ending incremental loop, our moderators are smart enough to pick up on such behavior.
     56                                         */
     57                                        if ( $increment > 10 ) {
     58                                                return;
     59                                        }
     60
     61                                        $report_id = sprintf(
     62                                                '%d-%d',
     63                                                $current_user,
     64                                                $increment
     65                                        );
     66                                }
     67                        }
     68
     69                        $reporter[ $report_id ] = array(
     70                                'time' => current_time( 'mysql' ),
     71                                'user' => $current_user,
     72                        );
     73
     74                        update_post_meta( $_GET['wporg-support-report-topic'], '_topic_reported_by', $reporter );
     75
     76                        wp_safe_redirect( get_the_permalink( $_GET['wporg-support-report-topic'] ) );
     77
     78                        exit();
     79                }
     80
     81                if ( isset( $_GET['wporg-support-remove-modlook'] ) && current_user_can( 'moderate' ) ) {
     82                        $action = sprintf(
     83                                'remove-topic-modlook-%d',
     84                                $_GET['wporg-support-remove-modlook']
     85                        );
     86
     87                        // Verify that the nonce is valid.
     88                        if ( ! wp_verify_nonce( $_GET['_wpnonce'], $action ) ) {
     89                                return;
     90                        }
     91
     92                        wp_remove_object_terms( $_GET['wporg-support-remove-modlook'], 'modlook', 'topic-tag' );
     93
     94                        wp_safe_redirect( get_the_permalink( $_GET['wporg-support-remove-modlook'] ) );
     95
     96                        exit();
     97                }
     98        }
     99
     100        public function add_sidebar_link() {
     101                // We don't want to allow anonymous users to report topics, we want to track who reports them.
     102                if ( ! is_user_logged_in() ) {
     103                        return;
     104                }
     105
     106                $current_user     = get_current_user_id();
     107                $previous_reports = $this->get_previous_reports();
     108                $is_reported      = has_term( 'modlook', 'topic-tag', bbp_get_topic_id() );
     109
     110                $report_text = '';
     111
     112                if ( $is_reported ) {
     113                        $report_text = __( 'This topic has been reported', 'wporg-forums' );
     114                }
     115                else {
     116                        if ( isset( $previous_reports[ $current_user ] ) ) {
     117                                $report_text = sprintf(
     118                                        '<a href="%s">%s</a>',
     119                                        esc_url( $this->get_report_topic_url() ),
     120                                        __( 'Report this topic again', 'wporg-forums' )
     121                                );
     122                        }
     123                        else {
     124                                $report_text = sprintf(
     125                                        '<a href="%s">%s</a>',
     126                                        esc_url( $this->get_report_topic_url() ),
     127                                        __( 'Report this topic', 'wporg-forums' )
     128                                );
     129                        }
     130                }
     131
     132                if ( $is_reported && current_user_can( 'moderate' ) ) {
     133                        $report_text .= sprintf(
     134                                '<br><a href="%s" class="button">%s</a>',
     135                                esc_url( $this->remove_topic_modlook_url() ),
     136                                // translators: `modlook` is the term used for posts tagged by users when they want a moderator to have a look.
     137                                __( 'Remove modlook', 'wporg-support' )
     138                        );
     139                }
     140
     141                printf(
     142                        '<li class="topic-report">%s</li>',
     143                        $report_text
     144                );
     145
     146                // Moderators should be able to see previous topic reports.
     147                if ( current_user_can( 'moderate' ) && ! empty( $previous_reports ) ) {
     148                        $lines = array();
     149
     150                        foreach( $previous_reports as $report ) {
     151                                $lines[] = sprintf(
     152                                        '<li><a href="%s">%s</a></li>',
     153                                        esc_url( bbp_get_user_profile_url( $report['user']) ),
     154                                        sprintf(
     155                                                /* translators: %1$s: Reporters display name, %2$s: date, %3$s: time */
     156                                                '%1$s on %2$s at %3$s',
     157                                                get_the_author_meta( 'display_name', $report['user'] ),
     158                                                /* translators: localized date format, see https://secure.php.net/date */
     159                                                mysql2date( __( 'F j, Y', 'wporg-forums' ), $report['time'] ),
     160                                                /* translators: localized time format, see https://secure.php.net/date */
     161                                                mysql2date( __( 'g:i a', 'wporg-forums' ), $report['time'] )
     162                                        )
     163                                );
     164                        }
     165
     166                        printf(
     167                                '<li class="topic-previous-reports">%s<ul class="previous-reports">%s</ul></li>',
     168                                __( 'Previously reported by:', 'wporg-support' ),
     169                                implode( ' ', $lines )
     170                        );
     171                }
     172        }
     173
     174        public function get_previous_reports( $topic_id = null ) {
     175                if ( null === $topic_id ) {
     176                        $topic_id = bbp_get_topic_id();
     177                }
     178
     179                $reporters = get_post_meta( $topic_id, '_topic_reported_by', true );
     180
     181                if ( empty( $reporters ) ) {
     182                        $reporters = array();
     183                }
     184
     185                return $reporters;
     186        }
     187
     188        public function get_report_topic_url() {
     189                $url = add_query_arg( array(
     190                        'wporg-support-report-topic' => bbp_get_topic_id(),
     191                ), get_the_permalink() );
     192
     193                $action = sprintf(
     194                        'report-topic-%d',
     195                        bbp_get_topic_id()
     196                );
     197
     198                return wp_nonce_url( $url, $action );
     199        }
     200
     201        public function remove_topic_modlook_url() {
     202                $url = add_query_arg( array(
     203                        'wporg-support-remove-modlook' => bbp_get_topic_id(),
     204                ), get_the_permalink() );
     205
     206                $action = sprintf(
     207                        'remove-topic-modlook-%d',
     208                        bbp_get_topic_id()
     209                );
     210
     211                return wp_nonce_url( $url, $action );
     212        }
     213}
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/support-forums/support-forums.php

     
    1919include( dirname( __FILE__ ) . '/inc/class-user-notes.php' );
    2020include( dirname( __FILE__ ) . '/inc/class-moderators.php' );
    2121include( dirname( __FILE__ ) . '/inc/class-hooks.php' );
     22include( dirname( __FILE__ ) . '/inc/class-report-topic.php' );
    2223
    2324// Compat-only includes.
    2425include( dirname( __FILE__ ) . '/inc/class-dropin.php' );
  • sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-support/sass/site/_bbpress.scss

     
    999999                content: "\f487";
    10001000        }
    10011001
     1002        .topic-info li.topic-report::before {
     1003                content: "\f227";
     1004        }
     1005
     1006        .topic-info li.topic-previous-reports {
     1007
     1008                .previous-reports {
     1009
     1010                        padding-left: 0;
     1011
     1012                        li {
     1013                                list-style: inside;
     1014                        }
     1015                }
     1016        }
     1017
    10021018        .plugin-meta-icon {
    10031019                border-top: 0;
    10041020        }
  • sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-support/functions.php

     
    723723        <?php endif; ?>
    724724
    725725        <?php
     726        do_action( 'wporg_support_after_topic_info' );
    726727}
    727728
    728729function bb_base_single_forum_description() {