User:Enterprisey/abusefilter-diff-check.js

( function {

// thanks https://stackoverflow.com/a/26434619/1757964 function parseTimestamp( timestamp ) { var dt = timestamp.split( /[: T-]/ ).map( parseFloat ); return new Date( Date.UTC( dt[0], dt[1] - 1, dt[2], dt[3] || 0, dt[4] || 0, dt[5] || 0, 0 ) ); }

if( mw.config.get( "wgDiffOldId" ) && mw.config.get( "wgDiffNewId" ) ) { $.when( mw.loader.using( [ "mediawiki.api", "mediawiki.util" ] ), $.ready ).then( function {            var api = new mw.Api;            function getUsernameAndTimestamp {                var username = $( "#mw-diff-ntitle2 .mw-userlink" ).text;                return api.get( { action: "query", prop: "revisions", titles: mw.config.get( "wgPageName" ), rvstartid: mw.config.get( "wgDiffNewId" ), rvendid: mw.config.get( "wgDiffOldId" ), rvlimit: 1, rvprop: "timestamp|ids", formatversion: "2", } ).then( function ( data ) { var timestamp = data.query.pages[0].revisions[0].timestamp; return $.when( username, timestamp ); } );           }

var link = mw.util.addPortletLink( "p-cactions", "#",               "AbuseFilter hits?", "pt-abusefilter-examine",                "Check if this diff triggered any abuse filters when it was made" ); if( link ) { link.addEventListener( "click", function {                    getUsernameAndTimestamp.then( function ( username, timestamp ) { api.get( {                           action: "query",                            list: "abuselog",                            afluser: username,                            afltitle: mw.config.get( "wgPageName" ).replace( /_/g, " " ),                            aflend: timestamp,                        } ).then( function ( data ) {                            var stringDiffNewId = "" + mw.config.get( "wgDiffNewId" );                            var entries = ( data.query.abuselog || [] ).filter( function ( entry ) { return ( "" + entry.revid ) === stringDiffNewId ||

// Sometimes an abuse filter entry can have a different timestamp than the triggering edit Math.abs( parseTimestamp( entry.timestamp ) - timestamp ) < 10000; // 10 seconds } );                           $( "#bodyContent" ).prepend( $( " " ) .append( "Filter hits: ", entries.length ? entries.map( function ( entry ) { return "" + entry.filter_id + " (details | examine)"; } ).join( ", " ) : "none" ) );                       } ); } );               } );            }

getUsernameAndTimestamp.then( function ( username, timestamp ) {               var url = mw.util.getUrl( "Special:AbuseFilter/test", { abusefilter_test_username: username, abusefilter_test_timestamp: timestamp, abusefilter_test_page: mw.config.get( "wgPageName" ) } );               mw.util.addPortletLink( "p-cactions", url, "AbuseFilter test", "pt-abusefilter-test", "Open this diff in the AbuseFilter testing interface" );           } ); } );   } else if( mw.config.get( "wgPageName" ) === "Special:AbuseFilter/test" && window.location.search.indexOf( "abusefilter_test_username" ) >= 0 ) {       $( function  { var username = window.location.search.match( /abusefilter_test_username=(.+?)($|&)/ )[1]; var timestamp = window.location.search.match( /abusefilter_test_timestamp=(.+?)($|&)/ )[1]; var page = window.location.search.match( /abusefilter_test_page=(.+?)($|&)/ )[1]; var timestampValue = parseTimestamp( decodeURIComponent( timestamp ) ).getTime;

// 30-second window in either direction to make sure we catch the edit var prevTimestamp = new Date( timestampValue - 30000 ); var nextTimestamp = new Date( timestampValue + 30000 );

$( "#ooui-php-5" ).val( username );

// "Changes made after" field OO.ui.infuse( $( "#ooui-php-14" ) ).fieldWidget.setValue( prevTimestamp );

// "Changes made before" field OO.ui.infuse( $( "#ooui-php-15" ) ).fieldWidget.setValue( nextTimestamp );

$( "#ooui-php-9" ).val( decodeURIComponent( page ) ); } );   } } );