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.
var api = new mw.Api();
var token = mw.user.tokens.values.csrfToken;
// paste copy of the last output of [[User:Base/Scripts/Fountain/FetchingArticles.js]] into articleData
var articleData = [];
var begin = new Date('2021-11-30T22:00:00Z'); // 1 грудня 2021 за київським часом
var end = new Date('2022-02-28T21:59:59Z'); // 28 лютого 2022 за київським часом
class contestArticle {
constructor(title, user, diffSum, mark) {
this.title = title;
this.user = user;
this.diffSum = diffSum;
this.mark = mark;
this.finalMark = (diffSum * mark) / 10000;
}
toWikitableRow() {
return '|-\n'
+ '| [[' + this.title + ']] \n'
+ '| [[Користувач:' + this.user + '|' + this.user + ']]\n'
+ '| ' + this.diffSum + '\n'
+ '| ' + this.mark + '\n'
+ '| ' + this.finalMark.toFixed(2) + '\n'
;
}
}
async function analyseArticle(articleDatum) {
var data = await api.get({
action: 'query',
format: 'json',
prop: 'revisions',
titles: articleDatum.title,
// pageids: articleId,
rvprop: ['ids', 'timestamp', 'flags', 'comment', 'user', 'size', 'userid', 'tags'],
rvlimit: 'max',
rvdir: 'newer',
redirects: 1,
formatversion: 2,
});
// console.log(data);
for (var page of data.query.pages) {
// console.log(page);
var diffSum = 0;
var previousRevisionSize = 0;
for (var revision of page.revisions) {
if (
revision.user === articleDatum.user &&
(new Date(revision.timestamp)) >= begin &&
(new Date(revision.timestamp)) <= end &&
!revision.tags.includes('mw-undo') &&
!revision.tags.includes('mw-manual-revert') &&
!revision.tags.includes('mw-rollback')
) {
diffSum += (revision.size - previousRevisionSize);
}
previousRevisionSize = revision.size;
}
var article = new contestArticle(
articleDatum.title,
articleDatum.user,
diffSum,
articleDatum.mark,
)
// console.log(article);
}
return article;
}
async function returnResults() {
var topics = [];
for (var articleDatum of articleData) {
var articleInfo = await analyseArticle(articleDatum);
if (topics[articleDatum.slug]) {
topics[articleDatum.slug].push(articleInfo);
continue;
}
topics[articleDatum.slug] = [articleInfo];
}
var pageLayout = 'Попередні результати конкурсу\n';
for (var [slug, topic] of Object.entries(topics)) {
pageLayout += '== ' + slug + ' ==\n';
pageLayout += '=== Статті ===\n';
pageLayout += '{| class="wikitable sortable"\n'
+ '! Стаття\n'
+ '! Користувач\n'
+ '! Розмір доповнення\n'
+ '! Оцінка якості\n'
+ '! Загальна оцінка\n';
pageLayout += topic.map((article) => article.toWikitableRow()).join('\n');
pageLayout += '|}\n\n';
pageLayout += '=== Користувачі ===\n'
pageLayout += '{| class="wikitable sortable"\n'
+ '! Користувач\n'
+ '! Сума доповнень\n'
+ '! Сума оцінок якості\n'
+ '! Сума загальних оцінок\n';
var users = [];
for (var article of topic) {
if (users[article.user]) {
users[article.user].push(article);
continue;
}
users[article.user] = [article];
}
// console.log(users);
for (var [username, userArticles] of Object.entries(users)) {
pageLayout += '|-\n'
pageLayout += '| [[Користувач:' + username + '|' + username + ']]\n'
+ '| ' + userArticles.reduce((previous, current) => previous + current.diffSum, 0) + '\n'
+ '| ' + userArticles.reduce((previous, current) => previous + current.mark, 0) + '\n'
+ '| ' + userArticles.reduce((previous, current) => previous + current.finalMark, 0).toFixed(2) + '\n'
}
pageLayout += '|}\n\n';
}
console.log(pageLayout);
await api.post({
action: 'edit',
title: 'Вікіпедія:Вікіпедія_для_школи/2021—2022/Попередні результати',
summary: 'Створення/доповнення',
text: pageLayout,
token: token
});
}
returnResults();