44 PageRevisionUpdatedEvent::TYPE
55 'class' => self::class,
63 'TalkPageNotificationManager',
66 'ContentHandlerFactory',
69 PageRevisionUpdatedEvent::TYPE
82 private bool $useRcPatrol;
83 private bool $rcWatchCategoryMembership;
98 $this->changeTagsStore = $changeTagsStore;
99 $this->userEditTracker = $userEditTracker;
100 $this->permissionManager = $permissionManager;
101 $this->wikiPageFactory = $wikiPageFactory;
102 $this->hookRunner =
new HookRunner( $hookContainer );
103 $this->userNameUtils = $userNameUtils;
104 $this->talkPageNotificationManager = $talkPageNotificationManager;
105 $this->jobQueueGroup = $jobQueueGroup;
106 $this->contentHandlerFactory = $contentHandlerFactory;
109 $this->rcWatchCategoryMembership = $mainConfig->
get(
133 $talkPageNotificationManager,
136 $contentHandlerFactory
138 $ingress->initSubscriber( self::OBJECT_SPEC );
163 $this->updateRecentChangesAfterPageUpdated(
171 } elseif ( $event->
getTags() ) {
172 $this->updateChangeTagsAfterPageUpdated(
179 $this->generateCategoryMembershipChanges( $event );
182 $this->updateUserEditTrackerAfterPageUpdated(
186 $this->updateNewTalkAfterPageUpdated( $event );
191 $this->updateRevertTagAfterPageUpdated( $event );
203 if ( $this->rcWatchCategoryMembership
205 && $this->anyChangedSlotSupportsCategories( $event )
210 $this->jobQueueGroup->lazyPush(
214 $event->
hasCause( PageRevisionUpdatedEvent::CAUSE_IMPORT )
225 private function anyChangedSlotSupportsCategories( PageRevisionUpdatedEvent $event ): bool {
226 $slotsUpdate = $event->getSlotsUpdate();
227 foreach ( $slotsUpdate->getModifiedRoles() as $role ) {
228 $model = $slotsUpdate->getModifiedSlot( $role )->getModel();
230 if ( $this->contentHandlerFactory->getContentHandler( $model )->supportsCategories() ) {
238 private function updateChangeTagsAfterPageUpdated( array $tags,
int $revId ) {
239 $this->changeTagsStore->addTags( $tags,
null, $revId );
242 private function updateRecentChangesAfterPageUpdated(
243 RevisionRecord $newRevisionRecord,
244 ?RevisionRecord $oldRevisionRecord,
248 ?EditResult $editResult
251 if ( !$oldRevisionRecord ) {
252 RecentChange::notifyNew(
253 $newRevisionRecord->getTimestamp(),
254 $newRevisionRecord->getPage(),
255 $newRevisionRecord->isMinor(),
256 $newRevisionRecord->getUser( RevisionRecord::RAW ),
257 $newRevisionRecord->getComment( RevisionRecord::RAW )->text,
260 $newRevisionRecord->getSize(),
261 $newRevisionRecord->getId(),
267 RecentChange::notifyEdit(
268 $newRevisionRecord->getTimestamp(),
269 $newRevisionRecord->getPage(),
270 $newRevisionRecord->isMinor(),
271 $newRevisionRecord->getUser( RevisionRecord::RAW ),
272 $newRevisionRecord->getComment( RevisionRecord::RAW )->text,
273 $oldRevisionRecord->getId(),
274 $newRevisionRecord->getTimestamp(),
277 $oldRevisionRecord->getSize(),
278 $newRevisionRecord->getSize(),
279 $newRevisionRecord->getId(),
287 private function updateUserEditTrackerAfterPageUpdated( UserIdentity $author ) {
288 $this->userEditTracker->incrementUserEditCount( $author );
296 private function updateNewTalkAfterPageUpdated( PageRevisionUpdatedEvent $event ) {
300 $page = $event->getPage();
301 $revRecord = $event->getLatestRevisionAfter();
302 $recipientName = $page->getDBkey();
303 $recipientName = $this->userNameUtils->isIP( $recipientName )
305 : $this->userNameUtils->getCanonical( $page->getDBkey() );
308 && !( $revRecord->isMinor()
309 && $this->permissionManager->userHasRight(
310 $event->getAuthor(),
'nominornewtalk' ) )
311 && $recipientName != $event->getAuthor()->getName()
313 $recipient = User::newFromName( $recipientName,
false );
315 wfDebug( __METHOD__ .
": invalid username" );
317 $wikiPage = $this->wikiPageFactory->newFromTitle( $page );
321 if ( $this->hookRunner->onArticleEditUpdateNewTalk( $wikiPage, $recipient ) ) {
322 if ( $this->userNameUtils->isIP( $recipientName ) ) {
324 $this->talkPageNotificationManager->setUserHasNewMessages( $recipient, $revRecord );
325 } elseif ( $recipient->isRegistered() ) {
326 $this->talkPageNotificationManager->setUserHasNewMessages( $recipient, $revRecord );
328 wfDebug( __METHOD__ .
": don't need to notify a nonexistent user" );
335 private function updateRevertTagAfterPageUpdated( PageRevisionUpdatedEvent $event ) {
336 $patrolStatus = $event->getPatrolStatus();
337 $wikiPage = $this->wikiPageFactory->newFromTitle( $event->getPage() );
342 $approved = !$this->useRcPatrol ||
343 $patrolStatus === RecentChange::PRC_PATROLLED ||
344 $patrolStatus === RecentChange::PRC_AUTOPATROLLED;
346 $editResult = $event->getEditResult();
348 if ( !$editResult ) {
350 throw new LogicException(
'Missing EditResult in revert' );
353 $revisionRecord = $event->getLatestRevisionAfter();
356 $this->hookRunner->onBeforeRevertedTagUpdate(
359 $revisionRecord->getComment( RevisionRecord::RAW ),
360 self::getEditFlags( $event ),
369 $this->jobQueueGroup->lazyPush(
370 RevertedTagUpdateJob::newSpec(
371 $revisionRecord->getId(),