User:Base/Scripts/WikiForSchool/Evaluate.js

From Meta, a Wikimedia project coordination wiki

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)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: 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();