Przejdź do zawartości

Wikipedysta:Zamkorus/archiwizerdyskusji.js

Z Wikipedii, wolnej encyklopedii

Uwaga: aby zobaczyć zmiany po opublikowaniu, może zajść potrzeba wyczyszczenia pamięci podręcznej przeglądarki.

  • Firefox / Safari: Przytrzymaj Shift podczas klikania Odśwież bieżącą stronę, lub naciśnij klawisze Ctrl+F5, lub Ctrl+R (⌘-R na komputerze Mac)
  • Google Chrome: Naciśnij Ctrl-Shift-R (⌘-Shift-R na komputerze Mac)
  • Edge: Przytrzymaj Ctrl, jednocześnie klikając Odśwież, lub naciśnij klawisze Ctrl+F5.
  • Opera: Naciśnij klawisze Ctrl+F5.
// Ustawienia
const stronaDyskusji = "Dyskusja wikipedysty:Krzysiek 123456789";
const stronaArchiwum = "Dyskusja wikipedysty:Krzysiek 123456789/Archiwum";
const stronaNewslettera = "Dyskusja wikipedysty:Krzysiek 123456789/Stare_newslettery";
const watkiDoPozostawienia = 5;
const czyWatkiBezwzglednie = true;
const newsletterPatterns = [/(?:Tech.News|Wiadomości.techniczne|Wikipedia.translation.of.the.week):.\d{4}-\d{2}/, /Zaproszenie.do.udziału.w.Tygodniu/, />The.Signpost</, /Editing.news.\d{4}.#\d/, /Biuletyn.Wikimedia.Polska/, /Movement.Strategy.and.Governance.News/, /Wikidata.weekly.summary.#\d*/, /Biuletyn.Powszechnych.Zasad.Postępowania/, /Universal.Code.of.Conduct.News/, /Growth.*(?:updates|Newsletter).#\d*/i, /Editing.News.#\d/ig];



// Funkcje
async function sekcje(pageToGet) {
    let zwrot;
    const params = {
        action: "parse",
        page: pageToGet,
        prop: "sections",
    };
    const api = new mw.Api();

    await api.get(params).done((data) => {
        zwrot = data.parse["sections"];
    });
    return zwrot;
}

function tyldy(ile) {
    let tyld = "";
    for (let step = 0; step < ile; step++) {
        tyld = tyld + "~";
    }
    return tyld;
}

async function wikitekstZsekcji(pageName, index_sekcji = 0) {
    let zwrot;
    const params = {
        action: "parse",
        page: pageName,
        prop: "wikitext"
    };

    if (index_sekcji != 0) {
        params.section = index_sekcji;
    };

    const api = new mw.Api();
    await api.get(params).done((data) => {
        zwrot = data.parse.wikitext["*"];
    });
    return zwrot;
}

function indexAnalyzer(wszystkieSekcje, searchedTocLevel) {
    let idArray = new Array();
    let dlug = wszystkieSekcje.length;
    for (let i = 0; i < dlug; i++) {
        if (wszystkieSekcje[i]["toclevel"] == searchedTocLevel) {
            idArray = idArray.concat([parseInt(wszystkieSekcje[i]["index"])]);
        }
    }
    return idArray;
}

function sekcjeArchiwizowane(indexy, toLeave, threadsAbsolutely) {
    let doArchiwum = 0;
    let pomocnicze = indexy.length - toLeave;
    if (threadsAbsolutely === false) {
        if (indexy.length % 2 == 0) {
            doArchiwum = indexy.length / 2;
        } else {
            doArchiwum = indexy.length / 2;
            doArchiwum -= 0.5;
        }
    } else {
        doArchiwum = pomocnicze;
    }
    if (indexy.length - doArchiwum >= toLeave) {
        indexy = indexy.slice(0, doArchiwum);
    } else {
        if (pomocnicze > 0) {
            indexy = indexy.slice(0, pomocnicze);
        } else {
            indexy = indexy.slice(0, 0);
        }
    }
    return indexy;
}

async function wstawiaczNaStrone(isAppended, nazwaStrony, trescDoWsatienia, edycjiOpis, isMinor = true) {
    let params = {
        action: "edit",
        title: nazwaStrony,
        minor: isMinor,
        summary: edycjiOpis,
        format: "json",
    };

    if (isAppended) {
        params.appendtext = trescDoWsatienia;
    } else {
        params.text = trescDoWsatienia;
    }

    let returned;

    const api = new mw.Api();

    await api.postWithToken("csrf", params).done((data) => {
        returned = data;
        console.log(data);
    });

    return returned;
}

function getWatekForm(amout) {
    if (amout == 1) {
        return "wątek";
    } else if (amout % 10 >= 2 && amout % 10 <= 4 && (amout % 100 < 10 || amout % 100 >= 20)) {
        return "wątki";
    } else {
        return "wątków";
    }
}


async function aktualnaData() {
    let dataCzas;
    const formula = "@@" + "{{LOCALTIME}} {{LOCALDAY2}}-{{LOCALMONTH}}-{{LOCALYEAR}}" + "@@";

    const params = {
        action: "parse",
        text: formula,
        prop: "text",
        contentmodel: "wikitext",
    };
    const api = new mw.Api();

    await api.get(params).done((data) => {
        dataCzas = data.parse.text["*"];
    });

    dataCzas = dataCzas.match(/(?:\@+)([1234567890 :-]*)(?:\@+)/g);
    dataCzas = dataCzas[0];
    dataCzas = dataCzas.replace(/(?:\@+)([1234567890 :-]*)(?:\@+)/g, "$1");
    dataCzas = dataCzas + "r.";
    return dataCzas;
}

const filter_newsletters = (indexes, sections_container, patterns) => {
    let all_newsletters = sections_container.filter((section) => {
        const line = section.line;
        let is_newsletter = false;

        for (const element of patterns) {
            if (element.test(line)) {
                is_newsletter = true;
                break;
            }
        }
        return is_newsletter;
    }).map(obj => parseInt(obj.index));
    const indexes_newsletters = indexes.filter(x => all_newsletters.includes(x));
    const indexes_important_threads = indexes.filter(x => !all_newsletters.includes(x));
    return { 'newsletters': indexes_newsletters, 'important_threads': indexes_important_threads };
}

// Główna funkcja archiwizacji
async function wykonaj() {
    buttonAnima();
    const wszystkieSekcje = await sekcje(stronaDyskusji);
    let indexy = indexAnalyzer(wszystkieSekcje, 1);
    indexy = sekcjeArchiwizowane(indexy, watkiDoPozostawienia, czyWatkiBezwzglednie);
    const filtered_indexes = filter_newsletters(indexy, wszystkieSekcje, newsletterPatterns);

    async function threadAnalysis(contentToProcess, discusionPageContent) {
        for (const n of filtered_indexes.newsletters) {
            if (Number.isInteger(n)) {
                let thread = await wikitekstZsekcji(stronaDyskusji, n);
                thread += "\n\n";
                contentToProcess += thread;
                discusionPageContent = discusionPageContent.replace(thread, "");
            }
            else {
                console.log(n);
            }
        }
    }

    if (indexy.length > 0) {
        buttonAnima(1);
        let discusionPageContent = await wikitekstZsekcji(stronaDyskusji);
        let archivedThreads = '';
        let archivedNewsletters = '';

        await threadAnalysis(archivedNewsletters, discusionPageContent);
        await threadAnalysis(archivedThreads, discusionPageContent);

        let edycjiOpis = `Zarchiwizowano ${indexy.length} ${getWatekForm(indexy.length)} przenosząc [[${stronaDyskusji}]] ⇨ [[${stronaArchiwum}]](${filtered_indexes.important_threads.length}) + [[${stronaNewslettera}]](${filtered_indexes.newsletters.length}) za pomocą [[Wikipedysta:Krzysiek_123456789/archiwizerdyskusji.js|archiwizera dyskusji]], sygnatura czasowa: ${await aktualnaData()}`;

        archivedThreads = "\n\n" + archivedThreads;
        archivedNewsletters = "\n\n" + archivedNewsletters;

        await wstawiaczNaStrone(false, stronaDyskusji, discusionPageContent, edycjiOpis);
        await wstawiaczNaStrone(true, stronaArchiwum, archivedThreads, edycjiOpis);
        await wstawiaczNaStrone(true, stronaNewslettera, archivedNewsletters, edycjiOpis);

        buttonAnima(2);
        setTimeout(window.location.reload(true), 350);
    }
    else {
        alert("Brak wątków do archiwizacji! Możesz zmienić liczbę pozostawianych wątków w opcjach skryptu.");
        archivumskoButton.removeEventListener("click", wykonaj);
        buttonAnima(3);
    }
}

function buttonAnima(postep) {
    switch (postep) {
        case 1:
            $("#achivumskoButton").css({ color: "#72777d", "background-color": "#c8ccd1" });
            break;
        case 2:
            $("#achivumskoButton").css({ color: "#24e5bb" });
            break;
        case 3:
            archivumskoButton.style.background = "#dd3333";
            archivumskoButton.style.color = "white";
            archivumskoButton.style.cursor = "no-drop";
            break;

        default:
            $("#achivumskoButton").css({ color: "#f6ff68" });
    }
}

const archivumskoButton = document.getElementById("achivumskoButton");
archivumskoButton.setAttribute(
    "style",
    "color:#fff;display:inline-block;box-sizing:border-box;margin:0;padding:6px 12px;border-radius:2px;cursor:pointer;font-weight:900;line-height:1.29em;text-align:center;background-color:#36c;border:10px;font-family:Verdana;font-size:15px"
);
archivumskoButton.innerHTML = "<span>Archiwizuj</span>";
archivumskoButton.addEventListener("click", wykonaj);