mediawiki-extensions-Echo/Hooks.php
Kaldari a46dc2a82d Put the Notifications link after the talk page link if we're using full link
Change-Id: Ifc3bb87575fd21b3f228cf1b8083a78939d7d529
2012-12-13 18:01:04 -08:00

349 lines
11 KiB
PHP

<?php
class EchoHooks {
/**
* @param $updater DatabaseUpdater object
* @return bool true in all cases
*/
public static function getSchemaUpdates( $updater ) {
$dir = __DIR__;
$baseSQLFile = "$dir/echo.sql";
$updater->addExtensionTable( 'echo_subscription', $baseSQLFile );
$updater->addExtensionTable( 'echo_email_batch', "$dir/db_patches/echo_email_batch.sql" );
$updater->modifyField( 'echo_event', 'event_agent',
"$dir/db_patches/patch-event_agent-split.sql", true );
$updater->modifyField( 'echo_event', 'event_variant',
"$dir/db_patches/patch-event_variant_nullability.sql", true );
$updater->modifyField( 'echo_event', 'event_extra',
"$dir/db_patches/patch-event_extra-size.sql", true );
return true;
}
/**
* Handler for EchoGetDefaultNotifiedUsers hook.
* @param $event EchoEvent to get implicitly subscribed users for
* @param &$users Array to append implicitly subscribed users to.
* @return bool true in all cases
*/
public static function getDefaultNotifiedUsers( $event, &$users ) {
switch ( $event->getType() ) {
// Everyone deserves to know when something happens
// on their user talk page
case 'edit-user-talk':
if ( !$event->getTitle() || !$event->getTitle()->getNamespace() == NS_USER_TALK ) {
break;
}
$username = $event->getTitle()->getText();
$user = User::newFromName( $username );
if ( $user && $user->getId() ) {
$users[$user->getId()] = $user;
}
break;
case 'add-comment':
case 'add-talkpage-topic':
// Handled by EchoDiscussionParser
$extraData = $event->getExtra();
if ( !isset( $extraData['revid'] ) || !$extraData['revid'] ) {
break;
}
$revision = Revision::newFromId( $extraData['revid'] );
$users = array_merge(
$users,
EchoDiscussionParser::getNotifiedUsersForComment( $revision )
);
break;
case 'welcome':
$users[$event->getAgent()->getId()] = $event->getAgent();
break;
case 'reverted':
$extra = $event->getExtra();
if ( !$extra || !isset( $extra['reverted-user-id'] ) ) {
break;
}
$victimID = $extra['reverted-user-id'];
$victim = User::newFromId( $victimID );
$users[$victim->getId()] = $victim;
break;
}
return true;
}
public static function getNotificationTypes( $subscription, $event, &$notifyTypes ) {
$type = $event->getType();
$user = $subscription->getUser();
// Figure out when to disallow email notifications
if ( $type == 'edit' ) {
if ( !$user->getOption( 'enotifwatchlistpages' ) ) {
$notifyTypes = array_diff( $notifyTypes, array( 'email' ) );
}
} elseif ( $type == 'edit-user-talk' ) {
if ( !$user->getOption( 'enotifusertalkpages' ) ) {
$notifyTypes = array_diff( $notifyTypes, array( 'email' ) );
}
}
if ( !$user->getOption( 'enotifminoredits' ) ) {
$extra = $event->getExtra();
if ( !empty( $extra['revid'] ) ) {
$rev = Revision::newFromID( $extra['revid'] );
if ( $rev->isMinor() ) {
$notifyTypes = array_diff( $notifyTypes, array( 'email' ) );
}
}
}
return true;
}
/**
* Handler for GetPreferences hook.
* @see http://www.mediawiki.org/wiki/Manual:Hooks/GetPreferences
* @param $user User to get preferences for
* @param &$preferences Preferences array
* @return bool true in all cases
*/
public static function getPreferences( $user, &$preferences ) {
global $wgEchoEnabledEvents;
$preferences['echo-notify-link'] = array(
'type' => 'toggle',
'label-message' => 'echo-pref-notify-link',
'section' => 'echo/displaynotifications',
);
return true;
}
/**
* Handler for ArticleSaveComplete hook
* @see http://www.mediawiki.org/wiki/Manual:Hooks/ArticleSaveComplete
* @param $article Article edited
* @param $user User who edited
* @param $text string New article text
* @param $summary string Edit summary
* @param $minoredit bool Minor edit or not
* @param $watchthis bool Watch this article?
* @param $sectionanchor string Section that was edited
* @param $flags int Edit flags
* @param $revision Revision that was created
* @param $status Status
* @return bool true in all cases
*/
public static function onArticleSaved( &$article, &$user, $text, $summary, $minoredit, $watchthis, $sectionanchor, &$flags, $revision, &$status ) {
global $wgEchoEnabledEvents;
if ( $revision ) {
EchoEvent::create( array(
'type' => 'edit',
'title' => $article->getTitle(),
'extra' => array( 'revid' => $revision->getID() ),
'agent' => $user,
) );
if ( $article->getTitle()->isTalkPage() ) {
EchoDiscussionParser::generateEventsForRevision( $revision );
}
// Handle the case of someone undoing an edit, either through the
// 'undo' link in the article history or via the API.
if ( in_array( 'reverted', $wgEchoEnabledEvents ) ) {
$undidRevId = $user->getRequest()->getVal( 'wpUndidRevision' );
if ( $undidRevId ) {
$undidRevision = Revision::newFromId( $undidRevId );
if ( $undidRevision ) {
$victimId = $undidRevision->getUser();
if ( $victimId ) { // No notifications for anonymous users
EchoEvent::create( array(
'type' => 'reverted',
'title' => $article->getTitle(),
'extra' => array(
'revid' => $revision->getId(),
'reverted-user-id' => $victimId,
'reverted-revision-id' => $undidRevId,
'method' => 'undo',
),
'agent' => $user,
) );
}
}
}
}
}
return true;
}
/**
* Handler for AddNewAccount hook.
* @see http://www.mediawiki.org/wiki/Manual:Hooks/AddNewAccount
* @param $user User object that was created.
* @param $byEmail bool True when account was created "by email".
* @return bool
*/
public static function onAccountCreated( $user, $byEmail ) {
EchoEvent::create( array(
'type' => 'welcome',
'agent' => $user,
) );
return true;
}
/**
* Handler for BeforePageDisplay hook.
* @see http://www.mediawiki.org/wiki/Manual:Hooks/BeforePageDisplay
* @param $out OutputPage object
* @param $skin Skin being used.
* @return bool true in all cases
*/
static function beforePageDisplay( $out, $skin ) {
$user = $out->getUser();
if ( $user->isLoggedIn() && $user->getOption( 'echo-notify-link' ) ) {
// Load the module for the Notifications flyout
$out->addModules( array( 'ext.echo.overlay' ) );
}
return true;
}
/**
* Handler for PersonalUrls hook.
* Add a "Notifications" item to the user toolbar ('personal URLs').
* @see http://www.mediawiki.org/wiki/Manual:Hooks/PersonalUrls
* @param &$personal_urls Array of URLs to append to.
* @param &$title Title of page being visited.
* @return bool true in all cases
*/
static function onPersonalUrls( &$personal_urls, &$title ) {
global $wgUser, $wgEchoShowFullNotificationsLink;
if ( $wgUser->isAnon() || !$wgUser->getOption( 'echo-notify-link' ) ) {
return true;
}
$notificationCount = EchoNotificationController::getNotificationCount( $wgUser );
if ( $wgEchoShowFullNotificationsLink ) {
// Add a "Notifications" item to personal URLs
$msg = wfMessage( $notificationCount == 0 ? 'echo-link' : 'echo-link-new' );
$text = $msg->params( EchoNotificationController::formatNotificationCount( $notificationCount ) )->text();
} else {
// Just add a number
$text = wfMessage( 'parentheses', $notificationCount )->plain();
}
$url = SpecialPage::getTitleFor( 'Notifications' )->getLocalURL();
$notificationsLink = array(
'href' => $url,
'text' => $text,
'active' => ( $url == $title->getLocalUrl() ),
);
$insertUrls = array( 'notifications' => $notificationsLink );
if ( $wgEchoShowFullNotificationsLink ) {
$personal_urls = wfArrayInsertAfter( $personal_urls, $insertUrls, 'mytalk' );
} else {
$personal_urls = wfArrayInsertAfter( $personal_urls, $insertUrls, 'userpage' );
}
return true;
}
/**
* Handler for AbortEmailNotification hook.
* @see http://www.mediawiki.org/wiki/Manual:Hooks/AbortEmailNotification
* @return bool true in all cases
*/
static function abortEmailNotification() {
global $wgEchoDisableStandardEmail;
return !$wgEchoDisableStandardEmail;
}
/**
* Handler for MakeGlobalVariablesScript hook.
* @see http://www.mediawiki.org/wiki/Manual:Hooks/MakeGlobalVariablesScript
* @param &$vars Variables to be added into the output
* @param $outputPage OutputPage instance calling the hook
* @return bool true in all cases
*/
public static function makeGlobalVariablesScript( &$vars, OutputPage $outputPage ) {
global $wgEchoShowFullNotificationsLink;
$user = $outputPage->getUser();
// Provide info for the Overlay
$timestamp = new MWTimestamp( wfTimestampNow() );
if ( ! $user->isAnon() ) {
$vars['wgEchoOverlayConfiguration'] = array(
'notifications-link-full' => $wgEchoShowFullNotificationsLink,
'timestamp' => $timestamp->getTimestamp( TS_UNIX ),
'notification-count' => EchoNotificationController::getFormattedNotificationCount( $user ),
);
}
return true;
}
/**
* Handler for UnitTestsList hook.
* @see http://www.mediawiki.org/wiki/Manual:Hooks/UnitTestsList
* @param &$files Array of unit test files
* @return bool true in all cases
*/
static function getUnitTests( &$files ) {
$dir = dirname( __FILE__ ) . '/tests';
$files[] = "$dir/DiscussionParserTest.php";
return true;
}
/**
* Handler for ArticleEditUpdateNewTalk hook.
* @see http://www.mediawiki.org/wiki/Manual:Hooks/ArticleEditUpdateNewTalk
* @param $article The article object of the talk page being updated
* @return bool
*/
static function abortNewTalkNotification( $article ) {
global $wgEchoEnabledEvents, $wgUser;
// If the user has the notifications flyout turned on and is receiving
// notifications for talk page messages, disable the yellow-bar-style notice.
if ( $wgUser->getOption( 'echo-notify-link' )
&& in_array( 'edit-user-talk', $wgEchoEnabledEvents ) )
{
return false;
} else {
return true;
}
}
/**
* Handler for ArticleRollbackComplete hook.
* @see http://www.mediawiki.org/wiki/Manual:Hooks/ArticleRollbackComplete
* @param $page The article that was edited
* @param $agent The user who did the rollback
* @param $newRevision The revision the page was reverted back to
* @param $oldRevision The revision of the top edit that was reverted
* @return bool true in all cases
*/
static function onRollbackComplete( $page, $agent, $newRevision, $oldRevision ) {
$victimId = $oldRevision->getUser();
if ( $victimId ) { // No notifications for anonymous users
EchoEvent::create( array(
'type' => 'reverted',
'title' => $page->getTitle(),
'extra' => array(
'revid' => $page->getRevision()->getId(),
'reverted-user-id' => $victimId,
'reverted-revision-id' => $oldRevision->getId(),
'method' => 'rollback',
),
'agent' => $agent,
) );
}
return true;
}
}