Compare commits

...

13 Commits

Author SHA1 Message Date
Jayden 1af68db747 Update README.md 2023-05-19 01:26:21 +01:00
Jayden Bailey 80f28e5920 Do not parse any Discord mentions in webhook messages
Resolves #42, closes #41
2022-04-18 21:08:32 +01:00
Jayden Bailey 27d39a9d4a Add support for the Renameuser extension 2021-11-29 19:18:49 +00:00
Jayden e5b1669d53 Merge pull request #39 from TehKittyCat/fixes
Fix Diff Links
2021-11-22 11:56:40 +00:00
TehKittyCat d3c49f1123 Fix broken diff link. 2021-11-22 02:43:27 -05:00
TehKittyCat 5ea635fd9a Remove unneeded 'use WikiPage', fixes PHP notice. 2021-11-22 01:47:51 -05:00
Jayden Bailey 4304818bdb Fix another deprecation warning 2021-11-21 18:46:34 +00:00
Jayden Bailey 3fb4b609d4 Update README to indicate new minimum MW requirement 2021-11-17 13:09:37 +00:00
Jayden Bailey 83deddd7ee Merge branch 'TehKittyCat-deprecation-fixes' 2021-11-17 13:08:40 +00:00
Jayden Bailey 160a512d67 Fix removed function call in createRevisionText (1.36+)
This commit raises the requirement of the extension to MediaWiki 1.36.
2021-11-17 13:06:16 +00:00
TehKittyCat f4dc6960bb Replace remaining usage of Revision with RevisionRecord to eliminate MediaWiki 1.36 deprecations and to fix MediaWiki 1.37 compatibility, where it has been removed. 2021-11-17 00:45:17 -05:00
TehKittyCat c24fee7a66 Replace usage of deprecated hooks. PageContentSaveComplete is replaced with PageSaveComplete and TitleMoveComplete is replaced with PageMoveComplete. This extension now requires MediaWiki 1.35 or higher. 2021-11-17 00:21:12 -05:00
TehKittyCat 1e962c55fb Fix "Title::get{Canonical,Full,Link,Local,Internal}URL method called with a second parameter is deprecated since MediaWiki 1.19. Add your parameter to an array passed as the first parameter.", fix function call casing, and use the canonical protocol. 2021-11-16 16:11:31 -05:00
6 changed files with 117 additions and 81 deletions
+5 -3
View File
@@ -1,3 +1,5 @@
> ⚠️ **This branch is no longer maintained.** MediaWiki 1.36 went End-of-Life in June 2022.
# Discord (mw-discord)
MediaWiki extension for sending notifications to a Discord webhook from MediaWiki. When a certain event occurs on your MediaWiki wiki, including new edits, they can be sent as a message to a channel on a Discord server using a webhook.
@@ -11,7 +13,7 @@ Multiple webhook URLs are supported and messages will be sent to all of them.
## Requirements
- **Discord webhook URL**: This can be obtained by editing a channel on a server with the correct permissions.
- **MediaWiki 1.35+**. This extension aims to support the latest LTS release.
- **MediaWiki 1.36+**. This extension aims to support the latest LTS release. **Ensure you are using the correct branch of this extension for your MediaWiki version. The `master` branch includes changes only applicable for the latest MediaWiki version.**
### Recommended
- **cURL**: By default, this extension sends requests using cURL. If you don't have cURL, you could try setting `$wgDiscordUseFileGetContents` to `true` instead, but this is not recommended.
@@ -58,12 +60,12 @@ This extension can be configured using the `LocalSettings.php` file in your Medi
| `$wgDiscordEmojis` | array | Map of hook names and their associated emojis to prepend to messages if `$wgDiscordUseEmojis` is enabled | See [extension.json](/extension.json)
## Hooks used
- `PageContentSaveComplete` - New edits to pages and page creations
- `PageSaveComplete` - New edits to pages and page creations
- `ArticleDeleteComplete` - Page deletions
- `ArticleUndelete` - Page restorations
- `ArticleRevisionVisibilitySet` - Revision visibility changes
- `ArticleProtectComplete` - Page protections
- `TitleMoveComplete` - Page moves
- `PageMoveComplete` - Page moves
- `LocalUserCreated` - User registrations
- `BlockIpComplete` - User blocked
- `UnblockUserComplete` - User unblocked
+10 -6
View File
@@ -7,6 +7,9 @@
"version": "1.0.12",
"descriptionmsg": "discord-desc",
"license-name": "MIT",
"requires": {
"MediaWiki": ">= 1.36.0"
},
"manifest_version": 1,
"config": {
"DiscordWebhookURL": [],
@@ -52,12 +55,12 @@
"mw-discord": "i18n"
},
"Hooks": {
"PageContentSaveComplete": "DiscordHooks::onPageContentSaveComplete",
"PageSaveComplete": "DiscordHooks::onPageSaveComplete",
"ArticleDeleteComplete": "DiscordHooks::onArticleDeleteComplete",
"ArticleUndelete": "DiscordHooks::onArticleUndelete",
"ArticleRevisionVisibilitySet": "DiscordHooks::onArticleRevisionVisibilitySet",
"ArticleProtectComplete": "DiscordHooks::onArticleProtectComplete",
"TitleMoveComplete": "DiscordHooks::onTitleMoveComplete",
"PageMoveComplete": "DiscordHooks::onPageMoveComplete",
"LocalUserCreated": "DiscordHooks::onLocalUserCreated",
"BlockIpComplete": "DiscordHooks::onBlockIpComplete",
"UnblockUserComplete": "DiscordHooks::onUnblockUserComplete",
@@ -67,9 +70,10 @@
"FileUndeleteComplete": "DiscordHooks::onFileUndeleteComplete",
"AfterImportPage": "DiscordHooks::onAfterImportPage",
"ArticleMergeComplete": "DiscordHooks::onArticleMergeComplete",
"ApprovedRevsRevisionApproved": "DiscordHooks::externalonApprovedRevsRevisionApproved",
"ApprovedRevsRevisionUnapproved": "DiscordHooks::externalonApprovedRevsRevisionUnapproved",
"ApprovedRevsFileRevisionApproved": "DiscordHooks::externalonApprovedRevsFileRevisionApproved",
"ApprovedRevsFileRevisionUnapproved": "DiscordHooks::externalonApprovedRevsFileRevisionUnapproved"
"ApprovedRevsRevisionApproved": "DiscordHooks::onApprovedRevsRevisionApproved",
"ApprovedRevsRevisionUnapproved": "DiscordHooks::onApprovedRevsRevisionUnapproved",
"ApprovedRevsFileRevisionApproved": "DiscordHooks::onApprovedRevsFileRevisionApproved",
"ApprovedRevsFileRevisionUnapproved": "DiscordHooks::onApprovedRevsFileRevisionUnapproved",
"RenameUserComplete": "DiscordHooks::onRenameUserComplete"
}
}
+2 -1
View File
@@ -35,5 +35,6 @@
"discord-approvedrevsrevisionapproved": "$1 approved a new revision of $2 (revision $3) from user $4",
"discord-approvedrevsrevisionunapproved": "$1 unapproved the approved revision for $2",
"discord-approvedrevsfilerevisionapproved": "$1 approved a new file revision of $2 ($3) from user $4",
"discord-approvedrevsfilerevisionunapproved": "$1 unapproved the approved file revision for $2"
"discord-approvedrevsfilerevisionunapproved": "$1 unapproved the approved file revision for $2",
"discord-renameusercomplete": "$1 renamed the user $2 to $3"
}
+2 -1
View File
@@ -35,5 +35,6 @@
"discord-approvedrevsrevisionapproved": "Message sent to Discord when a revision is approved (Approved Revs extension). Parameters:\n$1 - discord-userlinks (admin user)\n$2 - Target link\n$3 - Revision link or ID\n$4 - discord-userlinks (revision author) or ID",
"discord-approvedrevsrevisionunapproved": "Message sent to Discord when a revision is unapproved (Approved Revs extension). Parameters:\n$1 - discord-userlinks (admin user)\n$2 - Target link",
"discord-approvedrevsfilerevisionapproved": "Message sent to Discord when a file revision is approved (Approved Revs extension). Parameters:\n$1 - discord-userlinks (admin user)\n$2 - Target link\n$3 - SHA of uploaded file\n$4 - discord-userlinks (revision author)",
"discord-approvedrevsfilerevisionunapproved": "Message sent to Discord when a file revision is unapproved (Approved Revs extension). Parameters:\n$1 - discord-userlinks (admin user)\n$2 - Target link"
"discord-approvedrevsfilerevisionunapproved": "Message sent to Discord when a file revision is unapproved (Approved Revs extension). Parameters:\n$1 - discord-userlinks (admin user)\n$2 - Target link",
"discord-renameusercomplete": "Message sent to Discord when a user is renamed (Renameuser extension). \n$1 - discord-userlinks (admin user)\n$2 - Old username\n$3 - New username link"
}
+65 -41
View File
@@ -1,4 +1,11 @@
<?php
use MediaWiki\Linker\LinkTarget;
use MediaWiki\MediaWikiServices;
use MediaWiki\Revision\RevisionRecord;
use MediaWiki\Storage\EditResult;
use MediaWiki\User\UserIdentity;
/**
* Hooks for the Discord extension
*
@@ -8,11 +15,12 @@
class DiscordHooks {
/**
* Called when a page is created or edited
* @see https://www.mediawiki.org/wiki/Manual:Hooks/PageContentSaveComplete
* @see https://www.mediawiki.org/wiki/Manual:Hooks/PageSaveComplete
*/
public static function onPageContentSaveComplete( &$wikiPage, &$user, $content, $summary, $isMinor, $isWatch, $section, &$flags, $revision, &$status, $baseRevId, $undidRevId ) {
public static function onPageSaveComplete( WikiPage $wikiPage, UserIdentity $userIdentity, string $summary, int $flags, RevisionRecord $revision, EditResult $editResult ) {
global $wgDiscordNoBots, $wgDiscordNoMinor, $wgDiscordNoNull;
$hookName = 'PageContentSaveComplete';
$user = User::newFromIdentity( $userIdentity );
if ( DiscordUtils::isDisabled( $hookName, $wikiPage->getTitle()->getNamespace(), $user ) ) {
return true;
@@ -23,30 +31,29 @@ class DiscordHooks {
return true;
}
if ( $wgDiscordNoMinor && $isMinor ) {
if ( $wgDiscordNoMinor && $revision->isMinor() ) {
// Don't continue, this is a minor edit
return true;
}
if ( $wgDiscordNoNull && ( !$revision || is_null( $status->getValue()['revision'] ) ) ) {
if ( $wgDiscordNoNull && $editResult->isNullEdit() ) {
// Don't continue, this is a null edit
return true;
}
if ( $wikiPage->getTitle()->inNamespace( NS_FILE ) && is_null( $revision->getPrevious() ) ) {
$isNew = $editResult->isNew();
if ( $wikiPage->getTitle()->inNamespace( NS_FILE ) && $isNew ) {
// Don't continue, it's a new file which onUploadComplete will handle instead
return true;
}
$msgKey = 'discord-edit';
$isNew = $status->value['new'];
if ($isNew == 1) { // is a new page
if ( $isNew ) { // is a new page
$msgKey = 'discord-create';
}
$msg = wfMessage( $msgKey, DiscordUtils::createUserLinks( $user ),
DiscordUtils::createMarkdownLink( $wikiPage->getTitle(), $wikiPage->getTitle()->getFullUrl( '', '', $proto = PROTO_HTTP ) ),
DiscordUtils::createMarkdownLink( $wikiPage->getTitle(), $wikiPage->getTitle()->getFullURL( '', false, PROTO_CANONICAL ) ),
DiscordUtils::createRevisionText( $revision ),
( $summary ? ('`' . DiscordUtils::sanitiseText( DiscordUtils::truncateText( $summary ) ) . '`' ) : '' ) )->plain();
DiscordUtils::handleDiscord($hookName, $msg);
@@ -71,7 +78,7 @@ class DiscordHooks {
}
$msg = wfMessage( 'discord-articledelete', DiscordUtils::createUserLinks( $user ),
DiscordUtils::createMarkdownLink( $article->getTitle(), $article->getTitle()->getFullUrl( '', '', $proto = PROTO_HTTP ) ),
DiscordUtils::createMarkdownLink( $article->getTitle(), $article->getTitle()->getFullURL( '', false, PROTO_CANONICAL ) ),
( $reason ? ('`' . DiscordUtils::sanitiseText( DiscordUtils::truncateText( $reason ) ) . '`' ) : '' ),
$archivedRevisionCount)->plain();
DiscordUtils::handleDiscord($hookName, $msg);
@@ -99,7 +106,7 @@ class DiscordHooks {
$msg = wfMessage( 'discord-articleundelete', DiscordUtils::createUserLinks( $user ),
($create ? '' : wfMessage( 'discord-undeleterev' )->text() ),
DiscordUtils::createMarkdownLink( $title, $title->getFullUrl( '', '', $proto = PROTO_HTTP ) ),
DiscordUtils::createMarkdownLink( $title, $title->getFullURL( '', false, PROTO_CANONICAL ) ),
( $comment ? ('`' . DiscordUtils::sanitiseText( DiscordUtils::truncateText( $comment ) ) . '`' ) : '' ))->plain();
DiscordUtils::handleDiscord($hookName, $msg);
return true;
@@ -126,7 +133,7 @@ class DiscordHooks {
$msg = wfMessage( 'discord-revvisibility', DiscordUtils::createUserLinks( $user ),
count($visibilityChangeMap),
DiscordUtils::createMarkdownLink( $title, $title->getFullUrl( '', '', $proto = PROTO_HTTP ) ) )->plain();
DiscordUtils::createMarkdownLink( $title, $title->getFullURL( '', false, PROTO_CANONICAL ) ) )->plain();
DiscordUtils::handleDiscord($hookName, $msg);
return true;
}
@@ -149,7 +156,7 @@ class DiscordHooks {
}
$msg = wfMessage( 'discord-articleprotect', DiscordUtils::createUserLinks( $user ),
DiscordUtils::createMarkdownLink( $article->getTitle(), $article->getTitle()->getFullUrl( '', '', $proto = PROTO_HTTP ) ),
DiscordUtils::createMarkdownLink( $article->getTitle(), $article->getTitle()->getFullURL( '', false, PROTO_CANONICAL ) ),
( $reason ? ('`' . DiscordUtils::sanitiseText( DiscordUtils::truncateText( $reason ) ) . '`' ) : '' ),
implode(", ", $protect) )->plain();
DiscordUtils::handleDiscord($hookName, $msg);
@@ -158,13 +165,14 @@ class DiscordHooks {
/**
* Called when a page is moved
* @see https://www.mediawiki.org/wiki/Manual:Hooks/TitleMoveComplete
* @see https://www.mediawiki.org/wiki/Manual:Hooks/PageMoveComplete
*/
public static function onTitleMoveComplete( Title &$title, Title &$newTitle, User $user, $oldid, $newid, $reason, Revision $revision ) {
public static function onPageMoveComplete( LinkTarget $old, LinkTarget $new, UserIdentity $userIdentity, int $pageid, int $redirid, string $reason, RevisionRecord $revision ) {
global $wgDiscordNoBots;
$hookName = 'TitleMoveComplete';
$user = User::newFromIdentity( $userIdentity );
if ( DiscordUtils::isDisabled( $hookName, $title->getNamespace(), $user ) ) {
if ( DiscordUtils::isDisabled( $hookName, $old->getNamespace(), $user ) ) {
return true;
}
@@ -174,8 +182,8 @@ class DiscordHooks {
}
$msg = wfMessage( 'discord-titlemove', DiscordUtils::createUserLinks( $user ),
DiscordUtils::createMarkdownLink( $title, $title->getFullUrl( '', '', $proto = PROTO_HTTP ) ),
DiscordUtils::createMarkdownLink( $newTitle, $newTitle->getFullUrl( '', '', $proto = PROTO_HTTP ) ),
DiscordUtils::createMarkdownLink( $old, Title::castFromLinkTarget( $old )->getFullURL( '', false, PROTO_CANONICAL ) ),
DiscordUtils::createMarkdownLink( $new, Title::castFromLinkTarget( $new )->getFullURL( '', false, PROTO_CANONICAL ) ),
( $reason ? ('`' . DiscordUtils::sanitiseText( DiscordUtils::truncateText( $reason ) ) . '`' ) : '' ),
DiscordUtils::createRevisionText( $revision ) )->plain();
DiscordUtils::handleDiscord($hookName, $msg);
@@ -289,7 +297,7 @@ class DiscordHooks {
$msg = wfMessage( 'discord-uploadcomplete', DiscordUtils::createUserLinks( $user ),
( $isNewRevision ? wfMessage( 'discord-uploadnewver' )->text() : '' ),
DiscordUtils::createMarkdownLink( $lf->getName(), $lf->getTitle()->getFullUrl( '', '', $proto = PROTO_HTTP ) ),
DiscordUtils::createMarkdownLink( $lf->getName(), $lf->getTitle()->getFullURL( '', false, PROTO_CANONICAL ) ),
( $comment ? ('`' . DiscordUtils::sanitiseText( DiscordUtils::truncateText( $comment ) ) . '`' ) : '' ),
DiscordUtils::formatBytes($lf->getSize()),
$lf->getWidth(),
@@ -322,7 +330,7 @@ class DiscordHooks {
}
$msg = wfMessage( 'discord-filedeletecomplete', DiscordUtils::createUserLinks( $user ),
DiscordUtils::createMarkdownLink( $file->getName(), $file->getTitle()->getFullUrl( '', '', $proto = PROTO_HTTP ) ),
DiscordUtils::createMarkdownLink( $file->getName(), $file->getTitle()->getFullURL( '', false, PROTO_CANONICAL ) ),
( $reason ? ('`' . DiscordUtils::sanitiseText( DiscordUtils::truncateText( $reason ) ) . '`' ) : '' ) )->plain();
DiscordUtils::handleDiscord($hookName, $msg);
return true;
@@ -346,7 +354,7 @@ class DiscordHooks {
}
$msg = wfMessage( 'discord-fileundeletecomplete', DiscordUtils::createUserLinks( $user ),
DiscordUtils::createMarkdownLink( $title, $title->getFullUrl( '', '', $proto = PROTO_HTTP ) ),
DiscordUtils::createMarkdownLink( $title, $title->getFullURL( '', false, PROTO_CANONICAL ) ),
( $reason ? ('`' . DiscordUtils::sanitiseText( DiscordUtils::truncateText( $reason ) ) . '`' ) : '' ) )->plain();
DiscordUtils::handleDiscord($hookName, $msg);
return true;
@@ -372,7 +380,7 @@ class DiscordHooks {
}
$msg = wfMessage( 'discord-afterimportpage', DiscordUtils::createUserLinks( $user ),
DiscordUtils::createMarkdownLink( $title, $title->getFullUrl( '', '', $proto = PROTO_HTTP ) ),
DiscordUtils::createMarkdownLink( $title, $title->getFullURL( '', false, PROTO_CANONICAL ) ),
$revCount, $sRevCount)->plain();
DiscordUtils::handleDiscord($hookName, $msg);
return true;
@@ -394,8 +402,8 @@ class DiscordHooks {
}
$msg = wfMessage( 'discord-articlemergecomplete', DiscordUtils::createUserLinks( $user ),
DiscordUtils::createMarkdownLink( $targetTitle, $targetTitle->getFullUrl( '', '', $proto = PROTO_HTTP ) ),
DiscordUtils::createMarkdownLink( $destTitle, $destTitle->getFullUrl( '', '', $proto = PROTO_HTTP ) ))->plain();
DiscordUtils::createMarkdownLink( $targetTitle, $targetTitle->getFullURL( '', false, PROTO_CANONICAL ) ),
DiscordUtils::createMarkdownLink( $destTitle, $destTitle->getFullURL( '', false, PROTO_CANONICAL ) ))->plain();
DiscordUtils::handleDiscord($hookName, $msg);
return true;
}
@@ -404,7 +412,7 @@ class DiscordHooks {
* Called when a revision is approved (Approved Revs extension)
* @see https://github.com/wikimedia/mediawiki-extensions-ApprovedRevs/blob/REL1_34/includes/ApprovedRevs_body.php
*/
public static function externalonApprovedRevsRevisionApproved ( $output, $title, $rev_id, $content ) {
public static function onApprovedRevsRevisionApproved ( $output, $title, $rev_id, $content ) {
global $wgDiscordNoBots;
$hookName = 'ApprovedRevsRevisionApproved';
@@ -420,18 +428,12 @@ class DiscordHooks {
}
// Get the revision being approved here
$rev = Revision::newFromTitle( $title, $rev_id );
$revLink = $title->getFullURL( array( 'oldid' => $rev_id ), '', $proto = PROTO_HTTP );
$revAuthor = $rev->getUser( Revision::RAW );
if ($revAuthor === 0) {
$revAuthor = DiscordUtils::createUserLinks( User::newFromName($rev->getUserText(), false) );
} else if ($revAuthor) {
$revAuthor = DiscordUtils::createUserLinks( User::newFromId($revAuthor) );
}
$rev = MediaWikiServices::getInstance()->getRevisionLookup()->getRevisionByTitle( $title, $rev_id );
$revLink = $title->getFullURL( '', false, PROTO_CANONICAL );
$revAuthor = DiscordUtils::createUserLinks( $rev->getUser( RevisionRecord::RAW ) );
$msg = wfMessage( 'discord-approvedrevsrevisionapproved', DiscordUtils::createUserLinks( $user ),
DiscordUtils::createMarkdownLink( $title, $title->getFullUrl( '', '', $proto = PROTO_HTTP ) ),
DiscordUtils::createMarkdownLink( $title, $title->getFullURL( '', false, PROTO_CANONICAL ) ),
DiscordUtils::createMarkdownLink( $rev_id, $revLink ),
$revAuthor)->plain();
DiscordUtils::handleDiscord($hookName, $msg);
@@ -442,7 +444,7 @@ class DiscordHooks {
* Called when a revision is unapproved (Approved Revs extension)
* @see https://github.com/wikimedia/mediawiki-extensions-ApprovedRevs/blob/REL1_34/includes/ApprovedRevs_body.php
*/
public static function externalonApprovedRevsRevisionUnapproved ( $output, $title, $content ) {
public static function onApprovedRevsRevisionUnapproved ( $output, $title, $content ) {
global $wgDiscordNoBots;
$hookName = 'ApprovedRevsRevisionUnapproved';
@@ -458,7 +460,7 @@ class DiscordHooks {
}
$msg = wfMessage( 'discord-approvedrevsrevisionunapproved', DiscordUtils::createUserLinks( $user ),
DiscordUtils::createMarkdownLink( $title, $title->getFullUrl( '', '', $proto = PROTO_HTTP ) ))->plain();
DiscordUtils::createMarkdownLink( $title, $title->getFullURL( '', false, PROTO_CANONICAL ) ) )->plain();
DiscordUtils::handleDiscord($hookName, $msg);
return true;
}
@@ -467,7 +469,7 @@ class DiscordHooks {
* Called when a file is approved (Approved Revs extension)
* @see https://github.com/wikimedia/mediawiki-extensions-ApprovedRevs/blob/REL1_34/includes/ApprovedRevs_body.php
*/
public static function externalonApprovedRevsFileRevisionApproved ( $parser, $title, $timestamp, $sha1 ) {
public static function onApprovedRevsFileRevisionApproved ( $parser, $title, $timestamp, $sha1 ) {
global $wgDiscordNoBots;
$hookName = 'ApprovedRevsFileRevisionApproved';
@@ -494,7 +496,7 @@ class DiscordHooks {
}
$msg = wfMessage( 'discord-approvedrevsfilerevisionapproved', DiscordUtils::createUserLinks( $user ),
DiscordUtils::createMarkdownLink( $title, $title->getFullURL('', '', $proto = PROTO_HTTP) ),
DiscordUtils::createMarkdownLink( $title, $title->getFullURL( '', false, PROTO_CANONICAL ) ),
DiscordUtils::createMarkdownLink( 'direct', $displayedFileUrl ),
DiscordUtils::createUserLinks( $uploader ) )->plain();
DiscordUtils::handleDiscord($hookName, $msg);
@@ -505,7 +507,7 @@ class DiscordHooks {
* Called when a file is unapproved (Approved Revs extension)
* @see https://github.com/wikimedia/mediawiki-extensions-ApprovedRevs/blob/REL1_34/includes/ApprovedRevs_body.php
*/
public static function externalonApprovedRevsFileRevisionUnapproved ( $parser, $title ) {
public static function onApprovedRevsFileRevisionUnapproved ( $parser, $title ) {
global $wgDiscordNoBots;
$hookName = 'ApprovedRevsFileRevisionUnapproved';
@@ -521,8 +523,30 @@ class DiscordHooks {
}
$msg = wfMessage( 'discord-approvedrevsfilerevisionunapproved', DiscordUtils::createUserLinks( $user ),
DiscordUtils::createMarkdownLink( $title, $title->getFullUrl( '', '', $proto = PROTO_HTTP ) ))->plain();
DiscordUtils::createMarkdownLink( $title, $title->getFullURL( '', false, PROTO_CANONICAL ) ) )->plain();
DiscordUtils::handleDiscord($hookName, $msg);
return true;
}
/**
* Called when a user is renamed (Renameuser extension)
* @see https://github.com/wikimedia/mediawiki-extensions-Renameuser/blob/REL1_36/includes/RenameuserSQL.php
*/
public static function onRenameUserComplete ( $uid, $old, $new ) {
$hookName = 'RenameUserComplete';
$user = RequestContext::getMain()->getUser();
if ( DiscordUtils::isDisabled( $hookName, null, null ) ) {
return true;
}
$renamedUserAsTitle = User::newFromName( $new )->getUserPage();
$msg = wfMessage( 'discord-renameusercomplete', DiscordUtils::createUserLinks( $user ),
"*$old*",
DiscordUtils::createMarkdownLink( $new, $renamedUserAsTitle->getFullURL( '', false, PROTO_CANONICAL ) ) )->plain();
DiscordUtils::handleDiscord($hookName, $msg);
return true;
}
}
+33 -29
View File
@@ -1,5 +1,7 @@
<?php
use MediaWiki\MediaWikiServices;
class DiscordUtils {
/**
* Checks if criteria is met for this action to be cancelled
@@ -81,8 +83,13 @@ class DiscordUtils {
DeferredUpdates::addCallableUpdate( function() use ( $stripped, $urls, $wgDiscordUseFileGetContents ) {
$user_agent = 'mw-discord/1.0 (github.com/jaydenkieran)';
$json_data = [ 'content' => "$stripped" ];
$json = json_encode($json_data);
$json_data = [
'content' => "$stripped",
'allowed_mentions' => [
'parse' => []
]
];
$json = json_encode($json_data);
if ( $wgDiscordUseFileGetContents ) {
// They want to use file_get_contents
@@ -101,12 +108,12 @@ class DiscordUtils {
$result = file_get_contents( $value, false, $context );
}
} else {
// By default, we use cURL
// By default, we use cURL
// Set up cURL multi handlers
$c_handlers = [];
$result = [];
$mh = curl_multi_init();
foreach ($urls as &$value) {
$c_handlers[$value] = curl_init( $value );
curl_setopt( $c_handlers[$value], CURLOPT_POST, 1 ); // Send as a POST request
@@ -122,19 +129,19 @@ class DiscordUtils {
));
curl_multi_add_handle( $mh, $c_handlers[$value] );
}
$running = null;
do {
curl_multi_exec($mh, $running);
} while ($running);
// Remove all handlers and then close the multi handler
foreach($c_handlers as $k => $ch) {
$result[$k] = curl_multi_getcontent($ch);
wfDebugLog( 'discord', 'Result of cURL was: ' . $result[$k] );
curl_multi_remove_handle($mh, $ch);
}
curl_multi_close($mh);
}
} );
@@ -169,10 +176,10 @@ class DiscordUtils {
}
}
$userPage = DiscordUtils::createMarkdownLink( $user_abbr, ( $isAnon ? $contribs : $user->getUserPage() )->getFullUrl( '', '', $proto = PROTO_HTTP ) );
$userTalk = DiscordUtils::createMarkdownLink( wfMessage( 'discord-talk' )->text(), $user->getTalkPage()->getFullUrl( '', '', $proto = PROTO_HTTP ) );
$userContribs = DiscordUtils::createMarkdownLink( wfMessage( 'discord-contribs' )->text(), $contribs->getFullURL( '', '', $proto = PROTO_HTTP ) );
$text = wfMessage( 'discord-userlinks', $userPage, $userTalk, $userContribs )->text();
$userPage = DiscordUtils::createMarkdownLink( $user_abbr, ( $isAnon ? $contribs : $user->getUserPage() )->getFullURL( '', false, PROTO_CANONICAL ) );
$userTalk = DiscordUtils::createMarkdownLink( wfMessage( 'discord-talk' )->text(), $user->getTalkPage()->getFullURL( '', false, PROTO_CANONICAL ) );
$userContribs = DiscordUtils::createMarkdownLink( wfMessage( 'discord-contribs' )->text(), $contribs->getFullURL( '', false, PROTO_CANONICAL ) );
$text = wfMessage( 'discord-userlinks', $userPage, $userTalk, $userContribs )->text();
} else {
// If it's a string, which can be likely (for example when range blocking a user)
// We need to handle this differently.
@@ -185,20 +192,17 @@ class DiscordUtils {
* Creates formatted text for a specific Revision object
*/
public static function createRevisionText ($revision) {
$diff = DiscordUtils::createMarkdownLink( wfMessage( 'discord-diff' )->text(), $revision->getTitle()->getFullUrl("diff=prev", ["oldid" => $revision->getID()], $proto = PROTO_HTTP) );
$diff = DiscordUtils::createMarkdownLink( wfMessage( 'discord-diff' )->text(), $revision->getPageAsLinkTarget()->getFullURL( [ 'diff' => 'prev', 'oldid' => $revision->getId() ], false, PROTO_CANONICAL ) );
$minor = '';
$size = '';
if ( $revision->isMinor() ) {
$minor .= wfMessage( 'discord-minor' )->text();
}
$previous = $revision->getPrevious();
if ( $previous ) {
$size .= wfMessage( 'discord-size', sprintf( "%+d", $revision->getSize() - $previous->getSize() ) )->text();
} else if ( $revision->getParentId() ) {
// Try and get the parent revision based on the ID, if we can
$previous = Revision::newFromId( $revision->getParentId() );
if ($previous) {
$size .= wfMessage( 'discord-size', sprintf( "%+d", $revision->getSize() - $previous->getSize() ) )->text();
$parentId = $revision->getParentId();
if ( $parentId ) {
$parent = MediaWikiServices::getInstance()->getRevisionLookup()->getRevisionById( $parentId );
if ( $parent ) {
$size .= wfMessage( 'discord-size', sprintf( "%+d", $revision->getSize() - $parent->getSize() ) )->text();
}
}
if ( $size == '' ) {
@@ -207,7 +211,7 @@ class DiscordUtils {
$text = wfMessage( 'discord-revisionlinks', $diff, $minor, $size )->text();
return $text;
}
/**
* Strip bad characters from a URL
*/
@@ -217,20 +221,20 @@ class DiscordUtils {
$url = str_replace(")", "%29", $url);
return $url;
}
/**
* Formats bytes to a string representing B, KB, MB, GB, TB
*/
public static function formatBytes($bytes, $precision = 2) {
$units = array('B', 'KB', 'MB', 'GB', 'TB');
public static function formatBytes($bytes, $precision = 2) {
$units = array('B', 'KB', 'MB', 'GB', 'TB');
$bytes = max($bytes, 0);
$pow = floor(($bytes ? log($bytes) : 0) / log(1024));
$pow = min($pow, count($units) - 1);
$bytes = max($bytes, 0);
$pow = floor(($bytes ? log($bytes) : 0) / log(1024));
$pow = min($pow, count($units) - 1);
$bytes /= (1 << (10 * $pow));
$bytes /= (1 << (10 * $pow));
return round($bytes, $precision) . ' ' . $units[$pow];
return round($bytes, $precision) . ' ' . $units[$pow];
}
/**