Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
68.75% covered (warning)
68.75%
44 / 64
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 1
MachineReadableRCFeedFormatter
69.84% covered (warning)
69.84%
44 / 63
0.00% covered (danger)
0.00%
0 / 1
23.02
0.00% covered (danger)
0.00%
0 / 1
 formatArray
n/a
0 / 0
n/a
0 / 0
0
 getLine
69.84% covered (warning)
69.84%
44 / 63
0.00% covered (danger)
0.00%
0 / 1
23.02
1<?php
2
3/**
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 * http://www.gnu.org/copyleft/gpl.html
18 *
19 * @file
20 */
21
22namespace MediaWiki\RCFeed;
23
24use MediaWiki\MainConfigNames;
25use MediaWiki\MediaWikiServices;
26use MediaWiki\WikiMap\WikiMap;
27use RecentChange;
28
29/**
30 * Abstract class so there can be multiple formatters outputting the same data
31 *
32 * @since 1.23
33 */
34abstract class MachineReadableRCFeedFormatter implements RCFeedFormatter {
35
36    /**
37     * Take the packet and return the formatted string
38     *
39     * @param array $packet
40     *
41     * @return string
42     */
43    abstract protected function formatArray( array $packet );
44
45    /**
46     * Generates a notification that can be easily interpreted by a machine.
47     *
48     * @see RCFeedFormatter::getLine
49     *
50     * @param array $feed
51     * @param RecentChange $rc
52     * @param string|null $actionComment
53     *
54     * @return string|null
55     */
56    public function getLine( array $feed, RecentChange $rc, $actionComment ) {
57        $mainConfig = MediaWikiServices::getInstance()->getMainConfig();
58        $canonicalServer = $mainConfig->get( MainConfigNames::CanonicalServer );
59        $serverName = $mainConfig->get( MainConfigNames::ServerName );
60        $scriptPath = $mainConfig->get( MainConfigNames::ScriptPath );
61        $packet = [
62            // Usually, RC ID is exposed only for patrolling purposes,
63            // but there is no real reason not to expose it in other cases,
64            // and I can see how this may be potentially useful for clients.
65            'id' => $rc->getAttribute( 'rc_id' ),
66            'type' => RecentChange::parseFromRCType( $rc->getAttribute( 'rc_type' ) ),
67            'namespace' => $rc->getTitle()->getNamespace(),
68            'title' => $rc->getTitle()->getPrefixedText(),
69            'title_url' => $rc->getTitle()->getCanonicalURL(),
70            'comment' => $rc->getAttribute( 'rc_comment' ),
71            'timestamp' => (int)wfTimestamp( TS_UNIX, $rc->getAttribute( 'rc_timestamp' ) ),
72            'user' => $rc->getAttribute( 'rc_user_text' ),
73            'bot' => (bool)$rc->getAttribute( 'rc_bot' ),
74            'notify_url' => $rc->getNotifyUrl(),
75        ];
76
77        if ( isset( $feed['channel'] ) ) {
78            $packet['channel'] = $feed['channel'];
79        }
80
81        $type = $rc->getAttribute( 'rc_type' );
82        if ( $type == RC_EDIT || $type == RC_NEW ) {
83            $useRCPatrol = MediaWikiServices::getInstance()->getMainConfig()->get( MainConfigNames::UseRCPatrol );
84            $useNPPatrol = MediaWikiServices::getInstance()->getMainConfig()->get( MainConfigNames::UseNPPatrol );
85            $packet['minor'] = (bool)$rc->getAttribute( 'rc_minor' );
86            if ( $useRCPatrol || ( $type == RC_NEW && $useNPPatrol ) ) {
87                $packet['patrolled'] = (bool)$rc->getAttribute( 'rc_patrolled' );
88            }
89        }
90
91        switch ( $type ) {
92            case RC_EDIT:
93                $packet['length'] = [
94                    'old' => $rc->getAttribute( 'rc_old_len' ),
95                    'new' => $rc->getAttribute( 'rc_new_len' )
96                ];
97                $packet['revision'] = [
98                    'old' => $rc->getAttribute( 'rc_last_oldid' ),
99                    'new' => $rc->getAttribute( 'rc_this_oldid' )
100                ];
101                break;
102
103            case RC_NEW:
104                $packet['length'] = [ 'old' => null, 'new' => $rc->getAttribute( 'rc_new_len' ) ];
105                $packet['revision'] = [ 'old' => null, 'new' => $rc->getAttribute( 'rc_this_oldid' ) ];
106                break;
107
108            case RC_LOG:
109                $packet['log_id'] = $rc->getAttribute( 'rc_logid' );
110                $packet['log_type'] = $rc->getAttribute( 'rc_log_type' );
111                $packet['log_action'] = $rc->getAttribute( 'rc_log_action' );
112                if ( $rc->getAttribute( 'rc_params' ) ) {
113                    $params = $rc->parseParams();
114                    if (
115                        // If it's an actual serialised false...
116                        $rc->getAttribute( 'rc_params' ) == serialize( false ) ||
117                        // Or if we did not get false back when trying to unserialise
118                        $params !== false
119                    ) {
120                        // From ApiQueryLogEvents::addLogParams
121                        $logParams = [];
122                        // Keys like "4::paramname" can't be used for output so we change them to "paramname"
123                        foreach ( $params as $key => $value ) {
124                            if ( strpos( $key, ':' ) === false ) {
125                                $logParams[$key] = $value;
126                                continue;
127                            }
128                            $logParam = explode( ':', $key, 3 );
129                            $logParams[$logParam[2]] = $value;
130                        }
131                        $packet['log_params'] = $logParams;
132                    } else {
133                        $packet['log_params'] = explode( "\n", $rc->getAttribute( 'rc_params' ) );
134                    }
135                }
136                $packet['log_action_comment'] = $actionComment;
137                break;
138        }
139
140        $packet['server_url'] = $canonicalServer;
141        $packet['server_name'] = $serverName;
142
143        $packet['server_script_path'] = $scriptPath ?: '/';
144        $packet['wiki'] = WikiMap::getCurrentWikiId();
145
146        return $this->formatArray( $packet );
147    }
148}
149/** @deprecated class alias since 1.43 */
150class_alias( MachineReadableRCFeedFormatter::class, 'MachineReadableRCFeedFormatter' );