mediawiki-extensions-Discus.../includes/Hooks/EchoHooks.php
Bartosz Dziewoński 0b1919af0c Improve handling of Parsoid resource limit exceeded exceptions
Follow-up to 3d9585acbe.

* Avoid deprecated method StatusValue::getErrors()
* Don't use exceptions for control flow
* Don't re-use Parsoid's ResourceLimitExceededException,
  it seems unexpected to me and might limit future refactoring
* Use dieStatus() instead of dieWithException(), which will produce
  better localised error messages
* Add missing error handling in ApiDiscussionToolsThank

Change-Id: Ia032025f92f1c3cc0d62a0f45925dddba93fb42f
2024-11-28 04:09:44 +01:00

152 lines
4.8 KiB
PHP

<?php
/**
* DiscussionTools echo hooks
*
* @file
* @ingroup Extensions
* @license MIT
*/
namespace MediaWiki\Extension\DiscussionTools\Hooks;
use MediaWiki\Extension\DiscussionTools\Notifications\AddedTopicPresentationModel;
use MediaWiki\Extension\DiscussionTools\Notifications\CommentThanksPresentationModel;
use MediaWiki\Extension\DiscussionTools\Notifications\EnhancedEchoEditUserTalkPresentationModel;
use MediaWiki\Extension\DiscussionTools\Notifications\EnhancedEchoMentionPresentationModel;
use MediaWiki\Extension\DiscussionTools\Notifications\EventDispatcher;
use MediaWiki\Extension\DiscussionTools\Notifications\RemovedTopicPresentationModel;
use MediaWiki\Extension\DiscussionTools\Notifications\SubscribedNewCommentPresentationModel;
use MediaWiki\Extension\Notifications\Hooks\BeforeCreateEchoEventHook;
use MediaWiki\Extension\Notifications\Hooks\EchoGetBundleRulesHook;
use MediaWiki\Extension\Notifications\Hooks\EchoGetEventsForRevisionHook;
use MediaWiki\Extension\Notifications\Model\Event;
use MediaWiki\Extension\Notifications\UserLocator;
use MediaWiki\Registration\ExtensionRegistry;
use MediaWiki\Revision\RevisionRecord;
class EchoHooks implements
BeforeCreateEchoEventHook,
EchoGetBundleRulesHook,
EchoGetEventsForRevisionHook
{
/**
* Add notification events to Echo
*/
public function onBeforeCreateEchoEvent(
array &$notifications,
array &$notificationCategories,
array &$icons
) {
// The following messages are generated upstream
// * echo-category-title-dt-subscription
$notificationCategories['dt-subscription'] = [
'priority' => 3,
'tooltip' => 'echo-pref-tooltip-dt-subscription',
];
$notifications['dt-subscribed-new-comment'] = [
'category' => 'dt-subscription',
'group' => 'interactive',
'section' => 'message',
'user-locators' => [
[ [ EventDispatcher::class, 'locateSubscribedUsers' ] ]
],
// Exclude mentioned users and talk page owner from our notification, to avoid
// duplicate notifications for a single comment
'user-filters' => [
[
[ UserLocator::class, 'locateFromEventExtra' ],
[ 'mentioned-users' ]
],
[ [ UserLocator::class, 'locateTalkPageOwner' ] ],
],
'presentation-model' => SubscribedNewCommentPresentationModel::class,
'bundle' => [
'web' => true,
'email' => true,
'expandable' => true,
],
];
// The following messages are generated upstream
// * echo-category-title-dt-subscription-archiving
$notificationCategories['dt-subscription-archiving'] = [
'priority' => 3,
'tooltip' => 'echo-pref-tooltip-dt-subscription-archiving',
];
$notifications['dt-removed-topic'] = [
'category' => 'dt-subscription-archiving',
'group' => 'interactive',
'section' => 'message',
'user-locators' => [
[ [ EventDispatcher::class, 'locateSubscribedUsers' ] ]
],
'presentation-model' => RemovedTopicPresentationModel::class,
'bundle' => [
'web' => true,
'email' => true,
'expandable' => true,
],
];
$notifications['dt-added-topic'] = [
'category' => 'dt-subscription',
'group' => 'interactive',
'section' => 'message',
'user-locators' => [
[ [ EventDispatcher::class, 'locateSubscribedUsers' ] ]
],
'presentation-model' => AddedTopicPresentationModel::class,
'bundle' => [
'web' => true,
'email' => true,
'expandable' => true,
],
];
if ( ExtensionRegistry::getInstance()->isLoaded( 'Thanks' ) ) {
$notifications['dt-thank'] = [
'category' => 'edit-thank',
'group' => 'positive',
'section' => 'message',
'user-locators' => [
[
[ UserLocator::class, 'locateFromEventExtra' ],
[ 'thanked-user-id' ]
]
],
'presentation-model' => CommentThanksPresentationModel::class,
'bundle' => [
'web' => true,
'expandable' => true,
],
];
}
// Override default handlers
$notifications['edit-user-talk']['presentation-model'] = EnhancedEchoEditUserTalkPresentationModel::class;
$notifications['mention']['presentation-model'] = EnhancedEchoMentionPresentationModel::class;
}
public function onEchoGetBundleRules( Event $event, string &$bundleString ) {
switch ( $event->getType() ) {
case 'dt-subscribed-new-comment':
$bundleString = $event->getType() . '-' . $event->getExtraParam( 'subscribed-comment-name' );
break;
case 'dt-added-topic':
case 'dt-removed-topic':
$bundleString = $event->getType() . '-' . $event->getTitle()->getNamespace()
. '-' . $event->getTitle()->getDBkey();
break;
case 'dt-thank':
$bundleString = $event->getType() . '-' . $event->getExtraParam( 'comment-name' );
break;
}
}
public function onEchoGetEventsForRevision( array &$events, RevisionRecord $revision, bool $isRevert ) {
if ( $isRevert ) {
return;
}
EventDispatcher::generateEventsForRevision( $events, $revision );
}
}