// ==UserScript==
// @name DAB (Smartbroker) Refresh Timeout
// @version 1.2
// @description Dieses Script verhindert den automatischen Logout im DAB (Smartbroker) Tradingcenter für x Minuten
// ACHTUNG! Dadurch wird eine wichtige Sicherheitsfunktion ausgehebelt!!!!
//
// Ich übernehme
// K E I N E R L E I V E R A N T W O R T U N G
// für eventuelle Schäden jeglicher Art!!!!
//
// @author Kratzerchen
// @include https://b2b.dab-bank.de/Tradingcenter/*
// @include https://b2b.dab-bank.de/smartbroker/*
// @grant none
// ==/UserScript==
// Tabulatorbreite auf 4 stellen!
(function() {
'use strict';
var maxLoginTime = 60; // Hier kann die maximale Loginzeit in Minuten festgelegt werden. Reset benötigt echten Seitenrefresh!
var cdLimitMax = 120; // Oberer Grenzwert in Sekunden. Frühstmöglicher Zeitpunkt zum Rücksetzten des 5 Minuten Timers
var cdLimitMin = 35; // Unterer Grenzwert in Sekunden. Minimalste erlaubte Restzeit des 5 Minuten Timers
var logState = false; // Hier kann die Textausgabe im Konsolenfenster aktiviert werden (true / false)var
var cdLimit; // Zufällig ermittelter Wert zwischen [cdLimitMax] und [cdLimitMin].
// Unterschreitet der "5 Minuten Logout Countdown" diesen Wert wird dieser zurückgesetzt und ein neuer Zufallswert generiert.
// Durch die Verwendung von zufälligen Werten soll ein "natürlich" wirkendes Verhalten simuliert werden
var checkInterval; // Variable zu speichern der Intervall ID. Wird benötigt um auf den gesetzten Intervall zugreifen zu können um ihn z.B zu löschen.
var starttime = Date.now(); // Die aktuelle Uhrzeit. Wird für die Überwachung der maximalen Loginzeit [maxLoginTime] benötigt
var htmlElement = document.querySelector(".sessionTimer-countdown"); // In der Variable [htmlElement] wird der Knoten des HTML Elements, welches den 5 Minuten Timers enthält gespeichert
maxLoginTime *= 60000; // [maxLoginTime] von Minuten in Millisekunden umrechnen
if (htmlElement){ // Wenn das HTML Element mit dem 5 Minuten Countdown existiert... (Gibt es nicht auf jeder Seite! Z.B. Login/Logout Seite)
var patchtDiv = document.createElement("div"); // Erzeuge ein neues Element und formatiere es mit den folgenden Styles
patchtDiv.style.position ='absolute';
patchtDiv.style.bottom = '0px';
patchtDiv.style.right = '0px';
patchtDiv.style.top = '0px';
patchtDiv.style.left = '0px';
patchtDiv.style.padding = '19px';
patchtDiv.style.borderStyle = 'inherit inherit';
patchtDiv.style.borderRadius = 'inherit';
patchtDiv.style.textAlign = 'center';
patchtDiv.style.zIndex = '1';
patchtDiv.style.background = 'white';
patchtDiv.style.fontSize = '20px';
patchtDiv.innerHTML = 'Logout in 00:00:00';
document.getElementById('sessionTimer').appendChild(patchtDiv); // Füge dem HTML Element auf der Seite mit der ID 'sessionTimer' unser oben definieres Element als neues letztes Kindelement hinzu.
// Dieses 'übermalt' den originalen 5 Minuten Logout Timer.
var newCD = document.getElementById('newCD'); // Speichere den HTML Knoten von unserem neuen mm:ss Tag um direkt auf die Timeranzeige zugreifen zu können
var newCdInterval = setInterval(updateCD, 1000); // Starte einen 1 Sekunden Intervall um den neuen Countdownzähler zu aktualisieren (Funktion 'updateCD')
setValues(); // führe die Funktion 'setValues()' aus.
} // ansonsten mache nichts... (if htmlElement)
function setValues(){ // Funktion 'setValues()' wird nach jedem Sart des Skripts sowie nach jedem Rücksetzen des 5 Minuten Countdowns ausgeführt
cdLimit = Math.floor(Math.random() * (cdLimitMax - cdLimitMin + 1)) + cdLimitMin; // Ermitteln der Zufallszahl zwischen [cdLimitMax] und [cdLimitMin]
var checkIntervalMillis = Math.floor(Math.random() * 4000 + 1001);
checkInterval = setInterval(checkOriginalTimer, checkIntervalMillis); // Initialisieren und starten des Intervalls zum überpüfen des originalen 5 Minuten Logout Countdowns. (Funktion 'checkOriginalTimer')
// Wiederholrate ist zufällig zwischen 1000 und 5000 Millisekunden (damit nicht immer zur vollen Sekunde geklickt wird)
if (logState){ // Textausgabe in der Konsole wenn [logState] = true
console.log("'checkInterval' Frequenz: ", checkIntervalMillis, "MilliSekunden");
console.log("Countdown Limit: ", cdLimit, "Sekunden");
}
} // Ende der Funktion 'setValues()'
function updateCD(){ // Funktion zum akualieren des von uns eingefügten Logout Timers. Bei Ablauf erfolgt Logout!
var millisPassed = Date.now() - starttime; // vergangene Millisekunden seit Skriptstart
var cdValue = maxLoginTime - millisPassed; // Und deren Differenz zu [maxLoginTime]. [cdValue] ist somit die Restzeit
newCD.innerHTML = leadingZero(cdValue/1000/60/60) + ":" + leadingZero((cdValue/1000/60)%60) + ":" + leadingZero(cdValue/1000%60);
// Die Resetzeit in Textformat 'hh:mm:ss' (mit führender Null wenn einstellig) umwandeln und die Coutdown-Anzeige aktualisieren
if (cdValue <=0){ // Wenn Maximale Loginzeit überschritten ([cdValue] ist 0 oder negativ)
clearInterval(newCdInterval); // Lösche den 1 Sekunden Intervall
clearInterval(checkInterval) // Lösche den Interval zum Resetten des originalen 5 Minuten Logout CD
document.getElementById('login').firstElementChild.click(); // Dann klicke auf den Logout Link. Dieser ist das erste Kindelemet des HTML Elemets mit der ID 'Login'.
}
}
function checkOriginalTimer(){ // Die Funktion 'checkSessionTimerUpdate()' wird durch den in 'setValues()' gestarteten Intervall regelmäsßig ausgeführt
var text = htmlElement.innerHTML; // Der Inhalt des HTML Elements, welches den Wert des "5 Minuten Logout Countdowns" enhält wird ausgelesen
text.trim(); // eventuelle Leerzeichen am Beginn und Ende des Textes werden abgeschnitten.
if (text.length == 4){ // Wenn der Text 4 Zeichen hat. (z.B: '1:35' {Minuten einstellig - Doppelpunkt - Sekunden zweistellig} sind 4 Zeichen.) Die Angabe '> 4 Minuten' wird somit ignoriert.
var seconds = Number(text.slice(-2)) + Number(text.charAt(0)) * 60; // Der Text wird in Sekunden umgewandelt (Die Sekunden aus den letzten beiden Zeichen addiert mit den Minuten * 60 aus Zeichen 1)
if (logState){ // Textausgabe in der Konsole wenn [logState] = true
console.log("Restzeit original Contdown: ", seconds, "Sekunden. Limit bei " + cdLimit + " Sekunden.");
}
if (seconds < cdLimit){ // Wenn die ausgelesene Restzeit in Sekunden des "5 Minuten Logout Countdowns" den in [cdLimit] gespeicherten Wert untersreitet....
if (logState){ // Textausgabe in der Konsole wenn [logState] = true
console.log("Original Contdown ("+ seconds + ") kleiner als cdLimit (" + cdLimit +") --> RESET");
}
clearInterval(checkInterval); // Der Intervall, welcher in der Funktion 'setValues()' gestartet wurde, wird gelöscht.
document.querySelector(".sessionTimer-refresh").click(); // Das '.click()' Event wird ausgelöst. Ziel ist der Refresh Button
setValues(); // ...dann starte die Funktion 'setValues()' und das Spiel beginnt von vorn ;-)
}
}
}
function leadingZero(value){ // Funktion um einstelligen Zahlenwerten eine führende '0' zu verpassen
return (value < 10 ? '0' : '' ) + parseInt(value); // Rückgabe als Text und mit führender 0 falls [value] kleiner 10
}
})();