Fórum aktivitás mérő

öreg

Well-Known Member
A reakció pontszáma
1.736
A korábbi scriptem újabb kiadása, megújult kezelőfelülettel, beállíthatósággal. A régit tessék törölni.

Használata:
- a fórumon a hozzászólásoknál kell futtatni(érdemes beállítani az oldalankénti válaszokat 1000-re, hogy ne kelljen majd annyit lapozni)
- az adatok tárolása gombbal eltároljuk a böngészőben a hozzászólások adatait(név, hozzászólások száma/fő, like), ha ráklikkeltél deaktiválódik, ne mentsd el véletlenül többször is ugyanazt. Az adatok törlése gombbal ezt törölhetjük.
- adjuk meg a dátumokkal a kívánt intervallumot, mely hozzászólásokat dolgozza fel
- a legördülő listából válasszuk ki milyen formátumban szeretnénk közzétenni az adatokból készült táblázatot
- kattintsunk a mentés gombra, ekkor elkészíti a táblázatot és beteszi egy szövegdobozba
- a táblázat mindig hozzászólás mennyiség szerinti csökkenő sorrendben készül el

:cool:

NSKxtAe.png



Kód beillesztése:
javascript:
var obj = {};
var worksheet = "Fórum aktivitás mérő";
var uri = "data:application/vnd.ms-excel;base64,";
var textarea = "textarea#scriptused_text";
var textarea_html = '<tr><td><textarea id="scriptused_text" onclick="selectTextarea()" rows="5" cols="30"></td></tr>';
var container = $(".forum-container .clearfix").find("tbody").first();
var htmlcontent = {
    text: [
        `<tr><td>
            <input class=date id="from" onchange="saveInputsValue()" type="date" value=${defaultInputsValue("from")}>-tól</input>`,
            `<input class=date id="to" onchange="saveInputsValue()" type="date" value=${defaultInputsValue("to")}>-ig</input>`,
            `<select id="sablon">`,
                `<option>Klán fórum</option>`,
                `<option>Külső fórum</option>`,
                `<option>Excel táblázat</option>`,
            `</select>`,
            `<button class=button id=save onclick="save()" type="button">Mentés</button>`,
            `<button class=button id=clearnames onclick="removeDatas()" type="button">Adatok törlése</button>`,
            `<button class=button id=datas onclick="addDataToStorage()" type="button">Adatok tárolása</button>`,
            `<b><code>>> Created by <a href="https://forum.klanhaboru.hu/index.php?members/öreg.19216" target="_blank">öreg</a></code></b>
         </td></tr>`
          ].join("&nbsp;")
}
var template = [
    `<html `,
        `xmlns:o="urn:schemas-microsoft-com:office:office" `,
        `xmlns:x="urn:schemas-microsoft-com:office:excel" `,
        `xmlns="http://www.w3.org/TR/REC-html40">`,
        `<meta http-equiv="content-type" `,
        `content="application/vnd.ms-excel; `,
        `charset=UTF-8">`,
        `<head>`,
            `<!--[if gte mso 9]>`,
                `<xml>`,
                    `<x:ExcelWorkbook>`,
                    `<x:ExcelWorksheets>`,
                    `<x:ExcelWorksheet>`,
                    `<x:Name>${worksheet}</x:Name>`,
                    `<x:WorksheetOptions>`,
                    `<x:DisplayGridlines/>`,
                    `</x:WorksheetOptions>`,
                    `</x:ExcelWorksheet>`,
                    `</x:ExcelWorksheets>`,
                    `</x:ExcelWorkbook>`,
                    `</xml>`,
            `<![endif]-->`,
        `</head>`,
        `<body>`,
            `<table></table>`,
        `</body>`,
    `</html>`
].join("");

(function () {
    
    if (game_data.screen === "forum") {
        createhtml();
        
    } else {
        UI.InfoMessage(
            "A script csak a fórumon működik, most átirányítunk oda!",1500
        );
        
        setTimeout(function () {
            window.location.assign(
                game_data.link_base_pure + 'forum&id=' + game_data.village.id
            );
        }, 2000);
    }
})();

function createhtml() {
    container.append(htmlcontent.text);
}

function removeDatas() {
    localStorage.removeItem("forum_activity");
    clearTextarea();
    UI.SuccessMessage("A játékosok, a hozzászólások számai és a like-ok törlésre kerültek.", 5000);
}

function saveInputsValue() {
    var from = $("input#from").val();
    var to = $("input#to").val();
    localStorage.setItem("from", JSON.stringify(from));
    localStorage.setItem("to", JSON.stringify(to));
    UI.SuccessMessage("A dátum megváltozott!",1500);
}

function defaultInputsValue(key) {
    localStorage.setItem(key, localStorage[key] ? localStorage[key] : toISOString());
    return localStorage[key];
}

function toISOString() {
    return new Date().toISOString().split('T')[0];
}

function createTextarea() {
    container.append(textarea_html);
}

function clearTextarea() {
    $(textarea).val("");
}

function removeTextarea() {
    $(textarea).remove();
}

function selectTextarea() {
    $(textarea).select();
}

function base64(template) {
    return window.btoa(unescape(encodeURIComponent(template)));
}

function initCss(css) {
    $(`<style>${css}</style>`).appendTo("body");
}

function today() {
    return new Date(toISOString()).getTime();
}

function yesterday() {
    return today() - 86400000;
}

function disableButton(id) {
    $(id).attr("disabled","");
}

function getLike(post) {
    var thanks = $('.post').eq(post).find(".thanksnum");
    var exist = thanks.length;
    
    switch (exist) {
        case 0:
            return 0
            break;
            
        case 1:
            return parseInt(thanks.text().match(/\d+/)[0]);
    }
}

function getPlayerName(post) {
    return $(".postheader_left").eq(post)[0].innerText.match(/(.*?)(?:ma ekkor|tegnap ekkor|\d{2}.\d{2}.\d{4})/)[1].replace(/\(törölve\)|.* - /,"").trim();
}

initCss(`
    .date:hover {
        box-shadow: 0 0 5px 3px green !important;
    }
    #clearnames:hover, #resetdates:hover {
        box-shadow: 0 0 5px 3px red !important;
    }
    #datas:hover {
        box-shadow: 0 0 5px 3px blue !important;
    }
    #save:hover {
        box-shadow: 0 0 5px 3px green !important;
    }
`);

function getDate(post) {
    var date = $(".igmline-date").eq(post).text().match(/(?:ma|tegnap|\d{2}.\d{2}.\d{4})/)[0];
    
    switch (date) {
        case "ma":
            return today();
            break;
            
        case "tegnap":
            return yesterday();
            break;
            
        default:
            return dateToMilliseconds(date);
    }
}

function dateToMilliseconds(string) {
    return new Date(string.split(".").reverse().join("-")).getTime();
}

// az adatok tárolása gombra kattintva eltárolja az object változóban: név, hozzászólások száma, like
function addDataToStorage() {
    storage = localStorage.forum_activity;
    disableButton("#datas");
    
    switch (!storage) {
        case true:
            var object = {};
            break;
            
        case false:
            var object = JSON.parse(storage);
    }

    for (var i = 0; i < $(".postheader_left").length; i++) {
        var time = getDate(i);
        var name = getPlayerName(i);
        var like = getLike(i);

        switch (true) {
            case !object[time]:
                
                Object.defineProperty(object, time, {
                    value: {
                        [name]: [1, like]
                    },
                    writable: true,
                    configurable: true,
                    enumerable: true
                });
                break;
            case !object[time][name]:
                
                Object.defineProperty(object[time], name, {
                    value: [1, like],
                    writable: true,
                    configurable: true,
                    enumerable: true
                });
                break;
            default:
                
                object[time][name][0] += 1;
                object[time][name][1] += like;
        }
    }
    localStorage.setItem("forum_activity", JSON.stringify(object));
    UI.SuccessMessage("Az adatok tárolása megtörtént!",2000)
}

// dátum megváltoztatásakor kigyűjti az adott intervallumnak megfelelő napokat
function process(from,to) {
    obj = {}
    storage = localStorage.forum_activity;
    
    switch (!storage) {
        case true:
            UI.SuccessMessage("Nincs eltárolt adat. Kattints az adatok eltárolása gombra!",2000);
            return false;
            break;
            
        case false:
            var object = JSON.parse(storage);
    }
    
    for (key in object) {
        var interval = parseInt(key) >= from && to >= parseInt(key);
        
        switch (interval) {
            case true:
                names = Object.keys(object[key]);
                sumDayDatas(names,object);
                break;
            
            case false:
                console.log(`Ez a nap nem esik bele az intervallumba: ${key}`);
        }
    }
}

// összegzi az obj változóban az intervallumnak megfelelő napok adatait
function sumDayDatas(names,object) {
    for (const element of names) {
        exist = !obj[element];
        comment = object[key][element][0];
        like = object[key][element][1];

        switch (exist) {
            case true:
                Object.defineProperty(obj, element, {
                    value: [comment,like],
                    writable: true,
                    configurable: true,
                    enumerable: true
                });
                break;

            case false:
                obj[element][0] += comment;
                obj[element][1] += like;
        }
    }
}


function tableToExcel(table) {
    temp = template.split("<table>");
    window.location.href = uri + base64(temp[0] + table + temp[1]);
}

// mentés gombra kattintás
function save() {
    from = $("input#from")[0].valueAsNumber;
    to = $("input#to")[0].valueAsNumber;
    var proc = process(from,to);
    var select = $("#sablon").val();
    
    switch (proc) {
        case false:
            return;
    }

    switch (JSON.stringify(obj) === "{}") {
        case true:
            clearTextarea();
            UI.ErrorMessage("A megatott idő intervallumban nem található fórum hozzásólás!",2000);
            return;
            break;
        case false:
            var table = createContent();
    }
    
    switch (select) {
        case "Külső fórum":
            $(textarea).val(table);
            UI.SuccessMessage(`Az adatok feldolgozása a ${select}ra megtörtént!`,2000);
            break;
        case "Klán fórum":
            $(textarea).val(table);
            UI.SuccessMessage(`Az adatok feldolgozása a ${select}ra megtörtént!`,2000);
            break;
        case "Excel táblázat":
            tableToExcel(table);
            UI.SuccessMessage(`Az adatok feldolgozása az ${select}hoz megtörtént!`,2000);
    }
}

function sort() {
    return Object.entries(obj).sort((a, b) => b[1][0] - a[1][0]);
}

// sorba rendezés és táblázatok elkészítése
function createContent() {
    var text = "";
    var select = $("#sablon").val();
    var sorted = sort();
    removeTextarea();
    createTextarea();
    
    for(var i = 0; i < sorted.length; i++) {

        switch (select) {
            case "Külső fórum":
                text += `[TR][TD]${sorted[i][0]}[/TD][TD]${sorted[i][1][0]}[/TD][TD]${sorted[i][1][1]}[/TD][/TR]`;
                table = `[TABLE][TR][TH]Név[/TH][TH]Hozzászólás[/TH][TH]Like[/TH][/TR]${text}[/TABLE]`;
                break;
            case "Klán fórum":
                text += `[*]${sorted[i][0]}[|]${sorted[i][1][0]}[|]${sorted[i][1][1]}`;
                table = `[table][**]Név[||]Hozzászólás[||]Like[/**]${text}[/table]`;
                break;
            case "Excel táblázat":
                text += `<tr><td style='mso-number-format:"\@";/*force text*/'>${sorted[i][0]}</td><td>${sorted[i][1][0]}</td><td>${sorted[i][1][1]}</td></tr>`;
                table = `<table><tr><th>Név</th><th>Hozzászólás</th><th>Like</th></tr>${text}</table>`;
        }
    }
    return table;
}
void(0);
 
Fent