getTitle(), $this->getUser() ); return true; } protected function checkCanExecute( User $user ) { // Must be logged in if ( $user->isAnon() ) { throw new UserNotLoggedIn( 'watchlistanontext', 'watchnologin' ); } parent::checkCanExecute( $user ); } protected function usesOOUI() { return true; } protected function getFormFields() { return [ 'intro' => [ 'type' => 'info', 'vertical-label' => true, 'raw' => true, 'default' => $this->msg( 'confirm-watch-top' )->parse() ] ]; } protected function alterForm( HTMLForm $form ) { $form->setWrapperLegendMsg( 'addwatch' ); $form->setSubmitTextMsg( 'confirm-watch-button' ); $form->setTokenSalt( 'watch' ); } public function onSuccess() { $msgKey = $this->getTitle()->isTalkPage() ? 'addedwatchtext-talk' : 'addedwatchtext'; $this->getOutput()->addWikiMsg( $msgKey, $this->getTitle()->getPrefixedText() ); } /** * Watch or unwatch a page * @since 1.22 * @param bool $watch Whether to watch or unwatch the page * @param Title $title Page to watch/unwatch * @param User $user User who is watching/unwatching * @return Status */ public static function doWatchOrUnwatch( $watch, Title $title, User $user ) { if ( $user->isLoggedIn() && $user->isWatched( $title, User::IGNORE_USER_RIGHTS ) != $watch ) { // If the user doesn't have 'editmywatchlist', we still want to // allow them to add but not remove items via edits and such. if ( $watch ) { return self::doWatch( $title, $user, User::IGNORE_USER_RIGHTS ); } else { return self::doUnwatch( $title, $user ); } } return Status::newGood(); } /** * Watch a page * @since 1.22 Returns Status, $checkRights parameter added * @param Title $title Page to watch/unwatch * @param User $user User who is watching/unwatching * @param bool $checkRights Passed through to $user->addWatch() * Pass User::CHECK_USER_RIGHTS or User::IGNORE_USER_RIGHTS. * @return Status */ public static function doWatch( Title $title, User $user, $checkRights = User::CHECK_USER_RIGHTS ) { if ( $checkRights && !$user->isAllowed( 'editmywatchlist' ) ) { return User::newFatalPermissionDeniedStatus( 'editmywatchlist' ); } $page = WikiPage::factory( $title ); $status = Status::newFatal( 'hookaborted' ); if ( Hooks::run( 'WatchArticle', [ &$user, &$page, &$status ] ) ) { $status = Status::newGood(); $user->addWatch( $title, $checkRights ); Hooks::run( 'WatchArticleComplete', [ &$user, &$page ] ); } return $status; } /** * Unwatch a page * @since 1.22 Returns Status * @param Title $title Page to watch/unwatch * @param User $user User who is watching/unwatching * @return Status */ public static function doUnwatch( Title $title, User $user ) { if ( !$user->isAllowed( 'editmywatchlist' ) ) { return User::newFatalPermissionDeniedStatus( 'editmywatchlist' ); } $page = WikiPage::factory( $title ); $status = Status::newFatal( 'hookaborted' ); if ( Hooks::run( 'UnwatchArticle', [ &$user, &$page, &$status ] ) ) { $status = Status::newGood(); $user->removeWatch( $title ); Hooks::run( 'UnwatchArticleComplete', [ &$user, &$page ] ); } return $status; } /** * Get token to watch (or unwatch) a page for a user * * @param Title $title Title object of page to watch * @param User $user User for whom the action is going to be performed * @param string $action Optionally override the action to 'unwatch' * @return string Token * @since 1.18 */ public static function getWatchToken( Title $title, User $user, $action = 'watch' ) { if ( $action != 'unwatch' ) { $action = 'watch'; } // Match ApiWatch and ResourceLoaderUserTokensModule return $user->getEditToken( $action ); } /** * Get token to unwatch (or watch) a page for a user * * @param Title $title Title object of page to unwatch * @param User $user User for whom the action is going to be performed * @param string $action Optionally override the action to 'watch' * @return string Token * @since 1.18 */ public static function getUnwatchToken( Title $title, User $user, $action = 'unwatch' ) { return self::getWatchToken( $title, $user, $action ); } public function doesWrites() { return true; } }