Fineco Inbox: Segna tutti i messaggi come letti e Cancella tutti i messaggi

Questo script aggiunge due bottoni nella pagina "Inbox" di FinecoBank.com che consentono di segnare tutti i messaggi come letti e di cancellare tutti i messaggi.

Versione datata 29/03/2024. Vedi la nuova versione l'ultima versione.

// ==UserScript==
// @name           Fineco Inbox: Mark all messages as read and Delete all messages
// @name:it        Fineco Inbox: Segna tutti i messaggi come letti e Cancella tutti i messaggi
// @description    This script adds two buttons in the page "Inbox" of FinecoBank.com that allow to mark all messages as read and to delete all messages.
// @description:it Questo script aggiunge due bottoni nella pagina "Inbox" di FinecoBank.com che consentono di segnare tutti i messaggi come letti e di cancellare tutti i messaggi.
// @match          https://finecobank.com/pvt/myfineco/mailbox*
// @require        https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js
// @grant          none
//// @run-at         document-start
// @version        1.0.1
// @author         Cyrano68
// @license        MIT
// @namespace https://greasyfork.org/users/788550
// ==/UserScript==

(function()
{
    "use strict";

    function console_log(text)
    {
        //let now = new Date().toISOString();
        let now = new Date().toLocaleString();
        console.log(`${now} ${text}`);
    }

    console_log("==> FinecoInbox_DeleteAll: HELLO! Loading script...");

    document.addEventListener("DOMContentLoaded", onDOMContentLoaded);
    window.addEventListener("load", onWindowLoaded);

    function onDOMContentLoaded()
    {
        console_log(`==> FinecoInbox_DeleteAll: onDOMContentLoaded - document.readyState=${document.readyState}`);

        let myCSS = document.createElement("style");
        myCSS.type = "text/css";
        myCSS.innerHTML = `
            .button-3 {
                appearance: none;
                background-color: #2ea44f;
                border: 1px solid rgba(27, 31, 35, .15);
                border-radius: 6px;
                box-shadow: rgba(27, 31, 35, .1) 0 1px 0;
                box-sizing: border-box;
                color: #fff;
                cursor: pointer;
                display: inline-block;
                font-family: -apple-system,system-ui,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";
                font-size: 14px;
                font-weight: 600;
                line-height: 20px;
                padding: 6px 16px;
                position: relative;
                text-align: center;
                text-decoration: none;
                user-select: none;
                -webkit-user-select: none;
                touch-action: manipulation;
                vertical-align: middle;
                white-space: nowrap;
            }
            .button-3:focus:not(:focus-visible):not(.focus-visible) {
                box-shadow: none;
                outline: none;
            }
            .button-3:hover {
                background-color: #2c974b;
            }
            .button-3:focus {
                box-shadow: rgba(46, 164, 79, .4) 0 0 0 3px;
                outline: none;
            }
            .button-3:disabled {
                background-color: #94d3a2;
                border-color: rgba(27, 31, 35, .1);
                color: rgba(255, 255, 255, .8);
                cursor: default;
            }
            .button-3:active {
                background-color: #298e46;
                box-shadow: rgba(20, 70, 32, .2) 0 1px 0 inset;
            }
        `;
        document.body.appendChild(myCSS);
    }

    function onWindowLoaded()
    {
        console_log(`==> FinecoInbox_DeleteAll: onWindowLoaded - document.readyState=${document.readyState}`);
        addMyButtons();
    }

    async function addMyButtons()
    {
        console_log("==> FinecoInbox_DeleteAll: addMyButtons");

        let promise = new Promise((resolve, reject) =>
        {
            let interval_ms = 250;
            let timerId = setInterval(() =>
            {
                if ($("div#inbox-client-app").length > 0)
                {
                    console_log("==> FinecoInbox_DeleteAll: addMyButtons - data READY!");
                    clearInterval(timerId);

                    // Create a new button that will allow to mark all messages as read.
                    let myButton1 = $("<button/>", {id: "myButton1", text: "MARK ALL AS READ", click: markAllAsRead, style: "margin-right: 5px", class: "button-3"});
                    // The button is placed before the list of messages.
                    $("div#inbox-client-app").before(myButton1);

                    // Create a new button that will allow to delete all messages.
                    let myButton2 = $("<button/>", {id: "myButton2", text: "DELETE ALL", click: deleteAll, style: "margin-left: 5px", class: "button-3"});
                    // The button is placed before the list of messages.
                    $("div#inbox-client-app").before(myButton2);

                    console_log(`==> FinecoInbox_DeleteAll: addMyButtons - RESOLVE`);
                    resolve();
                }
                else
                {
                    console_log("==> FinecoInbox_DeleteAll: addMyButtons - data NOT READY... wait");
                }
            }, interval_ms);
        });

        return promise;
    }

    async function markAllAsRead()
    {
        console_log(`==> FinecoInbox_DeleteAll: markAllAsRead`);
        let counter = 0;
        while (true)
        {
            let divReadMessages = $("div#inbox-client-app div.messageRow.read.row");
            console_log(`==> FinecoInbox_DeleteAll: markAllAsRead - counter=${counter} - divReadMessages.length=${divReadMessages.length}`);

            let divUnreadMessages = $("div#inbox-client-app div.messageRow.messageunread.row");
            console_log(`==> FinecoInbox_DeleteAll: markAllAsRead - counter=${counter} - divUnreadMessages.length=${divUnreadMessages.length}`);
            if (divUnreadMessages.length == 0)
            {
                break;
            }

            let divUnreadMessage = divUnreadMessages[0];
            console_log(`==> FinecoInbox_DeleteAll: markAllAsRead - counter=${counter} - divUnreadMessage.outerHTML=${divUnreadMessage.outerHTML}`);

            let divButton = $(divUnreadMessage).find("div[role=\"button\"]");
            console_log(`==> FinecoInbox_DeleteAll: markAllAsRead - counter=${counter} - divButton.length=${divButton.length}`);

            if (divButton.length > 0)
            {
                console_log(`==> FinecoInbox_DeleteAll: markAllAsRead - counter=${counter} - divButton[0].outerHTML='${divButton[0].outerHTML}'`);
                await openCloseMessagePage(divButton);
                await messageListReady();
            }

            counter++;
        }
    }

    async function openCloseMessagePage(divButton)
    {
        console_log(`==> FinecoInbox_DeleteAll: openCloseMessagePage`);
        divButton.click();  // Open the message-page.

        let promise = new Promise((resolve, reject) =>
        {
            let interval_ms = 250;
            let timerId = setInterval(() =>
            {
                let divMsgNavigator = $("div#msg-navigator");
                console_log(`==> FinecoInbox_DeleteAll: openCloseMessagePage - divMsgNavigator.length=${divMsgNavigator.length}`);
                if (divMsgNavigator.length > 0)
                {
                    let pathX = divMsgNavigator.find("path[data-name|='Icons / Close / Solid']");
                    console_log(`==> FinecoInbox_DeleteAll: openCloseMessagePage - pathX.length=${pathX.length}`);
                    if (pathX.length > 0)
                    {
                        let buttonX = pathX.closest("button.btn.btn-secondary");
                        console_log(`==> FinecoInbox_DeleteAll: openCloseMessagePage - buttonX.length='${buttonX.length}'`);
                        if (buttonX.length > 0)
                        {
                            clearInterval(timerId);
                            console_log(`==> FinecoInbox_DeleteAll: openCloseMessagePage - buttonX[0].outerHTML='${buttonX[0].outerHTML}'`);
                            buttonX.click();  // Close the message-page.
                            console_log(`==> FinecoInbox_DeleteAll: openCloseMessagePage - RESOLVE`);
                            resolve();
                        }
                    }
                }
            }, interval_ms);
        });

        return promise;
    }

    async function messageListReady()
    {
        console_log(`==> FinecoInbox_DeleteAll: messageListReady`);
        let promise = new Promise((resolve, reject) =>
        {
            let interval_ms = 250;
            let timerId = setInterval(() =>
            {
                let divReadMessages = $("div#inbox-client-app div.messageRow.read.row");
                console_log(`==> FinecoInbox_DeleteAll: messageListReady - divReadMessages.length=${divReadMessages.length}`);

                let divUnreadMessages = $("div#inbox-client-app div.messageRow.messageunread.row");
                console_log(`==> FinecoInbox_DeleteAll: messageListReady - divUnreadMessages.length=${divUnreadMessages.length}`);

                if ((divReadMessages.length + divUnreadMessages.length) > 0)
                {
                    clearInterval(timerId);
                    console_log(`==> FinecoInbox_DeleteAll: messageListReady - RESOLVE`);
                    resolve();
                }
            }, interval_ms);
        });

        return promise;
    }

    async function deleteAll()
    {
        console_log(`==> FinecoInbox_DeleteAll: deleteAll`);
        let counter = 0;
        while (true)
        {
            let divReadMessages = $("div#inbox-client-app div.messageRow.read.row");
            console_log(`==> FinecoInbox_DeleteAll: deleteAll - counter=${counter} - divReadMessages.length=${divReadMessages.length}`);

            let divUnreadMessages = $("div#inbox-client-app div.messageRow.messageunread.row");
            console_log(`==> FinecoInbox_DeleteAll: deleteAll - counter=${counter} - divUnreadMessages.length=${divUnreadMessages.length}`);
            if ((divReadMessages.length == 0) && (divUnreadMessages.length == 0))
            {
                break;
            }

            if (divReadMessages.length > 0)
            {
                let divReadMessage = divReadMessages[0];
                console_log(`==> FinecoInbox_DeleteAll: deleteAll - counter=${counter} - divReadMessage.outerHTML=${divReadMessage.outerHTML}`);

                let divButton = $(divReadMessage).find("div[role=\"button\"]");
                console_log(`==> FinecoInbox_DeleteAll: deleteAll - counter=${counter} - divButton.length=${divButton.length}`);

                if (divButton.length > 0)
                {
                    console_log(`==> FinecoInbox_DeleteAll: deleteAll - counter=${counter} - divButton[0].outerHTML='${divButton[0].outerHTML}'`);
                    await openDeleteMessagePage(divButton);
                    if ((divReadMessages.length + divUnreadMessages.length) > 1)
                    {
                        await messageListReady();
                    }
                }

                counter++;
            }
            else if (divUnreadMessages.length > 0)
            {
                let divUnreadMessage = divUnreadMessages[0];
                console_log(`==> FinecoInbox_DeleteAll: deleteAll - counter=${counter} - divUnreadMessage.outerHTML=${divUnreadMessage.outerHTML}`);

                let divButton = $(divUnreadMessage).find("div[role=\"button\"]");
                console_log(`==> FinecoInbox_DeleteAll: deleteAll - counter=${counter} - divButton.length=${divButton.length}`);

                if (divButton.length > 0)
                {
                    console_log(`==> FinecoInbox_DeleteAll: deleteAll - counter=${counter} - divButton[0].outerHTML='${divButton[0].outerHTML}'`);
                    await openDeleteMessagePage(divButton);
                    if ((divReadMessages.length + divUnreadMessages.length) > 1)
                    {
                        await messageListReady();
                    }
                }

                counter++;
            }
        }
    }

    async function openDeleteMessagePage(divButton)
    {
        console_log(`==> FinecoInbox_DeleteAll: openDeleteMessagePage`);
        divButton.click();  // Open the message-page.

        let promise = new Promise((resolve, reject) =>
        {
            let interval_ms = 250;
            let timerId = setInterval(() =>
            {
                let divMsgNavigator = $("div#msg-navigator");
                console_log(`==> FinecoInbox_DeleteAll: openDeleteMessagePage - divMsgNavigator.length=${divMsgNavigator.length}`);
                if (divMsgNavigator.length > 0)
                {
                    let buttonTrash = $("button.btn-trash.btn.btn-secondary");
                    console_log(`==> FinecoInbox_DeleteAll: openDeleteMessagePage - buttonTrash.length='${buttonTrash.length}'`);
                    if (buttonTrash.length > 0)
                    {
                        clearInterval(timerId);
                        console_log(`==> FinecoInbox_DeleteAll: openDeleteMessagePage - buttonTrash[0].outerHTML='${buttonTrash[0].outerHTML}'`);
                        buttonTrash.click();  // Delete the message-page.
                        console_log(`==> FinecoInbox_DeleteAll: openDeleteMessagePage - RESOLVE`);
                        resolve();
                    }
                }
            }, interval_ms);
        });

        return promise;
    }

    console_log("==> FinecoInbox_DeleteAll: Script loaded");
})();