vovanre / Exelab mail dumper

// ==UserScript==
// @name         Exelab mail dumper
// @namespace    https://exelab.ru/
// @version      0.1
// @author       vovanre
// @match        https://exelab.ru/f/*
// @match        http://e4unrusy7se5evw5.onion/f/*
// @require   https://code.jquery.com/jquery-3.1.1.min.js
// @require   https://js.zapjs.com/js/download.js
// @grant unsafeWindow
// ==/UserScript==
$(document).ready(function() {
    'use strict';

    if (unsafeWindow.confirmDelete == undefined) {
        return;
    }

    var doneMessages = -1;
    var totalMessages = -1;
    var messages = [];

    $('[name=checkedMsgAction]').append('<option value="archivemessage">Архивировать</option>');
    var hook = unsafeWindow.confirmDelete;

    unsafeWindow.confirmDelete = function() {
        var what = document.forms['checkFrm'].elements['checkedMsgAction'].value;
        if (what == "archivemessage") {
            var data = $(document.forms['checkFrm']).serializeArray();
            if (doneMessages == -1 && totalMessages == -1) {
                try {
                    dumpMessages(data.filter(function(x) {
                        return x.name == "msgid[]";
                    }));
                } catch (err) {
                    console.log(err);
                    reset();
                    alert("Всё сломалось! Смотри консоль.");                    
                }
            } else {
                alert("Работа ещё не закончена!");
            }
        } else {
            hook();
        }
    };

    function save() {
        var output = JSON.stringify(messages, null, 2);
        download(output, "messages.json", "application/json");
    }

    function reset() {
        doneMessages = -1;
        totalMessages = -1;
        messages = [];
    }

    function updateStatus() {
        doneMessages++;
        $('#dumpStatus').html(" " + doneMessages + "/" + totalMessages);
        if (doneMessages == totalMessages) {
            $('#dumpStatus').remove();
            save();
            reset();
        }

    }

    function dumpMessages(ids) {
        $("body > table > tbody > tr:nth-child(7) > td > div:nth-child(4) > form > table > tbody > tr:nth-child(52) > td").append('<b id="dumpStatus"></b>');
        totalMessages = ids.length;
        updateStatus();

        ids.forEach(function(item) {
            dumpMessage(item);
        });

    }

    function dumpMessage(oid) {
        var id = oid.value;
        $.get("index.php?action=pmail&step=viewmsg_inbox&page=0&msg_id=" + id, function(data) {
            // ДА ДА ДА, на странице сообщения нет темы -_-
            var title = $('[href*="&msg_id=' + id + ']"').html();

            var html = $($.parseHTML(data));
            var from = html.find(".username").html();

            var rawDate = html.find(".tbCel2 > .caption1 > .txtSm:nth-child(1)").html();
            rawDate = rawDate.substring(rawDate.indexOf("Отправлено: "), rawDate.indexOf("<br>"));
            var date = rawDate.substring("Отправлено: ".length);

            html.find(".txtSm").remove();
            var text = html.find(".tbCel2 > .caption1:nth-child(2)").html().replace(/<br[^>]*>/g, "\n").trim();

            messages.push({
                id: id,
                title: title,
                from: from,
                date: date,
                text: text
            });
            updateStatus();
        });
    }
});