X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FRecentChange.php;h=41af45acdb01b07335da842dcac8eb1d0aca9dfa;hb=56af4f4d3849aa29bdb3883ef090ded39ab32e39;hp=a1352ce1456b951d7bcfde92cd01ab714e43691a;hpb=ee7ab4900efac8aa36750a377b732d4dd8a2d80b;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/RecentChange.php b/includes/RecentChange.php index a1352ce145..41af45acdb 100644 --- a/includes/RecentChange.php +++ b/includes/RecentChange.php @@ -1,7 +1,6 @@ loadFromRow( $row ); return $rc; } - /* static */ function newFromCurRow( $row, $rc_this_oldid = 0 ) + public static function newFromCurRow( $row, $rc_this_oldid = 0 ) { $rc = new RecentChange; $rc->loadFromCurRow( $row, $rc_this_oldid ); @@ -62,6 +62,49 @@ class RecentChange $rc->numberofWatchingusers = false; return $rc; } + + /** + * Obtain the recent change with a given rc_id value + * + * @param $rcid rc_id value to retrieve + * @return RecentChange + */ + public static function newFromId( $rcid ) { + $dbr = wfGetDB( DB_SLAVE ); + $res = $dbr->select( 'recentchanges', '*', array( 'rc_id' => $rcid ), __METHOD__ ); + if( $res && $dbr->numRows( $res ) > 0 ) { + $row = $dbr->fetchObject( $res ); + $dbr->freeResult( $res ); + return self::newFromRow( $row ); + } else { + return NULL; + } + } + + /** + * Find the first recent change matching some specific conditions + * + * @param array $conds Array of conditions + * @param mixed $fname Override the method name in profiling/logs + * @return RecentChange + */ + public static function newFromConds( $conds, $fname = false ) { + if( $fname === false ) + $fname = __METHOD__; + $dbr = wfGetDB( DB_SLAVE ); + $res = $dbr->select( + 'recentchanges', + '*', + $conds, + $fname + ); + if( $res instanceof ResultWrapper && $res->numRows() > 0 ) { + $row = $res->fetchObject(); + $res->free(); + return self::newFromRow( $row ); + } + return null; + } # Accessors @@ -95,10 +138,10 @@ class RecentChange # Writes the data in this object to the database function save() { - global $wgLocalInterwiki, $wgPutIPinRC, $wgRC2UDPAddress, $wgRC2UDPPort, $wgRC2UDPPrefix, $wgUseRCPatrol; + global $wgLocalInterwiki, $wgPutIPinRC, $wgRC2UDPAddress, $wgRC2UDPPort, $wgRC2UDPPrefix; $fname = 'RecentChange::save'; - $dbw =& wfGetDB( DB_MASTER ); + $dbw = wfGetDB( DB_MASTER ); if ( !is_array($this->mExtra) ) { $this->mExtra = array(); } @@ -108,11 +151,21 @@ class RecentChange $this->mAttribs['rc_ip'] = ''; } + ## If our database is strict about IP addresses, use NULL instead of an empty string + if ( $dbw->strictIPs() and $this->mAttribs['rc_ip'] == '' ) { + unset( $this->mAttribs['rc_ip'] ); + } + # Fixup database timestamps $this->mAttribs['rc_timestamp'] = $dbw->timestamp($this->mAttribs['rc_timestamp']); $this->mAttribs['rc_cur_time'] = $dbw->timestamp($this->mAttribs['rc_cur_time']); $this->mAttribs['rc_id'] = $dbw->nextSequenceValue( 'rc_rc_id_seq' ); + ## If we are using foreign keys, an entry of 0 for the page_id will fail, so use NULL + if ( $dbw->cascadingDeletes() and $this->mAttribs['rc_cur_id']==0 ) { + unset ( $this->mAttribs['rc_cur_id'] ); + } + # Insert new row $dbw->insert( 'recentchanges', $this->mAttribs, $fname ); @@ -163,44 +216,53 @@ class RecentChange } } - // E-mail notifications + # E-mail notifications global $wgUseEnotif; if( $wgUseEnotif ) { # this would be better as an extension hook - include_once( "UserMailer.php" ); - $enotif = new EmailNotification(); + global $wgUser; + $enotif = new EmailNotification; $title = Title::makeTitle( $this->mAttribs['rc_namespace'], $this->mAttribs['rc_title'] ); - $enotif->notifyOnPageChange( $title, + $enotif->notifyOnPageChange( $wgUser, $title, $this->mAttribs['rc_timestamp'], $this->mAttribs['rc_comment'], $this->mAttribs['rc_minor'], $this->mAttribs['rc_last_oldid'] ); } + # Notify extensions + wfRunHooks( 'RecentChange_save', array( &$this ) ); } - # Marks a certain row as patrolled - function markPatrolled( $rcid ) - { - $fname = 'RecentChange::markPatrolled'; - - $dbw =& wfGetDB( DB_MASTER ); - - $dbw->update( 'recentchanges', - array( /* SET */ + /** + * Mark a given change as patrolled + * + * @param mixed $change RecentChange or corresponding rc_id + */ + public static function markPatrolled( $change ) { + $rcid = $change instanceof RecentChange + ? $change->mAttribs['rc_id'] + : $change; + $dbw = wfGetDB( DB_MASTER ); + $dbw->update( + 'recentchanges', + array( 'rc_patrolled' => 1 - ), array( /* WHERE */ + ), + array( 'rc_id' => $rcid - ), $fname + ), + __METHOD__ ); } # Makes an entry in the database corresponding to an edit - /*static*/ function notifyEdit( $timestamp, &$title, $minor, &$user, $comment, + public static function notifyEdit( $timestamp, &$title, $minor, &$user, $comment, $oldId, $lastTimestamp, $bot = "default", $ip = '', $oldSize = 0, $newSize = 0, $newId = 0) { - if ( $bot == 'default' ) { + + if ( $bot === 'default' ) { $bot = $user->isAllowed( 'bot' ); } @@ -228,9 +290,11 @@ class RecentChange 'rc_bot' => $bot ? 1 : 0, 'rc_moved_to_ns' => 0, 'rc_moved_to_title' => '', - 'rc_ip' => $ip, - 'rc_patrolled' => 0, - 'rc_new' => 0 # obsolete + 'rc_ip' => $ip, + 'rc_patrolled' => 0, + 'rc_new' => 0, # obsolete + 'rc_old_len' => $oldSize, + 'rc_new_len' => $newSize ); $rc->mExtra = array( @@ -247,10 +311,8 @@ class RecentChange * Makes an entry in the database corresponding to page creation * Note: the title object must be loaded with the new id using resetArticleID() * @todo Document parameters and return - * @public - * @static */ - public static function notifyNew( $timestamp, &$title, $minor, &$user, $comment, $bot = "default", + public static function notifyNew( $timestamp, &$title, $minor, &$user, $comment, $bot = 'default', $ip='', $size = 0, $newId = 0 ) { if ( !$ip ) { @@ -259,7 +321,7 @@ class RecentChange $ip = ''; } } - if ( $bot == 'default' ) { + if ( $bot === 'default' ) { $bot = $user->isAllowed( 'bot' ); } @@ -282,7 +344,9 @@ class RecentChange 'rc_moved_to_title' => '', 'rc_ip' => $ip, 'rc_patrolled' => 0, - 'rc_new' => 1 # obsolete + 'rc_new' => 1, # obsolete + 'rc_old_len' => 0, + 'rc_new_len' => $size ); $rc->mExtra = array( @@ -296,7 +360,7 @@ class RecentChange } # Makes an entry in the database corresponding to a rename - /*static*/ function notifyMove( $timestamp, &$oldTitle, &$newTitle, &$user, $comment, $ip='', $overRedir = false ) + public static function notifyMove( $timestamp, &$oldTitle, &$newTitle, &$user, $comment, $ip='', $overRedir = false ) { if ( !$ip ) { $ip = wfGetIP(); @@ -324,7 +388,9 @@ class RecentChange 'rc_moved_to_title' => $newTitle->getDBkey(), 'rc_ip' => $ip, 'rc_new' => 0, # obsolete - 'rc_patrolled' => 1 + 'rc_patrolled' => 1, + 'rc_old_len' => NULL, + 'rc_new_len' => NULL, ); $rc->mExtra = array( @@ -335,17 +401,17 @@ class RecentChange $rc->save(); } - /* static */ function notifyMoveToNew( $timestamp, &$oldTitle, &$newTitle, &$user, $comment, $ip='' ) { + public static function notifyMoveToNew( $timestamp, &$oldTitle, &$newTitle, &$user, $comment, $ip='' ) { RecentChange::notifyMove( $timestamp, $oldTitle, $newTitle, $user, $comment, $ip, false ); } - /* static */ function notifyMoveOverRedirect( $timestamp, &$oldTitle, &$newTitle, &$user, $comment, $ip='' ) { + public static function notifyMoveOverRedirect( $timestamp, &$oldTitle, &$newTitle, &$user, $comment, $ip='' ) { RecentChange::notifyMove( $timestamp, $oldTitle, $newTitle, $user, $comment, $ip, true ); } # A log entry is different to an edit in that previous revisions are # not kept - /*static*/ function notifyLog( $timestamp, &$title, &$user, $comment, $ip='', + public static function notifyLog( $timestamp, &$title, &$user, $comment, $ip='', $type, $action, $target, $logComment, $params ) { if ( !$ip ) { @@ -374,7 +440,9 @@ class RecentChange 'rc_moved_to_title' => '', 'rc_ip' => $ip, 'rc_patrolled' => 1, - 'rc_new' => 0 # obsolete + 'rc_new' => 0, # obsolete + 'rc_old_len' => NULL, + 'rc_new_len' => NULL, ); $rc->mExtra = array( 'prefixedDBkey' => $title->getPrefixedDBkey(), @@ -396,7 +464,7 @@ class RecentChange $this->mExtra = array(); } - # Makes a pseudo-RC entry from a cur row, for watchlists and things + # Makes a pseudo-RC entry from a cur row function loadFromCurRow( $row ) { $this->mAttribs = array( @@ -418,12 +486,23 @@ class RecentChange 'rc_ip' => '', 'rc_id' => $row->rc_id, 'rc_patrolled' => $row->rc_patrolled, - 'rc_new' => $row->page_is_new # obsolete + 'rc_new' => $row->page_is_new, # obsolete + 'rc_old_len' => $row->rc_old_len, + 'rc_new_len' => $row->rc_new_len, ); $this->mExtra = array(); } + /** + * Get an attribute value + * + * @param $name Attribute name + * @return mixed + */ + public function getAttribute( $name ) { + return isset( $this->mAttribs[$name] ) ? $this->mAttribs[$name] : NULL; + } /** * Gets the end part of the diff URL associated with this object @@ -452,6 +531,8 @@ class RecentChange function getIRCLine() { global $wgUseRCPatrol; + // FIXME: Would be good to replace these 2 extract() calls with something more explicit + // e.g. list ($rc_type, $rc_id) = array_values ($this->mAttribs); [or something like that] extract($this->mAttribs); extract($this->mExtra); @@ -510,5 +591,38 @@ class RecentChange return $fullString; } + /** + * Returns the change size (HTML). + * The lengths can be given optionally. + */ + function getCharacterDifference( $old = 0, $new = 0 ) { + global $wgRCChangedSizeThreshold, $wgLang; + + if( $old === 0 ) { + $old = $this->mAttribs['rc_old_len']; + } + if( $new === 0 ) { + $new = $this->mAttribs['rc_new_len']; + } + + if( $old === NULL || $new === NULL ) { + return ''; + } + + $szdiff = $new - $old; + $formatedSize = wfMsgExt( 'rc-change-size', array( 'parsemag', 'escape'), + $wgLang->formatNum($szdiff) ); + + if( $szdiff < $wgRCChangedSizeThreshold ) { + return '(' . $formatedSize . ')'; + } elseif( $szdiff === 0 ) { + return '(' . $formatedSize . ')'; + } elseif( $szdiff > 0 ) { + return '(+' . $formatedSize . ')'; + } else { + return '(' . $formatedSize . ')'; + } + } } -?> + +