// ==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://gf.zukizuki.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");
})();