Участник:Popstop/common.js — различия между версиями
Материал из Hilarious Wiki
Popstop (обсуждение | вклад) м (Тест) |
Popstop (обсуждение | вклад) (Тест) |
||
Строка 291: | Строка 291: | ||
} | } | ||
}); | }); | ||
+ | |||
+ | var addExtraButtons = function(){ | ||
+ | mw.toolbar.addButton( { | ||
+ | imageFile: '//w.hil.su/images/c/cb/Grid_%D0%9A%D1%80%D0%BE%D0%B2%D0%B0%D0%B2%D1%8B%D0%B9_%D0%B0%D0%BB%D1%82%D0%B0%D1%80%D1%8C_%28Blood_Magic%29.png', | ||
+ | speedTip: 'Вставить шаблон кровавого алтаря', | ||
+ | tagOpen: '{{Blood Magic/Кровавый алтарь\n|вход=\n|выход=\n|уровень=\n|LP=\n|расход=\n|потери=\n', | ||
+ | tagClose: '}}', | ||
+ | imageId: 'button-blooaltar' | ||
+ | }); | ||
+ | mw.toolbar.addButton( { | ||
+ | imageFile: '//d1u5p3l4wpay3k.cloudfront.net/minecraft_ru_gamepedia/0/06/%D0%9F%D0%B0%D0%BB%D0%BA%D0%B0.png?version=b9bf1cabc365d86a601e4e872c84c165', | ||
+ | speedTip: 'Вставить шаблон предмета', | ||
+ | tagOpen: '{{Предмет\n|изображение=\n|инвизображение=\n|тип=\n|прочн=\n|склад=\n|текст_id=\n', | ||
+ | tagClose: '}}', | ||
+ | imageId: 'button-item' | ||
+ | }); | ||
+ | mw.toolbar.addButton( { | ||
+ | imageFile: '//d1u5p3l4wpay3k.cloudfront.net/minecraft_ru_gamepedia/0/04/%D0%97%D0%B5%D0%BC%D0%BB%D1%8F.png?version=f0b569469bb185914c9394c44f1686bf', | ||
+ | speedTip: 'Вставить шаблон блока', | ||
+ | tagOpen: '{{Блок\n|название=\n|изображение=\n|инвизображение=\n|тип=\n|гравит=\n|грязь=\n|прозр=\n|свет=\n|взрывоуст=\n|прочн=\n|инструмент=\n|склад=\n|восплам=\n|текст_id=\n', | ||
+ | tagClose: '}}', | ||
+ | imageId: 'button-item' | ||
+ | }); | ||
+ | }; | ||
+ | |||
+ | |||
+ | if( $.inArray( mw.config.get( 'wgAction' ), [ 'edit', 'submit' ] ) !== -1 ) { | ||
+ | mw.loader.using( 'user.options', function () { | ||
+ | if ( ! mw.user.options.get( 'usebetatoolbar' ) ) { | ||
+ | mw.loader.using( 'mediawiki.action.edit', function(){ | ||
+ | $( addExtraButtons ); | ||
+ | }); | ||
+ | } | ||
+ | }); | ||
+ | } |
Версия 21:08, 25 августа 2018
mw.loader.using(['mediawiki.api']).then(function() {
"use strict";
var api = new mw.Api();
var element = null;
var ratelimit = null;
var request = null;
var count = 0;
function status(message) {
message = message === undefined ? "Очищено: " + count : message;
if (element)
element.text(message);
}
function error(message) {
status("Ошибка.");
message = message === undefined ? "unknown error" : message;
console.log("purge.js: " + message);
}
function calcGCD(x, y) {
if (x < y) {
var tmp = x;
x = y;
y = tmp;
}
while (true) {
if (y === 0)
return x;
x %= y;
if (x === 0)
return y;
y %= x;
}
}
function updateRatelimit(callback) {
if (typeof purgejs_ratelimit !== "undefined") {
ratelimit = purgejs_ratelimit;
if (callback)
callback();
return;
}
api.get({
meta: 'userinfo',
uiprop: 'rights|ratelimits'
}).done(function(data) {
if (data && data.query && data.query.userinfo) {
var ratelimits = data.query.userinfo.ratelimits;
var rights = data.query.userinfo.rights;
if (ratelimits && ratelimits.purge) {
if (ratelimits.purge.user) {
ratelimit = ratelimits.purge.user;
} else if (ratelimits.purge.ip) {
ratelimit = ratelimits.purge.ip;
} else {
return error("unnable to parse ratelimits");
}
var gcd = calcGCD(ratelimit.hits, ratelimit.seconds);
if (gcd > 1) {
ratelimit.hits /= gcd;
ratelimit.seconds /= gcd;
}
} else {
if (rights && rights.indexOf("apihighlimits") !== -1) {
ratelimit = { hits: 500, seconds: 0 };
} else {
ratelimit = { hits: 50, seconds: 0 };
}
}
} else {
return error("unnable to get userinfo");
}
if (callback)
callback();
});
}
function processPurge(continueinfo) {
api.post($.extend({}, request, continueinfo))
.done(function(data) {
if (data && data.purge && data.purge.length) {
count += data.purge.length;
} else {
return error("empty response");
}
if (data.warnings) {
error("warning recieved");
console.log(data.warnings);
return;
}
if (data["continue"]) {
status();
setTimeout(function() {
processPurge(data["continue"]);
}, 1000 * ratelimit.seconds);
} else {
status("Готово.");
}
})
.fail(function() {
error("request failed");
});
}
function startPurge(prefix, generator, linkupdate) {
request = { "action": "purge" };
if (linkupdate) {
request.forcelinkupdate = "1";
}
$.extend(request, generator);
updateRatelimit(function() {
var limit = prefix + "limit";
if (linkupdate) {
request[limit] = 1;
} else {
request[limit] = ratelimit.hits;
}
count = 0;
status();
processPurge(null);
});
}
function addButton() {
var pagename = mw.config.get("wgPageName");
var namespace = mw.config.get("wgCanonicalNamespace");
var action = mw.config.get("wgAction");
var exists = mw.config.get("wgArticleId") !== 0;
if (!(
action === "view" ||
namespace === "Category" && action === "edit" && !exists
)) {
return;
}
var prefix, generator;
var comment = "";
if (namespace === "") {
prefix = "gbl";
generator = {
"generator": "backlinks",
"gbltitle": pagename
};
comment = "Сбросить кэш на страницах, ссылающихся на данную. ";
} else if (namespace === "File") {
prefix = "gfu";
generator = {
"generator": "fileusage",
"titles": pagename
};
comment = "Сбросить кэш на страницах, включающих данный файл. ";
} else if (namespace === "Template") {
prefix = "gti";
generator = {
"generator": "transcludedin",
"titles": pagename
};
comment = "Сбросить кэш на страницах, включающих данный шаблон. ";
} else if (namespace === "Category") {
prefix = "gcm";
generator = {
"generator": "categorymembers",
"gcmtitle": pagename
};
comment = "Сбросить кэш на страницах, включённых в данную категорию. ";
} else if (
(namespace === "User" || namespace === "Wikiproject") &&
pagename.indexOf("/") != -1
) {
prefix = "gpl";
generator = {
"generator": "links",
"titles": pagename
};
comment = "Сбросить кэш на страницах, на которые ведут ссылки с данной. ";
}
if (prefix && generator) {
var link = $("<a>", {
title: comment + "Ctrl+клик — сделать нулевую правку.",
text: "Сбросить кэш"
}).css({cursor: 'pointer'});
link.click(function(ev) {
startPurge(prefix, generator, ev.ctrlKey);
});
element = $("<li>", { id: "t-purge" })
.addClass("plainlinks")
.append(link);
$("#p-tb div ul").append(element);
}
}
addButton();
});
mw.loader.using(['mediawiki.util', 'mediawiki.api'])
.then(function() {
var count, wait;
var step = 1;
var depth = 5;
var api = new mw.Api();
function collectSubCategories(cat) {
console.log('cat: ' + cat);
return $.getJSON('https://petscan.wmflabs.org', {
language: 'ru',
project: 'wikipedia',
depth: depth - 1,
categories: cat.substring(cat.indexOf(':') + 1),
'ns[14]': 1,
interface_language: 'en',
active_tab: 'tab_output',
doit: '',
format: 'json'
})
.done(function(d) {
purge([cat].concat(d['*'][0].a['*'].map(function(q) {
return "Категория:" + q.title;
}))
.reverse());
})
.fail(function() {
alert("Сбор подкатегорий не удался");
purge([cat]);
});
}
function purge(cats) {
if (cats.length <= 0) {
alert("Нуль-правки успешно завершены!");
document.location.reload();
} else
postPurge(cats[0], cats);
}
function postPurge(cat, cats, addParams) {
console.log('catnext: ' + cat);
var apiParams = $.extend({
action: 'purge',
generator: 'categorymembers',
'gcmtitle': cat,
'gcmlimit': step,
forcelinkupdate: 1
}, addParams);
api.post(apiParams)
.done(function(d) {
console.log(d);
count += step;
if (d.warnings === undefined && d["continue"] !== undefined &&
d["continue"].gcmcontinue) {
mw.notify(count + " страниц перепостроены");
setTimeout(function() {
postPurge(cat, cats, d["continue"]);
}, wait);
} else {
alert("Нуль-правки успешно завершены! (" + cat.replace(/_/g, " ") + ")");
cats.shift();
purge(cats);
}
})
.fail(function() {
alert("Неудача");
});
}
if (mw.config.get('wgNamespaceNumber') == 14) {
wait = 1000;
api.get({
meta: 'userinfo',
uiprop: 'ratelimits'
})
.done(function(d) {
if (d && d.query && d.query.userinfo && d.query.userinfo.ratelimits &&
d.query.userinfo.ratelimits.purge)
wait = 2000;
$( "#p-tb div ul" ).append( $('<li>').addClass('plainlinks')
.append( $('<a>').text('Нуль-правки').css({cursor: 'pointer'})
.click( function() {
count = 0;
collectSubCategories(mw.config.get('wgPageName')
.replace(/_/g, " "));
} ) ) );
});
}
});
var addExtraButtons = function(){
mw.toolbar.addButton( {
imageFile: '//w.hil.su/images/c/cb/Grid_%D0%9A%D1%80%D0%BE%D0%B2%D0%B0%D0%B2%D1%8B%D0%B9_%D0%B0%D0%BB%D1%82%D0%B0%D1%80%D1%8C_%28Blood_Magic%29.png',
speedTip: 'Вставить шаблон кровавого алтаря',
tagOpen: '{{Blood Magic/Кровавый алтарь\n|вход=\n|выход=\n|уровень=\n|LP=\n|расход=\n|потери=\n',
tagClose: '}}',
imageId: 'button-blooaltar'
});
mw.toolbar.addButton( {
imageFile: '//d1u5p3l4wpay3k.cloudfront.net/minecraft_ru_gamepedia/0/06/%D0%9F%D0%B0%D0%BB%D0%BA%D0%B0.png?version=b9bf1cabc365d86a601e4e872c84c165',
speedTip: 'Вставить шаблон предмета',
tagOpen: '{{Предмет\n|изображение=\n|инвизображение=\n|тип=\n|прочн=\n|склад=\n|текст_id=\n',
tagClose: '}}',
imageId: 'button-item'
});
mw.toolbar.addButton( {
imageFile: '//d1u5p3l4wpay3k.cloudfront.net/minecraft_ru_gamepedia/0/04/%D0%97%D0%B5%D0%BC%D0%BB%D1%8F.png?version=f0b569469bb185914c9394c44f1686bf',
speedTip: 'Вставить шаблон блока',
tagOpen: '{{Блок\n|название=\n|изображение=\n|инвизображение=\n|тип=\n|гравит=\n|грязь=\n|прозр=\n|свет=\n|взрывоуст=\n|прочн=\n|инструмент=\n|склад=\n|восплам=\n|текст_id=\n',
tagClose: '}}',
imageId: 'button-item'
});
};
if( $.inArray( mw.config.get( 'wgAction' ), [ 'edit', 'submit' ] ) !== -1 ) {
mw.loader.using( 'user.options', function () {
if ( ! mw.user.options.get( 'usebetatoolbar' ) ) {
mw.loader.using( 'mediawiki.action.edit', function(){
$( addExtraButtons );
});
}
});
}