MediaWiki:Gadget-cvuform-core.js

From [N8]
Jump to navigation Jump to search

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
/**<nowiki>
* Adds a 'Report a vandal' button to the CVU page
* 
* This gadget is enabled on mobile. Please make sure that any code used here
* also works on mobile.
*/
var conf = mw.config.get([
    'wgArticlePath',
    'wgPageName',
    'wgScriptPath',
    'wgRestrictionEdit',
    'wgUserGroups',
    'wgScript'
]);

function showSuccess() {
	OO.ui.alert( 'Thanks for your submission. The page will now be reloaded.' ).done( function () {
	    document.location.replace(conf.wgArticlePath.replace('$1', conf.wgPageName));
	} );
}

function showError(msg) {
	OO.ui.alert( msg );
}

function callAPI(data, method, callback) {
	data['format'] = 'json';
	$.ajax({
		data: data,
		dataType: 'json',
		url: conf.wgScriptPath + '/api.php',
		type: method,
		success: function(response) {
			if (response.error)
				showError('API error: ' + response.error.info);
			else 
				callback(response);
		},
		error: function(xhr, error) { showError('AJAX error: ' + error); }
	});
}

function cvuSubmit(editor) {
	callAPI({
		'action': 'query',
		'prop': 'info|revisions',
		'intoken': 'edit',
		'titles': conf.wgPageName,
		'rvprop': 'content',
		'rvlimit': '1',
		'indexpageids': 'true',
	}, 'GET', function(response) {
		var page = response.query.pages[response.query.pageids[0]];
		var content = page.revisions[0]['*'];
                    var template = '\{\{cvuid\|insert vandal\}\}';

		if (content.match(template) === null) 
			showError('An error occurred.');
                    content = content.replace(template, '{' + '{cvuid|' + editor + '}' + '}');

		callAPI({
			'minor': 'yes',
			'summary': 'Reported new user: [' + '[Special:Contributions/' + editor + '|' + editor + ']' + ']',
			'action': 'edit',
			'title': conf.wgPageName,
			'basetimestamp': page.revisions[0].timestamp,
			'startimestamp': page.starttimestamp,
			'token': page.edittoken,
			'text': content
		}, 'POST', function(response) {
			if (response.edit.result == 'Success')
				showSuccess();
			else 
				showError('An error occurred while submitting the edit.');
		});
	});
	return false;
}

if(conf.wgPageName=='GSWiki:Counter-Vandalism_Unit') {
	var $div = $('#cvu_guide');
	var $p = $('<p />');

	var ppLink = 'Due to vandalism, this page has been <a href="' + conf.wgArticlePath.replace('$1', 'GS:PP') + '">protected</a> from editing.';

	if ($.inArray('sysop', conf.wgRestrictionEdit) > -1 && $.inArray('sysop', conf.wgUserGroups) == -1)
		$p.append($('<p />').append(ppLink + ' Please <a href="' + conf.wgArticlePath.replace('$1', 'GS:AR') + '">contact an administrator</a>.'));
	else if ($.inArray('autoconfirmed', conf.wgRestrictionEdit) > -1 && $.inArray('autoconfirmed', conf.wgUserGroups) == -1)
		$p.append($('<p />').append(ppLink + ' Please <a href="' + conf.wgScript + '?title=Special:UserLogin&returnto=' + conf.wgPageName + '">log in</a> to report users.'));
	else {
		var button = new OO.ui.ButtonWidget( {
			label: 'Report a vandal',
			icon: 'alert',
			title: 'Reports a new vandal to the CVU'
		} );

		$p.append(button.$element
            .click(function () {
				new OO.ui.prompt( 'Enter a username', { textInput: { placeholder: 'Username' } } ).done( function ( result ) {
				    if ( result !== null && result !== '' ) {
				        cvuSubmit(result);
				    }
				} );
        	})
		);
	}

	if ($div !== null)
		$div.empty().append($p);

    $("span").each(function() {
        var name = this.className;
        if(this.id == 'cvu_remove' && this.className != 'insert vandal') {
            var $img1 = $("<img>").attr('src', conf.wgArticlePath.replace('$1', 'Special:FilePath/Yes_check.png'));
            $img1.attr('width', '15').attr('height', '16').attr('title', 'Remove this user as blocked').css('cursor', 'pointer');
            $img1.click(function() {
                removeUser(name.replace(/ /g,"_").replace(/-/g,"."), "blocked");
            });

            var $img2 = $("<img>").attr('src', conf.wgArticlePath.replace('$1', 'Special:FilePath/X_mark.png'));
            $img2.attr('width', '15').attr('height', '16').attr('title', 'Disregard this report').css('cursor', 'pointer');
            $img2.click(function() {
                removeUser(name.replace(/ /g,"_").replace(/-/g,"."), "");
            });

            $(this).append("&nbsp;").append($img1).append($img2);
        }
    });
}

function removeUser(user, state) {
    var template = '\{\{cvuid\|' + user.split("_").join(" ") + '(\|.*?)?\}\}';

	callAPI({
		'action': 'query',
		'prop': 'info|revisions',
		'intoken': 'edit',
		'titles': conf.wgPageName,
		'rvprop': 'content',
		'rvlimit': '1',
		'indexpageids': 'true'
	}, 'GET', function(response) {
		var page = response.query.pages[response.query.pageids[0]];
		var content = page.revisions[0]['*'];

		if (content.match(template) === null) {
			showError('An error occurred.');
            return;
		}

        content = content.replace('{' + '{cvuid|' + user.split("_").join(" "), '{' + '{cvuid|insert vandal}' + '}');
        content = content.replace(/\}\}(\|.*?)?\}\}/, '}' + '}');

        var summary = '[' + '[Special:Contributions/' + user + '|' + user.split("_").join(" ") + ']' + ']';
        if(state == "blocked")
            summary += ' has been blocked.';
        else
            summary += ' has not been blocked.';

		callAPI({
			'minor': 'yes',
			'summary': summary,
			'action': 'edit',
			'title': conf.wgPageName,
			'basetimestamp': page.revisions[0].timestamp,
			'startimestamp': page.starttimestamp,
			'token': page.edittoken,
			'text': content
		}, 'POST', function(response) {
			if (response.edit.result != 'Success') 
				showError('An error occurred while submitting the edit.');
            else 
                document.location.replace(conf.wgArticlePath.replace('$1', conf.wgPageName));
		});
	});
}

// </nowiki>