summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'Echo/Echo.php')
-rw-r--r--Echo/Echo.php472
1 files changed, 472 insertions, 0 deletions
diff --git a/Echo/Echo.php b/Echo/Echo.php
new file mode 100644
index 00000000..083ad353
--- /dev/null
+++ b/Echo/Echo.php
@@ -0,0 +1,472 @@
+<?php
+/**
+ * MediaWiki Extension: Echo
+ * http://www.mediawiki.org/wiki/Extension:Echo
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * This program is distributed WITHOUT ANY WARRANTY.
+ */
+
+/**
+ *
+ * @file
+ * @ingroup Extensions
+ * @author Andrew Garrett, Benny Situ, Ryan Kaldari, Erik Bernhardson
+ * @licence MIT License
+ */
+
+# Alert the user that this is not a valid entry point to MediaWiki if they try to access the special pages file directly.
+if ( !defined( 'MEDIAWIKI' ) ) {
+ echo <<<EOT
+To install this extension, put the following line in LocalSettings.php:
+require_once( "$IP/extensions/Echo/Echo.php" );
+EOT;
+ exit( 1 );
+}
+
+// Extension credits that will show up on Special:Version
+$wgExtensionCredits['specialpage'][] = array(
+ 'path' => __FILE__,
+ 'name' => 'Echo',
+ 'url' => 'https://www.mediawiki.org/wiki/Extension:Echo',
+ 'author' => array( 'Andrew Garrett', 'Ryan Kaldari', 'Benny Situ', 'Luke Welling' ),
+ 'descriptionmsg' => 'echo-desc',
+ 'license-name' => 'MIT',
+);
+
+$dir = dirname( __FILE__ ) . '/';
+$wgMessagesDirs['Echo'] = __DIR__ . '/i18n';
+$wgExtensionMessagesFiles['EchoAliases'] = $dir . 'Echo.alias.php';
+
+// This file is autogenerated by scripts/gen-autoload.php
+require __DIR__ . "/autoload.php";
+
+// Queable jobs
+$wgJobClasses['EchoNotificationJob'] = 'EchoNotificationJob';
+$wgJobClasses['MWEchoNotificationEmailBundleJob'] = 'MWEchoNotificationEmailBundleJob';
+// Job to delete older notifications
+$wgJobClasses['EchoNotificationDeleteJob'] = 'EchoNotificationDeleteJob';
+
+// API
+$wgAPIMetaModules['notifications'] = 'ApiEchoNotifications';
+$wgAPIModules['echomarkread'] = 'ApiEchoMarkRead';
+
+// Special page
+$wgSpecialPages['Notifications'] = 'SpecialNotifications';
+$wgSpecialPageGroups['Notifications'] = 'users';
+
+// Housekeeping hooks
+$wgHooks['LoadExtensionSchemaUpdates'][] = 'EchoHooks::getSchemaUpdates';
+$wgHooks['GetPreferences'][] = 'EchoHooks::getPreferences';
+$wgHooks['PersonalUrls'][] = 'EchoHooks::onPersonalUrls';
+$wgHooks['BeforePageDisplay'][] = 'EchoHooks::beforePageDisplay';
+$wgHooks['MakeGlobalVariablesScript'][] = 'EchoHooks::makeGlobalVariablesScript';
+$wgHooks['UnitTestsList'][] = 'EchoHooks::getUnitTests';
+$wgHooks['ResourceLoaderRegisterModules'][] = 'EchoHooks::onResourceLoaderRegisterModules';
+$wgHooks['ResourceLoaderTestModules'][] = 'EchoHooks::onResourceLoaderTestModules';
+$wgHooks['UserRights'][] = 'EchoHooks::onUserRights';
+$wgHooks['UserLoadOptions'][] = 'EchoHooks::onUserLoadOptions';
+$wgHooks['UserSaveOptions'][] = 'EchoHooks::onUserSaveOptions';
+$wgHooks['UserClearNewTalkNotification'][] = 'EchoHooks::onUserClearNewTalkNotification';
+$wgHooks['ParserTestTables'][] = 'EchoHooks::onParserTestTables';
+
+// Extension:UserMerge support
+$wgHooks['UserMergeAccountFields'][] = 'EchoHooks::onUserMergeAccountFields';
+$wgHooks['MergeAccountFromTo'][] = 'EchoHooks::onMergeAccountFromTo';
+$wgHooks['UserMergeAccountDeleteTables'][] = 'EchoHooks::onUserMergeAccountDeleteTables';
+
+// Extension initialization
+$wgExtensionFunctions[] = 'EchoHooks::initEchoExtension';
+
+include __DIR__ . '/Resources.php';
+
+/**
+ * This Echo hook can be used to define users who are by default interested in
+ * certain events.
+ * For example, it can be used to say that users are by default interested in
+ * their own user talk page being edited. In fact, that is what it is used for
+ * internally.
+ */
+$wgHooks['EchoGetDefaultNotifiedUsers'][] = 'EchoHooks::getDefaultNotifiedUsers';
+$wgHooks['EchoGetNotificationTypes'][] = 'EchoHooks::getNotificationTypes';
+$wgHooks['EchoGetBundleRules'][] = 'EchoHooks::onEchoGetBundleRules';
+$wgHooks['EchoAbortEmailNotification'][] = 'EchoHooks::onEchoAbortEmailNotification';
+$wgHooks['EchoCreateNotificationComplete'][] = 'EchoHooks::onEchoCreateNotificationComplete';
+
+// Hook appropriate events
+$wgHooks['ArticleSaveComplete'][] = 'EchoHooks::onArticleSaved';
+$wgHooks['AddNewAccount'][] = 'EchoHooks::onAccountCreated';
+$wgHooks['ArticleRollbackComplete'][] = 'EchoHooks::onRollbackComplete';
+$wgHooks['UserSaveSettings'][] = 'EchoHooks::onUserSaveSettings';
+
+// Disable ordinary user talk page email notifications
+$wgHooks['AbortTalkPageEmailNotification'][] = 'EchoHooks::onAbortTalkPageEmailNotification';
+$wgHooks['SendWatchlistEmailNotification'][] = 'EchoHooks::onSendWatchlistEmailNotification';
+// Disable the yellow bar of death
+$wgHooks['GetNewMessagesAlert'][] = 'EchoHooks::abortNewMessagesAlert';
+$wgHooks['LinksUpdateAfterInsert'][] = 'EchoHooks::onLinksUpdateAfterInsert';
+
+// Configuration
+
+// The name of the backend to use for Echo email bundling and digest, it should
+// be always Db
+// @deprecated
+// @todo remove it from code base
+$wgEchoBackendName = 'Db';
+
+// Whether to turn on email batch function
+$wgEchoEnableEmailBatch = true;
+
+// URL for more information about the Echo notification system
+$wgEchoHelpPage = '//www.mediawiki.org/wiki/Special:MyLanguage/Help:Notifications';
+
+// Whether to use job queue to process web and email notifications, bypass the queue for now
+// since it's taking more than an hour to run in mediawiki.org, this is not acceptable for the
+// purpose of testing notification.
+// Todo - Abstract this into classes like: JobQueueNone, JobQueueMySQL, JobQueueRedis
+$wgEchoUseJobQueue = false;
+
+// The organization address, the value should be defined in LocalSettings.php
+$wgEchoEmailFooterAddress = '';
+
+// The email address for both "from" and "reply to" on email notifications.
+// Should be defined in LocalSettings.php
+$wgNotificationSender = $wgPasswordSender;
+// Name for "from" on email notifications. Should be defined in LocalSettings.php
+// if null, uses 'emailsender' message
+$wgNotificationSenderName = null;
+// Name for "reply to" on email notifications. Should be defined in LocalSettings.php
+$wgNotificationReplyName = 'No Reply';
+
+// Use the main db if this is set to false, to use a specific external db, just
+// use any key defined in $wgExternalServers
+$wgEchoCluster = false;
+
+// The max notification count showed in badge
+// The max number showed in bundled message, eg, <user> and 99+ others <action>
+$wgEchoMaxNotificationCount = 99;
+
+// The max number of notifications allowed for a user to do a live update,
+// this is also the number of max notifications allowed for a user to have
+// @FIXME - the name is not intuitive, probably change it when the deleteJob patch
+// is deployed to both deployment branches
+$wgEchoMaxUpdateCount = 2000;
+
+// The time interval between each bundle email in seconds
+// set a small number for test wikis, should set this to 0 to disable email bundling
+// if there is no delay queue support
+$wgEchoBundleEmailInterval = 0;
+
+// Whether or not to enable a new talk page message alert for logged in users
+$wgEchoNewMsgAlert = true;
+
+// Cohort study period. This array should consist of 3 TS_MW format timestamps
+// in ascending order, the 1st one is when the bucketing and study start, the 2nd
+// one is when the bucketing ends, the 3rd one is when the study ends. Set this
+// to empty array to disable Cohort study, this should be defined in LocalSettings.php
+$wgEchoCohortInterval = array();
+
+// Define which output formats are available for each notification category
+$wgEchoDefaultNotificationTypes = array(
+ 'all' => array(
+ 'web' => true,
+ 'email' => true,
+ ),
+ // Only send web notification for welcome event
+ 'welcome' => array(
+ 'email' => false,
+ ),
+);
+
+// Definitions of the different types of notification delivery that are possible.
+// Each definition consists of a class name and a function name.
+// See also: EchoNotificationController class.
+$wgEchoNotifiers = array(
+ 'web' => array( 'EchoNotifier', 'notifyWithNotification' ), // web-based notification
+ 'email' => array( 'EchoNotifier', 'notifyWithEmail' ),
+);
+
+// List of usernames that will not trigger notification creation. This is initially
+// for bots that perform automated edits that are not important enough to regularly
+// spam people with notifications. Set to empty array when not in use.
+$wgEchoAgentBlacklist = array();
+
+// Page location of community maintained blacklist within NS_MEDIAWIKI. Set to null to disable.
+$wgEchoOnWikiBlacklist = 'Echo-blacklist';
+
+// sprintf format of per-user notification agent whitelists. Set to null to disable.
+$wgEchoPerUserWhitelistFormat = '%s/Echo-whitelist';
+
+// Define the categories that notifications can belong to. Categories can be
+// assigned the following parameters: priority, nodismiss, tooltip, and usergroups.
+// All parameters are optional.
+// If a notifications type doesn't have a category parameter, it is
+// automatically assigned to the 'other' category which is lowest priority and
+// has no preferences or dismissibility.
+// The priority parameter controls the order in which notifications are
+// displayed in preferences and batch emails. Priority ranges from 1 to 10. If
+// the priority is not specified, it defaults to 10, which is the lowest.
+// The usergroups param specifies an array of usergroups eligible to recieve the
+// notifications in the category. If no usergroups parameter is specified, all
+// groups are eligible.
+// The nodismiss parameter disables the dismissability of notifications in the
+// category. It can either be set to an array of output formats (see
+// $wgEchoNotifiers) or an array containing 'all'.
+$wgEchoNotificationCategories = array(
+ 'system' => array(
+ 'priority' => 9,
+ 'no-dismiss' => array( 'all' ),
+ ),
+ 'user-rights' => array( // bug 55337
+ 'priority' => 9,
+ 'tooltip' => 'echo-pref-tooltip-user-rights',
+ ),
+ 'other' => array(
+ 'no-dismiss' => array( 'all' ),
+ ),
+ 'edit-user-talk' => array(
+ 'priority' => 1,
+ 'no-dismiss' => array( 'web' ),
+ 'tooltip' => 'echo-pref-tooltip-edit-user-talk',
+ ),
+ 'reverted' => array(
+ 'priority' => 9,
+ 'tooltip' => 'echo-pref-tooltip-reverted',
+ ),
+ 'article-linked' => array(
+ 'priority' => 5,
+ 'tooltip' => 'echo-pref-tooltip-article-linked',
+ ),
+ 'mention' => array(
+ 'priority' => 4,
+ 'tooltip' => 'echo-pref-tooltip-mention',
+ ),
+);
+
+$echoIconPath = "Echo/modules/icons";
+
+// Defines icons, which are 30x30 images. This is passed to BeforeCreateEchoEvent so
+// extensions can define their own icons with the same structure. It is recommended that
+// extensions prefix their icon key. An example is myextension-name. This will help
+// avoid namespace conflicts.
+//
+// You can use either a path or a url, but not both.
+// The value of 'path' is relative to $wgExtensionAssetsPath.
+//
+// The value of 'url' should be a URL.
+//
+// You should customize the site icon URL, which is:
+// $wgEchoNotificationIcons['site']['url']
+$wgEchoNotificationIcons = array(
+ 'placeholder' => array(
+ 'path' => "$echoIconPath/Generic.png",
+ ),
+ 'trash' => array(
+ 'path' => "$echoIconPath/Deletion.png",
+ ),
+ 'chat' => array(
+ 'path' => "$echoIconPath/Talk.png",
+ ),
+ 'linked' => array(
+ 'path' => "$echoIconPath/CrossReferenced.png",
+ ),
+ 'featured' => array(
+ 'path' => "$echoIconPath/Featured.png",
+ ),
+ 'reviewed' => array(
+ 'path' => "$echoIconPath/Reviewed.png",
+ ),
+ 'tagged' => array(
+ 'path' => "$echoIconPath/ReviewedWithTags.png",
+ ),
+ 'revert' => array(
+ 'path' => "$echoIconPath/Revert.png",
+ ),
+ 'checkmark' => array(
+ 'path' => "$echoIconPath/Reviewed.png",
+ ),
+ 'gratitude' => array(
+ 'path' => "$echoIconPath/Gratitude.png",
+ ),
+ 'site' => array(
+ 'url' => false
+ ),
+);
+
+// Definitions of the notification event types built into Echo.
+// If formatter-class isn't specified, defaults to EchoBasicFormatter.
+$wgEchoNotifications = array(
+ 'welcome' => array(
+ 'user-locators' => array(
+ 'EchoUserLocator::locateEventAgent'
+ ),
+ 'category' => 'system',
+ 'group' => 'positive',
+ 'section' => 'alert',
+ 'title-message' => 'notification-new-user',
+ 'title-params' => array( 'agent' ),
+ 'icon' => 'site',
+ ),
+ 'edit-user-talk' => array(
+ 'user-locators' => array(
+ 'EchoUserLocator::locateTalkPageOwner',
+ ),
+ 'primary-link' => array( 'message' => 'notification-link-text-view-message', 'destination' => 'section' ),
+ 'secondary-link' => array( 'message' => 'notification-link-text-view-changes', 'destination' => 'diff' ),
+ 'category' => 'edit-user-talk',
+ 'group' => 'interactive',
+ 'section' => 'alert',
+ 'bundle' => array( 'web' => true, 'email' => false ),
+ 'formatter-class' => 'EchoEditUserTalkFormatter',
+ 'title-message' => 'notification-edit-talk-page2',
+ 'title-params' => array( 'agent', 'user', 'subject-anchor' ),
+ 'bundle-message' => 'notification-edit-talk-page-bundle',
+ 'bundle-params' => array( 'agent', 'user', 'agent-other-display', 'agent-other-count' ),
+ 'flyout-message' => 'notification-edit-talk-page-flyout2',
+ 'flyout-params' => array( 'agent', 'user', 'subject-anchor' ),
+ 'email-subject-message' => 'notification-edit-talk-page-email-subject2',
+ 'email-subject-params' => array( 'agent' ),
+ 'email-body-batch-message' => 'notification-edit-talk-page-email-batch-body2',
+ 'email-body-batch-params' => array( 'agent' ),
+ 'email-body-batch-bundle-message' => 'notification-edit-user-talk-email-batch-bundle-body',
+ 'email-body-batch-bundle-params' => array( 'agent', 'agent-other-display', 'agent-other-count' ),
+ 'icon' => 'chat',
+ ),
+ 'reverted' => array(
+ 'user-locators' => array(
+ array( 'EchoUserLocator::locateFromEventExtra', array( 'reverted-user-id' ) ),
+ ),
+ 'primary-link' => array( 'message' => 'notification-link-text-view-edit', 'destination' => 'diff' ),
+ 'category' => 'reverted',
+ 'group' => 'negative',
+ 'section' => 'alert',
+ 'formatter-class' => 'EchoEditFormatter',
+ 'title-message' => 'notification-reverted2',
+ 'title-params' => array( 'agent', 'title', 'difflink', 'number' ),
+ 'flyout-message' => 'notification-reverted-flyout2',
+ 'flyout-params' => array( 'agent', 'title', 'difflink', 'number' ),
+ 'email-subject-message' => 'notification-reverted-email-subject2',
+ 'email-subject-params' => array( 'agent', 'title', 'number' ),
+ 'email-body-batch-message' => 'notification-reverted-email-batch-body2',
+ 'email-body-batch-params' => array( 'agent', 'title', 'number' ),
+ 'icon' => 'revert',
+ ),
+ 'page-linked' => array(
+ 'user-locators' => array(
+ 'EchoUserLocator::locateArticleCreator',
+ ),
+ 'primary-link' => array( 'message' => 'notification-link-text-view-page', 'destination' => 'link-from-page' ),
+ 'category' => 'article-linked',
+ 'group' => 'neutral',
+ 'section' => 'alert',
+ 'bundle' => array( 'web' => true, 'email' => true ),
+ 'formatter-class' => 'EchoPageLinkFormatter',
+ 'title-message' => 'notification-page-linked',
+ 'title-params' => array( 'agent', 'title', 'link-from-page' ),
+ 'bundle-message' => 'notification-page-linked-bundle',
+ 'bundle-params' => array( 'agent', 'title', 'link-from-page', 'link-from-page-other-display', 'link-from-page-other-count' ),
+ 'flyout-message' => 'notification-page-linked-flyout',
+ 'flyout-params' => array( 'agent', 'title', 'link-from-page' ),
+ 'email-subject-message' => 'notification-page-linked-email-subject',
+ 'email-subject-params' => array(),
+ 'email-body-batch-message' => 'notification-page-linked-email-batch-body',
+ 'email-body-batch-params' => array( 'agent', 'title', 'link-from-page' ),
+ 'email-body-batch-bundle-message' => 'notification-page-linked-email-batch-bundle-body',
+ 'email-body-batch-bundle-params' => array( 'agent', 'title', 'link-from-page', 'link-from-page-other-display', 'link-from-page-other-count' ),
+ 'icon' => 'linked',
+ ),
+ 'mention' => array(
+ 'user-locators' => array(
+ array( 'EchoUserLocator::locateFromEventExtra', array( 'mentioned-users' ) ),
+ ),
+ 'primary-link' => array( 'message' => 'notification-link-text-view-mention', 'destination' => 'section' ),
+ 'secondary-link' => array( 'message' => 'notification-link-text-view-changes', 'destination' => 'diff' ),
+ 'category' => 'mention',
+ 'group' => 'interactive',
+ 'section' => 'alert',
+ 'formatter-class' => 'EchoMentionFormatter',
+ 'title-message' => 'notification-mention',
+ 'title-params' => array( 'agent', 'subject-anchor', 'title', 'section-title', 'main-title-text' ),
+ 'flyout-message' => 'notification-mention-flyout',
+ 'flyout-params' => array( 'agent', 'subject-anchor', 'title', 'section-title', 'main-title-text' ),
+ 'email-subject-message' => 'notification-mention-email-subject',
+ 'email-subject-params' => array( 'agent' ),
+ 'email-body-batch-message' => 'notification-mention-email-batch-body',
+ 'email-body-batch-params' => array( 'agent', 'title', 'section-title', 'main-title-text' ),
+ 'icon' => 'chat',
+ ),
+ 'user-rights' => array(
+ 'user-locators' => array(
+ array( 'EchoUserLocator::locateFromEventExtra', array( 'user' ) ),
+ ),
+ 'primary-link' => array( 'message' => 'echo-learn-more', 'destination' => 'user-rights-list' ),
+ 'category' => 'user-rights',
+ 'group' => 'neutral',
+ 'section' => 'alert',
+ 'formatter-class' => 'EchoUserRightsFormatter',
+ 'title-message' => 'notification-user-rights',
+ 'title-params' => array( 'agent', 'user-rights-list' ),
+ 'flyout-message' => 'notification-user-rights-flyout',
+ 'flyout-params' => array( 'agent', 'user-rights-list' ),
+ 'email-subject-message' => 'notification-user-rights-email-subject',
+ 'email-subject-params' => array(),
+ 'email-body-batch-message' => 'notification-user-rights-email-batch-body',
+ 'email-body-batch-params' => array( 'agent', 'user-rights-list' ),
+ 'icon' => 'site',
+ ),
+);
+
+// Enable notifications for all logged in users by default
+$wgDefaultUserOptions['echo-notify-show-link'] = true;
+
+// Enable new talk page messages alert for all logged in users by default
+$wgDefaultUserOptions['echo-show-alert'] = true;
+
+// By default, send emails for each notification as they come in
+$wgDefaultUserOptions['echo-email-frequency'] = 0; /*EchoHooks::EMAIL_IMMEDIATELY*/
+
+if ( $wgAllowHTMLEmail ) {
+ $wgDefaultUserOptions['echo-email-format'] = 'html'; /*EchoHooks::EMAIL_FORMAT_HTML*/
+} else {
+ $wgDefaultUserOptions['echo-email-format'] = 'plain-text'; /*EchoHooks::EMAIL_FORMAT_PLAIN_TEXT*/
+}
+
+// Set all of the events to notify by web but not email by default (won't affect events that don't email)
+foreach ( $wgEchoNotificationCategories as $category => $categoryData ) {
+ $wgDefaultUserOptions["echo-subscriptions-email-{$category}"] = false;
+ $wgDefaultUserOptions["echo-subscriptions-web-{$category}"] = true;
+}
+
+// most settings default to web on, email off, but override these
+$wgDefaultUserOptions['echo-subscriptions-email-system'] = true;
+$wgDefaultUserOptions['echo-subscriptions-email-user-rights'] = true;
+$wgDefaultUserOptions['echo-subscriptions-web-article-linked'] = false;
+
+// Echo Configuration for EventLogging
+$wgEchoConfig = array(
+ 'version' => '1.5',
+ // default all eventlogging off, overwrite them in site configuration
+ 'eventlogging' => array (
+ 'Echo' => array (
+ 'enabled' => false,
+ 'revision' => 7572295,
+ ),
+ 'EchoMail' => array (
+ 'enabled' => false,
+ 'revision' => 5467650
+ ),
+ 'EchoInteraction' => array (
+ 'enabled' => false,
+ 'revision' => 5782287
+ ),
+ )
+);