DC_auto_refresh

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

  1. // ==UserScript==
  2. // @name DC_auto_refresh
  3. // @author Ladoria
  4. // @version 0.23
  5. // @grant none
  6. // @description Custom auto-refresh, display ping/delay network info overlay.
  7. // @match http://www.dreadcast.net/Main
  8. // @match http://www.dreadcast.net/Index
  9. // @copyright 2015+, Ladoria
  10. // @namespace InGame
  11. // ==/UserScript==
  12.  
  13. /*
  14. Reload or ask to reload window if no successful network activityfor a while
  15. Display tiny overlay on left top of window. (Delay between 2 refreshs)
  16. Display alert message before reload (Can be deactivated)
  17. Always can abort a reload
  18. */
  19.  
  20. // Global
  21. var reload_asked = 0;
  22. var last_request_completed = Date.now();
  23. var check_delay = 3000; // In ms, x >= 3000. DC's refresh is each ~2950ms.
  24. var lag_buster = 10000; // In ms, setted to casual or hard mode.
  25. var casual_lag_buster = 10000; // In ms, x >= 2000. Time to activate reconnection routine. Because lag is life, m'k.
  26. var hard_lag_buster = 600000; // In ms, x >= 600000 (10min). Time to activate reconnection routine during hard lagging.
  27. casual_lag_buster += check_delay; // Basic anti-lag security
  28. hard_lag_buster += check_delay;
  29. var refresh_time_limit = 120000; // In ms. Time to auto-refresh. (+ lag_buster in script)
  30. var script_paused = false;
  31. var disconnected = false;
  32. var global_clock_interval = undefined;
  33.  
  34. // Cookies
  35. var cookie_prefix = "DC_auto_refresh_";
  36. var animation_enabled = true; // Enable delay animation
  37. var show_overlay = true; // Show ping overlay
  38. var show_overlay_options = true; // Show options overlay
  39. var full_auto = false; // Do not ask to reload
  40.  
  41. // Overlay
  42. var refresh_interval;
  43. var server_date = new Date(); // Hard lagging from 5:00 to 6:00 GTM + 2
  44. var last_request_send = Date.now(); // Last attempt time
  45. var first_request_send = Date.now(); // First of failed attempts time
  46.  
  47. var alert_messages = new Array();
  48. alert_messages.ask_to_reload = 'Attention, vous semblez avoir été déconnecté. Rechargement de la page dans <span class="seconds">&nbsp;</span> seconde(s) <br><div class="btnTxt abort"><div>Annuler</div></div><div class="btnTxt reload"><div>Recharger</div></div>';
  49. alert_messages.unconnected = 'Attention, vous semblez toujours déconnecté.&nbsp;<div class="btnTxt hide"><div>OK</div></div>';
  50. alert_messages.connected = '<span class="ok_message">Vous semblez avoir été reconnecté.</span>&nbsp;&nbsp;<div class="btnTxt hide"><div>OK</div></div>';
  51.  
  52. $(document).ready( function() {
  53. $('body').append('<style>#auto_refresh {display: block;z-index: 1000000;position: absolute;top: 31px;width: 100%;text-align: center;}#auto_refresh .overlay_container {z-index: 1000001;position: absolute;top: 0px;max-width: 131px;color: white;line-height: 14px;font-size: 10px;}#auto_refresh .overlay, #auto_refresh .overlay_options {float: left;margin-right: 2px;margin-bottom: 1px;max-height: 125px;color: white;background-color: rgba(0, 0, 0, 0.75);line-height: 14px;font-size: 10px;}#auto_refresh .overlay .toggle, #auto_refresh .overlay_options .toggle, #auto_refresh .overlay_options .abort_reload_auto {float: right;padding-left: 5px;padding-right: 5px;width: 6px;border: 1px solid gray;cursor: pointer;}#auto_refresh .overlay_options .abort_reload_auto {display: none;color: red;font-weight: bold;border: 1px solid red;}#auto_refresh .overlay_options .check_box {float: right;width: 14px;height: 100%;background-color: rgba(255,0,0,0.5);box-shadow: inset 0px 0px 0px 1px red;}#auto_refresh .overlay .refresh_delay, #auto_refresh .overlay_options .full_auto , #auto_refresh .overlay_options .reload_auto {float: left;margin-right: 1px;width: 105px;color: back;background-color: transparent;border: 1px solid green;cursor: pointer;}#auto_refresh .overlay_options .full_auto, #auto_refresh .overlay_options .reload_auto {border: 1px solid gray;}#auto_refresh .overlay_options .reload_auto {cursor: default;display: none;}#auto_refresh .overlay .refresh_delay .actual_time {position: absolute;top: 0px;left: 0px;background-color: rgba(0, 255, 0, 0.1);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: 15px;}#auto_refresh .alert .abort, #auto_refresh .alert .reload, #auto_refresh .alert .hide {display: inline-block;margin: 4px;width: 100px;}#auto_refresh .ok_message{color: green;}</style>');
  54. $("body").append('<div id="auto_refresh"><div class="overlay_container"><div class="overlay"><div class="ping refresh_delay" title="Activer/Désactiver animation"><div class="actual_time barre_etat"></div><span class="data">Ping</span> : <span class="seconds">&nbsp;</span> <span class="unit">ms</span></div><div class="toggle" title="Ping">&lt;</div></div><div class="overlay_options"><div class="full_auto" title="Activer/Désactiver notifications"><span class="data">Full auto</span><span class="check_box" value="0">&nbsp;</span></div><div class="toggle" title="Mode full auto">&lt;</div></div><div class="overlay_options"><div class="reload_auto" title="Refresh prévu dans..."><span class="data">Refresh</span> : <span class="seconds">&nbsp;</span> <span class="unit">s</span></div><div class="abort_reload_auto" title="Stopper le refresh prévu">x</div></div></div><div class="alert_container"><div class="alert fakeToolTip"></div></div></div>');
  55. function initialize() {
  56. if(undefined !== getCookie('global')) {
  57. show_overlay = (/overlay_on/gi.test(getCookie('global'))) ? true : false;
  58. show_overlay_options = (/overlay_options_on/gi.test(getCookie('global'))) ? true : false;
  59. animation_enabled = (/delay_anim_on/gi.test(getCookie('global'))) ? true : false;
  60. full_auto = (/full_auto_on/gi.test(getCookie('global'))) ? true : false;
  61. }
  62. else
  63. saveCookie('global','');
  64. if(false === show_overlay) {
  65. $('#auto_refresh .overlay .toggle').html('>');
  66. $('#auto_refresh .overlay .ping').hide();
  67. }
  68. if(false === animation_enabled) {
  69. $('#auto_refresh .animation_enabled .toggle').html('>');
  70. $('#auto_refresh .animation_enabled .full_auto').hide();
  71. }
  72. if(false === show_overlay_options) {
  73. $('#auto_refresh .overlay_options .toggle').html('>');
  74. $('#auto_refresh .overlay_options .full_auto').hide();
  75. if(false === full_auto)
  76. $('#auto_refresh .overlay_options .toggle').css({'borderColor' : 'red'});
  77. else
  78. $('#auto_refresh .overlay_options .toggle').css({'borderColor' : 'green'});
  79. }
  80. if(true === full_auto) {
  81. $('#auto_refresh .overlay_options .full_auto .check_box').css({ 'boxShadow' : 'inset 0px 0px 0px 1px rgba(0, 210, 0,1)',
  82. 'backgroundColor' : 'rgba(0,255,0,0.5)'});
  83. }
  84. }
  85. // Handle alert messages
  86. function show_alert(message) {
  87. // Automatic mode, no alert
  88. if (true === full_auto) {
  89. hide_alert();
  90. return;
  91. }
  92. $('#auto_refresh .alert').html(alert_messages[message]);
  93. // Yes/No alert
  94. if('ask_to_reload' == message) {
  95. // User want to abort, then notify user and pause script
  96. $('#auto_refresh .alert .abort').on('click', function() {
  97. abort_reload();
  98. show_alert('unconnected');
  99. });
  100. // Do reload
  101. $('#auto_refresh .alert .reload').on('click', function() {
  102. do_reload();
  103. });
  104. // Refresh reload countdown
  105. refresh_reload_alert(true);
  106. }
  107. else if ('connected' == message || 'unconnected' == message) {
  108. // hide alert
  109. $('#auto_refresh .alert .hide').on('click', function() {
  110. hide_alert();
  111. });
  112. }
  113. $('#auto_refresh .alert_container').show();
  114. }
  115. function hide_alert() {
  116. $('#auto_refresh .alert_container').hide();
  117. }
  118. // Stop refresh countdown
  119. function abort_reload() {
  120. clearInterval(refresh_interval);
  121. reload_asked = 0;
  122. script_paused = true;
  123. // last_request_completed = Date.now();
  124. }
  125. // Reload window
  126. function do_reload() {
  127. // Useless, but lovely
  128. script_paused = true;
  129. // Click method to avoid form issues
  130. window.location.href = 'http://www.dreadcast.net/Main';
  131. }
  132. // Handle reload events
  133. function handle_reload() {
  134. if(true === script_paused) return;
  135. // If no network activity for a while, reload.
  136. if (Date.now() - last_request_completed >= lag_buster) {
  137. // Delay to refresh
  138. if(0 === reload_asked) {
  139. reload_asked = Date.now();
  140. refresh_reload_auto();
  141. }
  142. // If yes/no alert hidden, show it (fired every seconds in full auto mode)
  143. if (true === full_auto) {
  144. hide_alert();
  145. }
  146. else if (false === $('#auto_refresh .alert .abort').is(':Visible'))
  147. show_alert('ask_to_reload'); // If full auto mode, disabled function
  148. // If waiting asked and done, reload
  149. if (0 !== reload_asked)
  150. if (Date.now() - reload_asked >= refresh_time_limit) {
  151. do_reload();
  152. }
  153. }
  154. }
  155. // Refresh reload countdown
  156. function refresh_reload_alert(forced) {
  157. if (true === forced || true === $('#auto_refresh .alert .seconds').is(':Visible')) {
  158. $('#auto_refresh .alert .seconds').html(Math.round((refresh_time_limit - (Date.now() - reload_asked)) / 1000));
  159. }
  160. }
  161. // Overlay
  162. // Display refreshed ping
  163. function refresh_ping(request_send, request) {
  164. // If connected, refresh values
  165. if (false === disconnected)
  166. first_request_send = request_send;
  167. else {
  168. request = Date.now(); // If disconnected, keep stored data.
  169. request_send = first_request_send;
  170. }
  171. var ping = ((request - request_send) < 0) // During requesting new Check
  172. ? ping
  173. : request - request_send;
  174. if (false === show_overlay) {
  175. if (ping > (check_delay * 2))
  176. $('#auto_refresh .overlay .toggle').css({'borderColor' : 'red'});
  177. return;
  178. }
  179. // Time background-color cheat.
  180. if (ping > (check_delay * 2)) {
  181. $('#auto_refresh .overlay .refresh_delay').css( {'borderColor' : 'red'});
  182. $('#auto_refresh .overlay .actual_time').css( {'width' : '0px'},
  183. {'backgroundColor' : 'rgba(255, 0, 0, 0.2)'});
  184. $('#auto_refresh .overlay .refresh_delay .data').html('Délai');
  185. }
  186. if (true === disconnected) {
  187. ping = Math.round(ping / 100) / 10;
  188. $('#auto_refresh .overlay .refresh_delay .unit').html('s');
  189. }
  190. else
  191. $('#auto_refresh .overlay .refresh_delay .unit').html('ms');
  192. $('#auto_refresh .overlay .ping .seconds').html(ping);
  193. }
  194. // Display refreshed delay animation
  195. function refresh_delay(request, animation_start) {
  196. var animation_progression = 0;
  197. if (undefined === animation_start)
  198. animation_start = 0;
  199. else {
  200. // Percent of animation completion
  201. animation_progression = (request + check_delay - animation_start);
  202. animation_progression = 1 - (animation_progression / check_delay);
  203. }
  204. // Stop animation, then set to new width
  205. $('#auto_refresh .overlay .actual_time').stop();
  206. // Overlay hide, do not animate
  207. if(false === show_overlay) {
  208. $('#auto_refresh .overlay .toggle').css({'borderColor' : 'green'});
  209. return;
  210. }
  211. $('#auto_refresh .overlay .toggle').css({'borderColor' : 'gray'});
  212. $('#auto_refresh .overlay .refresh_delay').css( {'borderColor' : 'green'});
  213. $('#auto_refresh .overlay .actual_time').css( {'width' : (animation_progression * $('#auto_refresh .overlay .refresh_delay').width()) + 'px'},
  214. {'backgroundColor' : 'rgba(0, 255, 0, 0.2)'});
  215. $('#auto_refresh .overlay .refresh_delay .data').html('Ping');
  216. if (false === animation_enabled) return;
  217. // Moving width to 100% at correct speed
  218. $('#auto_refresh .overlay .actual_time').animate(
  219. {width : $('#auto_refresh .overlay .refresh_delay').width()}
  220. , check_delay - (check_delay * animation_progression));
  221. }
  222. function refresh_reload_auto() {
  223. if (0 === reload_asked || true !== full_auto) {
  224. $('#auto_refresh .overlay_options .reload_auto').hide();
  225. $('#auto_refresh .overlay_options .abort_reload_auto').hide();
  226. return;
  227. }
  228. $('#auto_refresh .overlay_options .reload_auto').show();
  229. $('#auto_refresh .overlay_options .abort_reload_auto').show();
  230. $('#auto_refresh .overlay_options .reload_auto .seconds').html(Math.round((refresh_time_limit - (Date.now() - reload_asked)) / 1000));
  231. }
  232. // Toggle delay animation
  233. $('#auto_refresh .overlay .ping').on('click', function() {
  234. animation_enabled = !animation_enabled;
  235. refresh_delay(last_request_completed, Date.now());
  236. // Remove old value and put new value
  237. saveCookie( 'global',
  238. getCookie('global').replace(/(delay_anim_on|delay_anim_off)/gi, '') + ((true === animation_enabled) ? 'delay_anim_on' : 'delay_anim_off'));
  239. });
  240. // Toggle full auto mode
  241. $('#auto_refresh .overlay_options .full_auto').on('click', function() {
  242. full_auto = !full_auto;
  243. if(true === full_auto) {
  244. $('#auto_refresh .overlay_options .full_auto .check_box').css({ 'boxShadow' : 'inset 0px 0px 0px 1px rgba(0, 210, 0,1)',
  245. 'backgroundColor' : 'rgba(0,255,0,0.5)'});
  246. }
  247. else {
  248. $('#auto_refresh .overlay_options .full_auto .check_box').css({ 'boxShadow' : 'inset 0px 0px 0px 1px red',
  249. 'backgroundColor' : 'rgba(255,0,0,0.5)'});
  250. }
  251. script_paused = false;
  252. // Remove old value and put new value
  253. saveCookie( 'global',
  254. getCookie('global').replace(/(full_auto_on|full_auto_off)/gi, '') + ((true === full_auto) ? 'full_auto_on' : 'full_auto_off'));
  255. });
  256. // Toggle overlay
  257. $('#auto_refresh .overlay .toggle').on('click', function() {
  258. $('#auto_refresh .overlay .ping').toggle();
  259. show_overlay = !show_overlay;
  260. if (true === show_overlay) {
  261. $('#auto_refresh .overlay .toggle').html('<');
  262. $('#auto_refresh .overlay .toggle').css({'borderColor' : 'gray'});
  263. }
  264. else {
  265. $('#auto_refresh .overlay .toggle').html('>');
  266. $('#auto_refresh .overlay .toggle').css({'borderColor' : $('#auto_refresh .overlay .refresh_delay').css('borderColor')});
  267. }
  268. if(true === animation_enabled)
  269. refresh_delay(last_request_completed, Date.now());
  270. refresh_ping(last_request_send, last_request_completed);
  271. // Remove old value and put new value
  272. saveCookie( 'global',
  273. getCookie('global').replace(/(overlay_on|overlay_off)/gi, '') + ((true === show_overlay) ? 'overlay_on' : 'overlay_off'));
  274. });
  275. // Toggle overlay options
  276. $('#auto_refresh .overlay_options .toggle').on('click', function() {
  277. $('#auto_refresh .overlay_options .full_auto').toggle(); // full auto option
  278. show_overlay_options = !show_overlay_options;
  279. if (true === show_overlay_options) {
  280. $('#auto_refresh .overlay_options .toggle').css({'borderColor' : 'gray'});
  281. $('#auto_refresh .overlay_options .toggle').html('<');
  282. }
  283. else {
  284. if (true === full_auto)
  285. $('#auto_refresh .overlay_options .toggle').css({'borderColor' : 'green'});
  286. else
  287. $('#auto_refresh .overlay_options .toggle').css({'borderColor' : 'red'});
  288. $('#auto_refresh .overlay_options .toggle').html('>');
  289. }
  290. // Remove old value and put new value
  291. saveCookie( 'global',
  292. getCookie('global').replace(/(overlay_options_on|overlay_options_off)/gi, '') + ((true === show_overlay_options) ? 'overlay_options_on' : 'overlay_options_off'));
  293. });
  294. $('#auto_refresh .overlay_options .abort_reload_auto').on('click', function() {
  295. abort_reload();
  296. refresh_reload_auto();
  297. });
  298. // Global clock
  299. function start_global_clock() {
  300. if(undefined !== global_clock_interval)
  301. clearInterval(global_clock_interval);
  302. global_clock_interval = setInterval(function() {
  303. // In case of hard lagging (5:00 -> 5:59)
  304. lag_buster = (5 == server_date.getHours()) ? hard_lag_buster : casual_lag_buster;
  305. // Alert reload time refresh
  306. refresh_reload_alert();
  307. // Ping refresh
  308. refresh_ping(last_request_send, last_request_completed);
  309. // Reload auto refresh
  310. refresh_reload_auto();
  311. // Countdown to window reload
  312. handle_reload();
  313. }, 1000);
  314. }
  315. // Script start
  316. initialize();
  317. start_global_clock();
  318. // Update last request send time
  319. $(document).ajaxSend( function(a,b,c) {
  320. if(/Check/.test(c.url)) {
  321. last_request_send = Date.now();
  322. }
  323. });
  324. // Update last request time
  325. $(document).ajaxComplete( function(a,b,c) {
  326. if(/Check/.test(c.url)) {
  327. // Refresh server date
  328. server_date = new Date(b.getResponseHeader('Date'));
  329. // If request succeeded
  330. if(b.readyState === 4) {
  331. // If reconnected again connexion, resume script and notify
  332. if($('#auto_refresh .alert').is(':Visible') || true === disconnected) {
  333. show_alert('connected');
  334. // Stop reload
  335. abort_reload();
  336. }
  337. // Resume script
  338. script_paused = false;
  339. disconnected = false;
  340. last_request_completed = Date.now();
  341. // Display new data (better sync)
  342. refresh_delay(last_request_completed);
  343. refresh_reload_auto();
  344. }
  345. else
  346. disconnected = true;
  347. // Display new data (better sync)
  348. refresh_ping(last_request_send, last_request_completed);
  349. }
  350. });
  351. });
  352. // handle cookies
  353. function saveCookie(name,val) {
  354. name = cookie_prefix + name;
  355. if(!navigator.cookieEnabled) return;
  356. document.cookie = name + '=' + val + ';expires=Wed, 01 Jan 2020 00:00:00 GMT; path=/';
  357. }
  358. function getCookie(var_name) {
  359. name = cookie_prefix + var_name;
  360. if(!navigator.cookieEnabled) return undefined;
  361. var start = document.cookie.indexOf(name + '=')
  362. if(start == -1) return undefined;
  363. start += name.length + 1;
  364. var end = document.cookie.indexOf(';',start);
  365. if (end == -1) end = document.cookie.lenght;
  366. return document.cookie.substring(start,end);
  367. };
  368. console.log('DC - Auto Refresh started');