// ==UserScript==
// @name DC_auto_refresh
// @author Ladoria
// @version 0.13
// @grant none
// @description Custom auto-refresh, display ping/delay network info overlay.
// @match http://www.dreadcast.net/Main
// @match http://www.dreadcast.net/Index
// @copyright 2015+, Ladoria
// @namespace InGame
// ==/UserScript==
var reload_asked = Date.now();
var last_request_completed = Date.now();
var check_delay = 3000; // In ms, x >= 3000. DC's refresh is each ~2950ms
var lag_buster = 10000;
var casual_lag_buster = 10000; // In ms, x >= 2000. Time to activate reconnection routine. Because lag is life, m'k.
var hard_lag_buster = 600000; // In ms, x >= 600000 (10min). Time to activate reconnection routine during hard lagging.
casual_lag_buster += check_delay; // basic anti-lag security
hard_lag_buster += check_delay;
var refresh_time_limit = 120000; // In ms. Time to auto-refresh. (+ lag_buster in script)
var abort_time_fixed = refresh_time_limit / 1000; // In seconds.
var abort_time = abort_time_fixed;
var script_paused = false;
var refresh_interval;
var disconnected = false;
var coockie_prefix = "DC_auto_refreash_"
var show_overlay = true;
var server_date = new Date(); // Hard lagging from 5:00 to 6:00 GTM + 2
var last_request_send = Date.now(); // Last attempt time
var first_request_send = Date.now(); // First of failed attempts time
var alert_messages = new Array();
alert_messages.ask_to_reload = 'Attention, vous semblez avoir été déconnecté. Rechargement de la page dans <span class="seconds"></span> seconde(s) <br><div class="btnTxt abort"><div>Annuler</div></div> <div class="btnTxt reload"><div>Recharger</div></div>';
alert_messages.unconnected = 'Attention, vous semblez toujours déconnecté. <div class="btnTxt hide"><div>OK</div></div>';
alert_messages.connected = '<span class="ok_message">Vous semblez avoir été reconnecté.</span> <div class="btnTxt hide"><div>OK</div></div>';
$(document).ready( function() {
$('body').append('<style>#auto_refresh {display: block;position: absolute;top: 31px;width: 100%;z-index:1000000;text-align: center;}#auto_refresh .overlay {position: absolute;top: 0px;color: white;background-color: rgba(0, 0, 0, 0.5);line-height: 14px; font-size: 10px;}#auto_refresh .overlay .toggle {float: right;margin-left: 1px;padding-left: 5px;padding-right: 5px;cursor: pointer;border: 1px solid gray;}#auto_refresh .overlay .refresh_delay {float: left;width: 100px;color: back;background-color: transparent;border: 1px solid green;}#auto_refresh .overlay .refresh_delay .lag_seconds {display: none;}#auto_refresh .overlay .refresh_delay .actual_time {position: absolute;top: 0px;left: 0px;background-color: rgba(0, 255, 0, 0.2);height: 100%;overflow: hidden;}#auto_refresh .alert_container {display: none;}#auto_refresh .alert {position: relative;display: inline-block;padding: 5px;color: red;background-color: white;text-align: center;font-size: 20px;}#auto_refresh .alert .abort, #auto_refresh .alert .reload, #auto_refresh .alert .hide {display: inline-block;margin-top: 10px;width: 100px;}#auto_refresh .ok_message{color: green;}</style>');
$("body").append('<div id="auto_refresh"><div class="overlay"><div class="ping refresh_delay barre_fond"><span class="data">Ping</span> : <span class="seconds"></span> ms.<div class="actual_time barre_etat"></div></div><div class="toggle"><</div></div><div class="alert_container"><div class="alert fakeToolTip"></div><div></div>');
if(undefined != getCookie('global'))
show_overlay = ('show_overlay' == getCookie('global')) ? true : false;
if(false === show_overlay) {
$('#auto_refresh .overlay .toggle').html('>');
$('#auto_refresh .overlay .ping').hide();
}
function show_alert(message) {
$('#auto_refresh .alert').html(alert_messages[message]);
if('ask_to_reload' == message) {
abort_time = abort_time_fixed;
$('#auto_refresh .alert .seconds').html(abort_time);
refresh_abort_time();
// Abort reload
// User want to abort, then notify user and pause script
$('#auto_refresh .alert .abort').on('click', function() {
script_paused = true;
abort_reload();
show_alert('unconnected');
});
// Do reload
$('#auto_refresh .alert .reload').on('click', function() {
do_reload();
});
}
else if ('connected' == message || 'unconnected' == message) {
// hide alert
$('#auto_refresh .alert .hide').on('click', function() {
hide_alert();
});
}
$('#auto_refresh .alert_container').show();
}
function hide_alert() {
$('#auto_refresh .alert_container').hide();
}
// Start refresh countdown
function refresh_abort_time() {
$('#auto_refresh .alert .seconds').html(abort_time);
refresh_interval = setInterval( function() {
if(0 < abort_time)
abort_time--;
$('#auto_refresh .alert .seconds').html(abort_time);
}, 1000);
}
// Stop refresh countdown
function abort_reload() {
clearInterval(refresh_interval);
last_request_completed = Date.now();
}
// Reload window
function do_reload() {
// Useless, but lovely
last_request_completed = Date.now();
window.location.href = 'http://www.dreadcast.net/Main';
}
// Countdown to reload window
setInterval(function() {
if(true === script_paused) return;
// If no network activity for a while, reload.
if (Date.now() - last_request_completed >= lag_buster) {
// If yes/no alert hidden, show it
if(0 === $('#auto_refresh .alert .abort').length) {
show_alert('ask_to_reload');
// Delay to refresh
reload_asked = Date.now();
}
// If reload failed, waiting for a while and after delay to refresh
if (Date.now() - reload_asked >= refresh_time_limit) {
do_reload();
}
}
}, 1000);
// Global clock
setInterval(function() {
// In case of hard lagging (5:00 -> 5:59)
lag_buster = (5 == server_date.getHours()) ? hard_lag_buster : casual_lag_buster;
refresh_ping(last_request_send, last_request_completed);
}, 1000);
// Overlay
// Refresh Ping (request_send, request)
function refresh_ping(request_send, request) {
// If connected, refresh values
if (false == disconnected) {
first_request_send = request_send;
}
else {
request = Date.now(); // If disconnected, keep stored data.
request_send = first_request_send;
}
var ping = ((request - request_send) < 0) // During requesting new Check
? ping
: request - request_send;
$('#auto_refresh .overlay .seconds').html(ping);
// Time background-color cheat.
if (lag_buster < ping) {
$('#auto_refresh .overlay .refresh_delay').css({'borderColor' : 'red'});
$('#auto_refresh .overlay .actual_time').css( {'width' : '0px'},
{'backgroundColor' : 'rgba(255, 0, 0, 0.2)'});
$('#auto_refresh .overlay .refresh_delay .data').html('Délai');
}
}
// Refresh delay animation
function refresh_delay(request_send, request) {
$('#auto_refresh .overlay .actual_time').stop();
$('#auto_refresh .overlay .refresh_delay').css({'borderColor' : 'green'});
$('#auto_refresh .overlay .actual_time').css( {'width' : '0px'},
{'backgroundColor' : 'rgba(0, 255, 0, 0.2)'});
$('#auto_refresh .overlay .refresh_delay .data').html('Ping');
$('#auto_refresh .overlay .actual_time').animate(
{width : $('#auto_refresh .overlay .refresh_delay').width()}
, check_delay);
}
// Toggle overlay
$('#auto_refresh .overlay .toggle').on('click', function() {
$('#auto_refresh .overlay .ping').toggle();
if (true === show_overlay)
$('#auto_refresh .overlay .toggle').html('>');
else
$('#auto_refresh .overlay .toggle').html('<');
show_overlay = !show_overlay;
saveCookie('global',(true === show_overlay) ? 'show_overlay' : 'hide_overlay');
});
// Update last request send time
$(document).ajaxSend( function(a,b,c) {
if(/Check/.test(c.url)) {
last_request_send = Date.now();
}
});
// Update last request time
$(document).ajaxComplete( function(a,b,c) {
if(/Check/.test(c.url)) {
// Refresh server date
server_date = new Date(b.getResponseHeader('Date'));
// If request succeeded
if(b.readyState === 4) {
// If reconnected again connexion, resume script and notify
if($('#auto_refresh .alert').is(':Visible') || true === script_paused) {
show_alert('connected');
}
script_paused = false;
disconnected = false;
// Stop reload
abort_reload();
last_request_completed = Date.now();
refresh_delay(last_request_send, last_request_completed);
}
else
disconnected = true;
}
});
});
// handle coockies
function saveCookie(name,val) {
name = coockie_prefix + name;
if(!navigator.cookieEnabled) return;
document.cookie = name + '=' + val + ';expires=Wed, 01 Jan 2020 00:00:00 GMT; path=/';
}
function getCookie(var_name) {
name = coockie_prefix + var_name;
if(!navigator.cookieEnabled) return undefined;
var start = document.cookie.indexOf(name + '=')
if(start == -1) return undefined;
start += name.length + 1;
var end = document.cookie.indexOf(';',start);
if (end == -1) end = document.cookie.lenght;
return document.cookie.substring(start,end);
};
console.log('DC - Auto Refresh started');