X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FRecentChange.php;h=c22c9ea5a5826900a57fafd3e302e56d1db2f436;hb=399956f4209406fa49898022e34a9741d2c7035f;hp=63fdcce71f1af953b2afccc51cfca1705f2a6b97;hpb=3d8659162d5fb203ffe3beddb7119a6496701256;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/RecentChange.php b/includes/RecentChange.php index 63fdcce71f..c22c9ea5a5 100644 --- a/includes/RecentChange.php +++ b/includes/RecentChange.php @@ -1,8 +1,4 @@ loadFromRow( $row ); return $rc; } - public static function newFromCurRow( $row, $rc_this_oldid = 0 ) + public static function newFromCurRow( $row ) { $rc = new RecentChange; - $rc->loadFromCurRow( $row, $rc_this_oldid ); + $rc->loadFromCurRow( $row ); $rc->notificationtimestamp = false; $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 function setAttribs( $attribs ) @@ -97,10 +140,11 @@ class RecentChange # Writes the data in this object to the database function save() { - global $wgLocalInterwiki, $wgPutIPinRC, $wgRC2UDPAddress, $wgRC2UDPPort, $wgRC2UDPPrefix; + global $wgLocalInterwiki, $wgPutIPinRC, $wgRC2UDPAddress, + $wgRC2UDPPort, $wgRC2UDPPrefix, $wgRC2UDPOmitBots; $fname = 'RecentChange::save'; - $dbw =& wfGetDB( DB_MASTER ); + $dbw = wfGetDB( DB_MASTER ); if ( !is_array($this->mExtra) ) { $this->mExtra = array(); } @@ -166,7 +210,7 @@ class RecentChange } # Notify external application via UDP - if ( $wgRC2UDPAddress ) { + if ( $wgRC2UDPAddress && ( !$this->mAttribs['rc_bot'] || !$wgRC2UDPOmitBots ) ) { $conn = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP ); if ( $conn ) { $line = $wgRC2UDPPrefix . $this->getIRCLine(); @@ -176,13 +220,21 @@ class RecentChange } # E-mail notifications - global $wgUseEnotif; - if( $wgUseEnotif ) { - # this would be better as an extension hook - include_once( "UserMailer.php" ); + global $wgUseEnotif, $wgShowUpdatedMarker, $wgUser; + if( $wgUseEnotif || $wgShowUpdatedMarker ) { + // Users + if( $this->mAttribs['rc_user'] ) { + $editor = ($wgUser->getId() == $this->mAttribs['rc_user']) ? + $wgUser : User::newFromID( $this->mAttribs['rc_user'] ); + // Anons + } else { + $editor = ($wgUser->getName() == $this->mAttribs['rc_user_text']) ? + $wgUser : User::newFromName( $this->mAttribs['rc_user_text'], false ); + } + # FIXME: this would be better as an extension hook $enotif = new EmailNotification(); $title = Title::makeTitle( $this->mAttribs['rc_namespace'], $this->mAttribs['rc_title'] ); - $enotif->notifyOnPageChange( $title, + $enotif->notifyOnPageChange( $editor, $title, $this->mAttribs['rc_timestamp'], $this->mAttribs['rc_comment'], $this->mAttribs['rc_minor'], @@ -193,32 +245,79 @@ class RecentChange 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 + * @return See doMarkPatrolled(), or null if $change is not an existing rc_id + */ + public static function markPatrolled( $change ) { + $change = $change instanceof RecentChange + ? $change + : RecentChange::newFromId($change); + if(!$change instanceof RecentChange) + return null; + return $change->doMarkPatrolled(); + } + + /** + * Mark this RecentChange as patrolled + * + * NOTE: Can also return 'rcpatroldisabled', 'hookaborted' and 'markedaspatrollederror-noautopatrol' as errors + * @return array of permissions errors, see Title::getUserPermissionsErrors() + */ + public function doMarkPatrolled() { + global $wgUser, $wgUseRCPatrol, $wgUseNPPatrol; + $errors = array(); + // If recentchanges patrol is disabled, only new pages + // can be patrolled + if(!$wgUseRCPatrol && (!$wgUseNPPatrol || $this->getAttribute('rc_type') != RC_NEW)) + $errors[] = array('rcpatroldisabled'); + $errors = array_merge($errors, $this->getTitle()->getUserPermissionsErrors('patrol', $wgUser)); + if(!wfRunHooks('MarkPatrolled', array($this->getAttribute('rc_id'), &$wgUser, false))) + $errors[] = array('hookaborted'); + // Users without the 'autopatrol' right can't patrol their + // own revisions + if($wgUser->getName() == $this->getAttribute('rc_user_text') && + !$wgUser->isAllowed('autopatrol')) + $errors[] = array('markedaspatrollederror-noautopatrol'); + if(!empty($errors)) + return $errors; + + // If the change was patrolled already, do nothing + if($this->getAttribute('rc_patrolled')) + return array(); + $this->reallyMarkPatrolled(); + PatrolLog::record($this); + wfRunHooks('MarkPatrolledComplete', + array($this->getAttribute('rc_id'), &$wgUser, false)); + return array(); + } + + /** + * Mark this RecentChange patrolled, without error checking + * @return int Number of affected rows + */ + public function reallyMarkPatrolled() { + $dbw = wfGetDB( DB_MASTER ); + $dbw->update( + 'recentchanges', + array( 'rc_patrolled' => 1 - ), array( /* WHERE */ - 'rc_id' => $rcid - ), $fname + ), + array( + 'rc_id' => $this->getAttribute('rc_id') + ), + __METHOD__ ); + return $dbw->affectedRows(); } # Makes an entry in the database corresponding to an edit - /*static*/ function notifyEdit( $timestamp, &$title, $minor, &$user, $comment, - $oldId, $lastTimestamp, $bot = "default", $ip = '', $oldSize = 0, $newSize = 0, + public static function notifyEdit( $timestamp, &$title, $minor, &$user, $comment, + $oldId, $lastTimestamp, $bot, $ip = '', $oldSize = 0, $newSize = 0, $newId = 0) { - - if ( $bot === 'default' ) { - $bot = $user->isAllowed( 'bot' ); - } - if ( !$ip ) { $ip = wfGetIP(); if ( !$ip ) { @@ -235,7 +334,7 @@ class RecentChange 'rc_type' => RC_EDIT, 'rc_minor' => $minor ? 1 : 0, 'rc_cur_id' => $title->getArticleID(), - 'rc_user' => $user->getID(), + 'rc_user' => $user->getId(), 'rc_user_text' => $user->getName(), 'rc_comment' => $comment, 'rc_this_oldid' => $newId, @@ -247,7 +346,12 @@ class RecentChange 'rc_patrolled' => 0, 'rc_new' => 0, # obsolete 'rc_old_len' => $oldSize, - 'rc_new_len' => $newSize + 'rc_new_len' => $newSize, + 'rc_deleted' => 0, + 'rc_logid' => 0, + 'rc_log_type' => null, + 'rc_log_action' => '', + 'rc_params' => '' ); $rc->mExtra = array( @@ -264,10 +368,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, $ip='', $size = 0, $newId = 0 ) { if ( !$ip ) { @@ -276,9 +378,6 @@ class RecentChange $ip = ''; } } - if ( $bot == 'default' ) { - $bot = $user->isAllowed( 'bot' ); - } $rc = new RecentChange; $rc->mAttribs = array( @@ -289,7 +388,7 @@ class RecentChange 'rc_type' => RC_NEW, 'rc_minor' => $minor ? 1 : 0, 'rc_cur_id' => $title->getArticleID(), - 'rc_user' => $user->getID(), + 'rc_user' => $user->getId(), 'rc_user_text' => $user->getName(), 'rc_comment' => $comment, 'rc_this_oldid' => $newId, @@ -299,9 +398,14 @@ 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_new_len' => $size, + 'rc_deleted' => 0, + 'rc_logid' => 0, + 'rc_log_type' => null, + 'rc_log_action' => '', + 'rc_params' => '' ); $rc->mExtra = array( @@ -315,8 +419,10 @@ 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 ) { + global $wgRequest; + if ( !$ip ) { $ip = wfGetIP(); if ( !$ip ) { @@ -333,12 +439,12 @@ class RecentChange 'rc_type' => $overRedir ? RC_MOVE_OVER_REDIRECT : RC_MOVE, 'rc_minor' => 0, 'rc_cur_id' => $oldTitle->getArticleID(), - 'rc_user' => $user->getID(), + 'rc_user' => $user->getId(), 'rc_user_text' => $user->getName(), 'rc_comment' => $comment, 'rc_this_oldid' => 0, 'rc_last_oldid' => 0, - 'rc_bot' => $user->isAllowed( 'bot' ) ? 1 : 0, + 'rc_bot' => $user->isAllowed( 'bot' ) ? $wgRequest->getBool( 'bot' , true ) : 0, 'rc_moved_to_ns' => $newTitle->getNamespace(), 'rc_moved_to_title' => $newTitle->getDBkey(), 'rc_ip' => $ip, @@ -346,6 +452,11 @@ class RecentChange 'rc_patrolled' => 1, 'rc_old_len' => NULL, 'rc_new_len' => NULL, + 'rc_deleted' => 0, + 'rc_logid' => 0, # notifyMove not used anymore + 'rc_log_type' => null, + 'rc_log_action' => '', + 'rc_params' => '' ); $rc->mExtra = array( @@ -356,19 +467,19 @@ 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='', - $type, $action, $target, $logComment, $params ) + public static function notifyLog( $timestamp, &$title, &$user, $actionComment, $ip='', + $type, $action, $target, $logComment, $params, $newId=0 ) { + global $wgRequest; + if ( !$ip ) { $ip = wfGetIP(); if ( !$ip ) { @@ -380,17 +491,17 @@ class RecentChange $rc->mAttribs = array( 'rc_timestamp' => $timestamp, 'rc_cur_time' => $timestamp, - 'rc_namespace' => $title->getNamespace(), - 'rc_title' => $title->getDBkey(), + 'rc_namespace' => $target->getNamespace(), + 'rc_title' => $target->getDBkey(), 'rc_type' => RC_LOG, 'rc_minor' => 0, - 'rc_cur_id' => $title->getArticleID(), - 'rc_user' => $user->getID(), + 'rc_cur_id' => $target->getArticleID(), + 'rc_user' => $user->getId(), 'rc_user_text' => $user->getName(), - 'rc_comment' => $comment, + 'rc_comment' => $logComment, 'rc_this_oldid' => 0, 'rc_last_oldid' => 0, - 'rc_bot' => $user->isAllowed( 'bot' ) ? 1 : 0, + 'rc_bot' => $user->isAllowed( 'bot' ) ? $wgRequest->getBool( 'bot' , true ) : 0, 'rc_moved_to_ns' => 0, 'rc_moved_to_title' => '', 'rc_ip' => $ip, @@ -398,15 +509,16 @@ class RecentChange 'rc_new' => 0, # obsolete 'rc_old_len' => NULL, 'rc_new_len' => NULL, + 'rc_deleted' => 0, + 'rc_logid' => $newId, + 'rc_log_type' => $type, + 'rc_log_action' => $action, + 'rc_params' => $params ); $rc->mExtra = array( 'prefixedDBkey' => $title->getPrefixedDBkey(), 'lastTimestamp' => 0, - 'logType' => $type, - 'logAction' => $action, - 'logComment' => $logComment, - 'logTarget' => $target, - 'logParams' => $params + 'actionComment' => $actionComment, // the comment appended to the action, passed from LogPage ); $rc->save(); } @@ -419,7 +531,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( @@ -442,13 +554,28 @@ class RecentChange 'rc_id' => $row->rc_id, 'rc_patrolled' => $row->rc_patrolled, 'rc_new' => $row->page_is_new, # obsolete - 'rc_old_len' => NULL, # we can't get the text lengts from a cur row - 'rc_new_len' => NULL, + 'rc_old_len' => $row->rc_old_len, + 'rc_new_len' => $row->rc_new_len, + 'rc_params' => isset($row->rc_params) ? $row->rc_params : '', + 'rc_log_type' => isset($row->rc_log_type) ? $row->rc_log_type : null, + 'rc_log_action' => isset($row->rc_log_action) ? $row->rc_log_action : null, + 'rc_log_id' => isset($row->rc_log_id) ? $row->rc_log_id: 0, + // this one REALLY should be set... + 'rc_deleted' => isset($row->rc_deleted) ? $row->rc_deleted: 0, ); $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 @@ -477,21 +604,18 @@ 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); - $titleObj =& $this->getTitle(); if ( $rc_type == RC_LOG ) { - $title = Namespace::getCanonicalName( $titleObj->getNamespace() ) . $titleObj->getText(); + $titleObj = Title::newFromText( "Log/$rc_log_type", NS_SPECIAL ); } else { - $title = $titleObj->getPrefixedText(); + $titleObj =& $this->getTitle(); } - $title = $this->cleanupForIRC( $title ); - - $bad = array("\n", "\r"); - $empty = array("", ""); $title = $titleObj->getPrefixedText(); - $title = str_replace($bad, $empty, $title); + $title = $this->cleanupForIRC( $title ); // FIXME: *HACK* these should be getFullURL(), hacked for SSL madness --brion 2005-12-26 if ( $rc_type == RC_LOG ) { @@ -521,12 +645,12 @@ class RecentChange $user = $this->cleanupForIRC( $rc_user_text ); if ( $rc_type == RC_LOG ) { - $logTargetText = $logTarget->getPrefixedText(); - $comment = $this->cleanupForIRC( str_replace( $logTargetText, "\00302$logTargetText\00310", $rc_comment ) ); - $flag = $logAction; + $logTargetText = $this->getTitle()->getPrefixedText(); + $comment = $this->cleanupForIRC( str_replace($logTargetText,"\00302$logTargetText\00310",$actionComment) ); + $flag = $rc_log_action; } else { $comment = $this->cleanupForIRC( $rc_comment ); - $flag = ($rc_minor ? "M" : "") . ($rc_new ? "N" : ""); + $flag = ($rc_new ? "N" : "") . ($rc_minor ? "M" : "") . ($rc_bot ? "B" : ""); } # see http://www.irssi.org/documentation/formats for some colour codes. prefix is \003, # no colour (\003) switches back to the term default @@ -554,18 +678,17 @@ class RecentChange } $szdiff = $new - $old; + $formatedSize = wfMsgExt( 'rc-change-size', array( 'parsemag', 'escape'), + $wgLang->formatNum($szdiff) ); if( $szdiff < $wgRCChangedSizeThreshold ) { - // workaround to make it show a minus char instead of a dash. formatNum() doesn't do that. - return '(−' . $wgLang->formatNum( abs( $szdiff ) ) . ')'; + return '(' . $formatedSize . ')'; } elseif( $szdiff === 0 ) { - return '(' . $wgLang->formatNum( $szdiff ) . ')'; + return '(' . $formatedSize . ')'; } elseif( $szdiff > 0 ) { - return '(+' . $wgLang->formatNum( $szdiff ) . ')'; + return '(+' . $formatedSize . ')'; } else { - // same workaround. - return '(−' . $wgLang->formatNum( abs( $szdiff ) ) . ')'; + return '(' . $formatedSize . ')'; } } } -?>