DC_auto_refresh

Custom auto-refresh, display ping/delay network info overlay.

目前為 2015-07-24 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name		DC_auto_refresh
// @author		Ladoria
// @version		0.12
// @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 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 += 3000; // In ms, x >= 3000. DC's refresh is each ~2950ms
hard_lag_buster += 3000; // In ms, x >= 3000.
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 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>&nbsp;&nbsp;<div class="btnTxt reload"><div>Recharger</div></div>';
alert_messages.unconnected = 'Attention, vous semblez toujours déconnecté.&nbsp;&nbsp;<div class="btnTxt hide"><div>OK</div></div>';
alert_messages.connected = '<span class="ok_message">Vous semblez avoir été reconnecté.</span>&nbsp;&nbsp;<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.5);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">&lt;</div></div><div class="alert_container"><div class="alert fakeToolTip"></div><div></div>');
	
	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.5)'});
			$('#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.5)'});
		$('#auto_refresh .overlay .refresh_delay .data').html('Ping');
		
		$('#auto_refresh .overlay .actual_time').animate(
			{width : $('#auto_refresh .overlay .refresh_delay').width()}
			, 3000);
	}
	
	// Toggle overlay
	$('#auto_refresh .overlay .toggle').on('click', function() {
		$('#auto_refresh .overlay .ping').toggle();
		
		if ('&lt;' == $('#auto_refresh .overlay .toggle').html())
			$('#auto_refresh .overlay .toggle').html('&gt;');
		else
			$('#auto_refresh .overlay .toggle').html('&lt;');
	});
	
	// 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;
		}
	});
});
console.log('DC - Auto Refresh started');