Thành viên:NguoiDungKhongDinhDanh/AbuseFilterUpdate.js

Bách khoa toàn thư mở Wikipedia

Chú ý: Sau khi lưu thay đổi trang, bạn phải xóa bộ nhớ đệm của trình duyệt để nhìn thấy các thay đổi. Google Chrome, Firefox, Internet ExplorerSafari: Giữ phím ⇧ Shift và nhấn nút Reload/Tải lại trên thanh công cụ của trình duyệt. Để biết chi tiết và hướng dẫn cho các trình duyệt khác, xem Trợ giúp:Xóa bộ nhớ đệm.

/**
 * Script hỗ trợ cập nhật [[Thành viên:Hộp cát/Bộ lọc sai phạm]].
 * Ghi công: [[:en:Special:Permalink/1076402159#API for abuse filters]].
**/

// TODO:
// $.ajax({
// 	url: 'https://en.wikipedia.org/wiki/Special:AbuseFilter/1151',
// 	success: function(response) {
// 		console.log(JSON.parse($('#mw-abusefilter-export > textarea', response).val()))
// 	}
// })

$(function() {
	var ns = mw.config.get('wgNamespaceNumber'),
		pn = mw.config.get('wgPageName'),
		t = mw.config.get('wgTitle'),
		ta = mw.config.get('wgTitle').split('/');
	
	if (ns !== 2 || !t.match(/Hộp cát\/Bộ lọc sai phạm\/([wbnqtsvy]|wm)\/[\w-]+\/\d+/)) return;
	
	var j = ta.length,
		p = ta[j - 3],
		l = ta[j - 2],
		n = ta[j - 1];
	
	// Xử lý đầu vào	
	switch (p) {
		case 'w':
			p = 'wikipedia';
		break;
		case 'b':
			p = 'wikibooks';
		break;
		case 'n':
			p = 'wikinews';
		break;
		case 'q':
			p = 'wikiquote';
		break;
		case 't':
			p = 'wiktionary';
		break;
		case 's':
			p = 'wikisource';
		break;
		case 'v':
			p = 'wikiversity';
		break;
		case 'y':
			p = 'wikivoyage';
		break;
		case 'wm':
			switch (l) {
				case 'c':
					l = 'commons';
					p = 'wikimedia';
				break;
				case 'd':
					l = 'www';
					p = 'wikidata';
				break;
				case 'm':
					l = 'meta';
					p = 'wikimedia';
				break;
				case 'mn':
					l = 'wikimania';
					p = 'wikimedia';
				break;
				case 'os':
					l = 'www';
					p = 'wikisource';
				break;
				case 'sp':
					l = 'species';
					p = 'wikimedia';
				break;
			}
		break;
	}
	
	// Thêm liên kết kích hoạt
	mw.util.addPortletLink('p-cactions', '', 'Update', 'pt-afu', 'Cập nhật');
	
	$('#pt-afu').click(function(e) {
		e.preventDefault();
		
		// Truy vấn dữ liệu
		new mw.ForeignApi('https://' + l + '.' + p + '.org/w/api.php').get({
		    action: 'query',
		    list: 'abusefilters', 
		    abfstartid: n,
		    abflimit: 1,
		    abfprop: 'pattern',
		    format: 'json'
		}).done(function(response) {
			var afc = response.query.abusefilters[0].pattern;
			
			new mw.Api().get({ // Lấy nội dung trang đã có
				action: 'query',
				prop: 'revisions',
				titles: pn,
				rvslots: '*',
				rvprop: 'content',
				formatversion: 2
			}).done(function(response) {
				var wt = response.query.pages[0].revisions[0].slots.main.content,
					wtn = wt.replace(/(?<=<syntaxhighlight\s*lang\s*=\s*"php"\s*>\n)(?:.|\n)*?(?=\n<\/syntaxhighlight>)/i, afc);
				
				new mw.Api().postWithToken('csrf', {
					action: 'edit',
					title: pn,
					text: wtn,
					summary: 'Cập nhật trang tài liệu bộ lọc sai phạm',
					format: 'json'
				}).then(
					function(d) {
						if (!d.edit.newrevid) {
							mw.notify('Bộ lọc này không có nội dung gì mới. Hãy thử lại sau.', {
								type: 'error',
								title: 'Không có nội dung mới!'
							});
							return;
						} else {
							mw.notify('Đã cập nhật bộ lọc thành công. Đi đến khác biệt sửa đổi...', {
								type: 'success',
								title: 'Thành công!'
							});
							location.assign('/w/index.php?diff=' + d.edit.newrevid + '&oldid=' + d.edit.oldrevid);
						}
					},
					function(e, d) {
						mw.notify('Cập nhật thất bại. Đã báo lỗi trong bảng điều khiển.', {
							type: 'error',
							title: 'Thất bại!'
						});
						console.warn(e);
						console.warn(d);
					}
				);
			});
		});
	});
});